diff options
Diffstat (limited to 'data/vim/patches/8.1.0636')
-rw-r--r-- | data/vim/patches/8.1.0636 | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0636 b/data/vim/patches/8.1.0636 new file mode 100644 index 000000000..658e123c9 --- /dev/null +++ b/data/vim/patches/8.1.0636 @@ -0,0 +1,319 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0636 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0636 +Problem: line2byte() gives wrong values with text properties. (Bjorn Linse) +Solution: Compute byte offsets differently when text properties were added. + (closes #3718) +Files: src/structs.h, src/textprop.c, src/proto/textprop.pro, + src/memline.c, src/testdir/test_textprop.vim + + +*** ../vim-8.1.0635/src/structs.h 2018-12-24 20:23:39.440716979 +0100 +--- src/structs.h 2018-12-25 21:40:12.265965208 +0100 +*************** +*** 2411,2417 **** + dict_T *b_vars; /* internal variables, local to buffer */ + #endif + #ifdef FEAT_TEXT_PROP +! hashtab_T *b_proptypes; /* text property types local to buffer */ + #endif + + #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) +--- 2411,2418 ---- + dict_T *b_vars; /* internal variables, local to buffer */ + #endif + #ifdef FEAT_TEXT_PROP +! int b_has_textprop; // TRUE when text props were added +! hashtab_T *b_proptypes; // text property types local to buffer + #endif + + #if defined(FEAT_BEVAL) && defined(FEAT_EVAL) +*** ../vim-8.1.0635/src/textprop.c 2018-12-24 23:05:08.546418665 +0100 +--- src/textprop.c 2018-12-25 23:14:13.892679752 +0100 +*************** +*** 17,28 **** +--- 17,32 ---- + * 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,267 **** + length = end_col - col + 1; + else + length = textlen - col + 1; +! if (length > textlen) + length = textlen; // can include the end-of-line + if (length < 1) + length = 1; +--- 265,271 ---- + length = end_col - col + 1; + else + length = textlen - col + 1; +! if (length > (long)textlen) + length = textlen; // can include the end-of-line + if (length < 1) + length = 1; +*************** +*** 308,327 **** + buf->b_ml.ml_flags |= ML_LINE_DIRTY; + } + + 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 +--- 312,322 ---- + buf->b_ml.ml_flags |= ML_LINE_DIRTY; + } + ++ buf->b_has_textprop = TRUE; // this is never reset + redraw_buf_later(buf, NOT_VALID); + } + + /* + * 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,341 **** + size_t textlen; + size_t proplen; + +! // Be quick when no text property types are defined. +! if (!has_any_text_properties(buf)) + return 0; + + // Fetch the line to get the ml_line_len field updated. +--- 329,337 ---- + size_t textlen; + size_t proplen; + +! // 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. +*** ../vim-8.1.0635/src/proto/textprop.pro 2018-12-13 22:17:52.877941474 +0100 +--- src/proto/textprop.pro 2018-12-25 21:49:21.845257609 +0100 +*************** +*** 1,6 **** + /* textprop.c */ + void f_prop_add(typval_T *argvars, typval_T *rettv); +- int has_any_text_properties(buf_T *buf); + int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change); + proptype_T *text_prop_type_by_id(buf_T *buf, int id); + void f_prop_clear(typval_T *argvars, typval_T *rettv); +--- 1,5 ---- +*** ../vim-8.1.0635/src/memline.c 2018-12-16 14:37:35.845271247 +0100 +--- src/memline.c 2018-12-25 23:10:04.682706053 +0100 +*************** +*** 3179,3192 **** + curbuf->b_ml.ml_flags &= ~ML_LINE_DIRTY; + + #ifdef FEAT_TEXT_PROP +! if (has_any_text_properties(curbuf)) + // Need to fetch the old line to copy over any text properties. + ml_get_buf(curbuf, lnum, TRUE); + #endif + } + + #ifdef FEAT_TEXT_PROP +! if (has_any_text_properties(curbuf)) + { + size_t oldtextlen = STRLEN(curbuf->b_ml.ml_line_ptr) + 1; + +--- 3179,3192 ---- + curbuf->b_ml.ml_flags &= ~ML_LINE_DIRTY; + + #ifdef FEAT_TEXT_PROP +! if (curbuf->b_has_textprop) + // Need to fetch the old line to copy over any text properties. + ml_get_buf(curbuf, lnum, TRUE); + #endif + } + + #ifdef FEAT_TEXT_PROP +! if (curbuf->b_has_textprop) + { + size_t oldtextlen = STRLEN(curbuf->b_ml.ml_line_ptr) + 1; + +*************** +*** 5131,5136 **** +--- 5131,5137 ---- + { + int count; /* number of entries in block */ + int idx; ++ int end_idx; + int text_end; + int linecnt; + +*************** +*** 5154,5176 **** + (long)(buf->b_ml.ml_locked_low) + 1; + idx = curline - buf->b_ml.ml_locked_low; + curline = buf->b_ml.ml_locked_high + 1; +! if (idx == 0)/* first line in block, text at the end */ +! text_end = dp->db_txt_end; +! else +! text_end = ((dp->db_index[idx - 1]) & DB_INDEX_MASK); +! /* Compute index of last line to use in this MEMLINE */ + rest = count - idx; + if (linecnt + rest > MLCS_MINL) + { +! idx += MLCS_MINL - linecnt - 1; + linecnt = MLCS_MINL; + } + else + { +! idx = count - 1; + linecnt += rest; + } +! size += text_end - ((dp->db_index[idx]) & DB_INDEX_MASK); + } + buf->b_ml.ml_chunksize[curix].mlcs_numlines = linecnt; + buf->b_ml.ml_chunksize[curix + 1].mlcs_numlines -= linecnt; +--- 5155,5193 ---- + (long)(buf->b_ml.ml_locked_low) + 1; + idx = curline - buf->b_ml.ml_locked_low; + curline = buf->b_ml.ml_locked_high + 1; +! +! // compute index of last line to use in this MEMLINE + rest = count - idx; + if (linecnt + rest > MLCS_MINL) + { +! end_idx = idx + MLCS_MINL - linecnt - 1; + linecnt = MLCS_MINL; + } + else + { +! end_idx = count - 1; + linecnt += rest; + } +! #ifdef FEAT_TEXT_PROP +! if (buf->b_has_textprop) +! { +! int i; +! +! // We cannot use the text pointers to get the text length, +! // the text prop info would also be counted. Go over the +! // lines. +! for (i = end_idx; i < idx; ++i) +! size += STRLEN((char_u *)dp + (dp->db_index[i] & DB_INDEX_MASK)) + 1; +! } +! else +! #endif +! { +! if (idx == 0)/* first line in block, text at the end */ +! text_end = dp->db_txt_end; +! else +! text_end = ((dp->db_index[idx - 1]) & DB_INDEX_MASK); +! size += text_end - ((dp->db_index[end_idx]) & DB_INDEX_MASK); +! } + } + buf->b_ml.ml_chunksize[curix].mlcs_numlines = linecnt; + buf->b_ml.ml_chunksize[curix + 1].mlcs_numlines -= linecnt; +*************** +*** 5360,5366 **** + idx++; + } + } +! len = text_end - ((dp->db_index[idx]) & DB_INDEX_MASK); + size += len; + if (offset != 0 && size >= offset) + { +--- 5377,5396 ---- + idx++; + } + } +! #ifdef FEAT_TEXT_PROP +! if (buf->b_has_textprop) +! { +! int i; +! +! // cannot use the db_index pointer, need to get the actual text +! // lengths. +! len = 0; +! for (i = start_idx; i <= idx; ++i) +! len += STRLEN((char_u *)dp + ((dp->db_index[idx]) & DB_INDEX_MASK)) + 1; +! } +! else +! #endif +! len = text_end - ((dp->db_index[idx]) & DB_INDEX_MASK); + size += len; + if (offset != 0 && size >= offset) + { +*** ../vim-8.1.0635/src/testdir/test_textprop.vim 2018-12-24 23:05:08.546418665 +0100 +--- src/testdir/test_textprop.vim 2018-12-25 22:43:20.588109002 +0100 +*************** +*** 226,230 **** +--- 226,242 ---- + call prop_type_delete('comment') + endfunc + ++ func Test_prop_byteoff() ++ call prop_type_add('comment', {'highlight': 'Directory'}) ++ new ++ call setline(1, ['line1', 'line2', '']) ++ call assert_equal(13, line2byte(3)) ++ call prop_add(1, 1, {'end_col': 3, 'type': 'comment'}) ++ call assert_equal(13, line2byte(3)) ++ ++ bwipe! ++ call prop_type_delete('comment') ++ endfunc ++ + + " TODO: screenshot test with highlighting +*** ../vim-8.1.0635/src/version.c 2018-12-24 23:35:09.119234692 +0100 +--- src/version.c 2018-12-25 23:14:27.288571042 +0100 +*************** +*** 801,802 **** +--- 801,804 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 636, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +44. Your friends no longer send you e-mail...they just log on to your IRC + channel. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |