Mercurial > vim
diff src/textprop.c @ 15255:19e79a1ed6b6 v8.1.0636
patch 8.1.0636: line2byte() gives wrong values with text properties
commit https://github.com/vim/vim/commit/b413d2e6a8cc7b1611a41bfa9462b986393ca5fe
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Dec 25 23:15:46 2018 +0100
patch 8.1.0636: line2byte() gives wrong values with text properties
Problem: line2byte() gives wrong values with text properties. (Bjorn Linse)
Solution: Compute byte offsets differently when text properties were added.
(closes #3718)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 25 Dec 2018 23:30:07 +0100 |
parents | 17525ca95e1e |
children | 2d8225cc1315 |
line wrap: on
line diff
--- a/src/textprop.c +++ b/src/textprop.c @@ -17,12 +17,16 @@ * Text properties have a type, which can be used to specify highlighting. * * TODO: + * - mismatch in column 1 being the first column + * - Let props overrule syntax HL. * - When deleting a line where a prop ended, adjust flag of previous line. * - When deleting a line where a prop started, adjust flag of next line. * - When inserting a line add props that continue from previous line. * - Adjust property column and length when text is inserted/deleted * - Add an arrray for global_proptypes, to quickly lookup a proptype by ID * - Add an arrray for b_proptypes, to quickly lookup a proptype by ID + * - Also test line2byte() with many lines, so that ml_updatechunk() is taken + * into account. * - add mechanism to keep track of changed lines. */ @@ -261,7 +265,7 @@ f_prop_add(typval_T *argvars, typval_T * length = end_col - col + 1; else length = textlen - col + 1; - if (length > textlen) + if (length > (long)textlen) length = textlen; // can include the end-of-line if (length < 1) length = 1; @@ -308,20 +312,11 @@ f_prop_add(typval_T *argvars, typval_T * buf->b_ml.ml_flags |= ML_LINE_DIRTY; } + buf->b_has_textprop = TRUE; // this is never reset redraw_buf_later(buf, NOT_VALID); } /* - * Return TRUE if any text properties are defined globally or for buffer - * "buf". - */ - int -has_any_text_properties(buf_T *buf) -{ - return buf->b_proptypes != NULL || global_proptypes != NULL; -} - -/* * Fetch the text properties for line "lnum" in buffer "buf". * Returns the number of text properties and, when non-zero, a pointer to the * first one in "props" (note that it is not aligned, therefore the char_u @@ -334,8 +329,9 @@ get_text_props(buf_T *buf, linenr_T lnum size_t textlen; size_t proplen; - // Be quick when no text property types are defined. - if (!has_any_text_properties(buf)) + // Be quick when no text property types have been defined or the buffer, + // unless we are adding one. + if (!buf->b_has_textprop && !will_change) return 0; // Fetch the line to get the ml_line_len field updated.