summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1333
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1333')
-rw-r--r--data/vim/patches/8.1.1333326
1 files changed, 326 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1333 b/data/vim/patches/8.1.1333
new file mode 100644
index 000000000..c279b72c5
--- /dev/null
+++ b/data/vim/patches/8.1.1333
@@ -0,0 +1,326 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.1333
+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.1333
+Problem: Text properties don't always move after changes.
+Solution: Update properties before reporting changes to listeners. Move text
+ property when splitting a line.
+Files: src/change.c, src/ex_cmds.c, src/textprop.c,
+ src/proto/textprop.pro, src/testdir/test_textprop.vim
+
+
+*** ../vim-8.1.1332/src/change.c 2019-05-14 21:20:32.597441034 +0200
+--- src/change.c 2019-05-15 22:14:42.293974215 +0200
+***************
+*** 641,652 ****
+ void
+ inserted_bytes(linenr_T lnum, colnr_T col, int added UNUSED)
+ {
+- changed_bytes(lnum, col);
+-
+ #ifdef FEAT_TEXT_PROP
+ if (curbuf->b_has_textprop && added != 0)
+ adjust_prop_columns(lnum, col, added);
+ #endif
+ }
+
+ /*
+--- 641,652 ----
+ void
+ inserted_bytes(linenr_T lnum, colnr_T col, int added UNUSED)
+ {
+ #ifdef FEAT_TEXT_PROP
+ if (curbuf->b_has_textprop && added != 0)
+ adjust_prop_columns(lnum, col, added);
+ #endif
++
++ changed_bytes(lnum, col);
+ }
+
+ /*
+***************
+*** 2133,2138 ****
+--- 2133,2144 ----
+ )
+ mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L);
+ did_append = TRUE;
++ #ifdef FEAT_TEXT_PROP
++ if ((State & INSERT) && !(State & VREPLACE_FLAG))
++ // properties after the split move to the next line
++ adjust_props_for_split(curwin->w_cursor.lnum, curwin->w_cursor.lnum,
++ curwin->w_cursor.col + 1, 0);
++ #endif
+ }
+ else
+ {
+*** ../vim-8.1.1332/src/ex_cmds.c 2019-05-09 15:12:45.168723969 +0200
+--- src/ex_cmds.c 2019-05-15 22:02:51.794417449 +0200
+***************
+*** 5728,5734 ****
+ last_line = lnum + 1;
+ }
+ #ifdef FEAT_TEXT_PROP
+! adjust_props_for_split(lnum, plen, 1);
+ #endif
+ // all line numbers increase
+ ++sub_firstlnum;
+--- 5728,5734 ----
+ last_line = lnum + 1;
+ }
+ #ifdef FEAT_TEXT_PROP
+! adjust_props_for_split(lnum + 1, lnum, plen, 1);
+ #endif
+ // all line numbers increase
+ ++sub_firstlnum;
+*** ../vim-8.1.1332/src/textprop.c 2019-05-05 16:33:44.490168111 +0200
+--- src/textprop.c 2019-05-15 22:42:36.048949732 +0200
+***************
+*** 8,25 ****
+ */
+
+ /*
+! * Text properties implementation.
+! *
+! * Text properties are attached to the text. They move with the text when
+! * text is inserted/deleted.
+! *
+! * Text properties have a user specified ID number, which can be unique.
+! * Text properties have a type, which can be used to specify highlighting.
+ *
+ * TODO:
+ * - When using 'cursorline' attributes should be merged. (#3912)
+ * - Adjust text property column and length when text is inserted/deleted.
+ * -> a :substitute with a multi-line match
+ * -> search for changed_bytes() from misc1.c
+ * - Perhaps we only need TP_FLAG_CONT_NEXT and can drop TP_FLAG_CONT_PREV?
+ * - Add an arrray for global_proptypes, to quickly lookup a prop type by ID
+--- 8,22 ----
+ */
+
+ /*
+! * Text properties implementation. See ":help text-properties".
+ *
+ * TODO:
+ * - When using 'cursorline' attributes should be merged. (#3912)
+ * - Adjust text property column and length when text is inserted/deleted.
++ * -> splitting a line can create a zero-length property. Don't highlight it
++ * and extend it when inserting text.
+ * -> a :substitute with a multi-line match
++ * -> join two lines, also with BS in Insert mode
+ * -> search for changed_bytes() from misc1.c
+ * - Perhaps we only need TP_FLAG_CONT_NEXT and can drop TP_FLAG_CONT_PREV?
+ * - Add an arrray for global_proptypes, to quickly lookup a prop type by ID
+***************
+*** 28,35 ****
+ * the index, like DB_MARKED?
+ * - Also test line2byte() with many lines, so that ml_updatechunk() is taken
+ * into account.
+- * - Add mechanism to keep track of changed lines, so that plugin can update
+- * text properties in these.
+ * - Perhaps have a window-local option to disable highlighting from text
+ * properties?
+ */
+--- 25,30 ----
+***************
+*** 1033,1044 ****
+
+ /*
+ * Adjust text properties for a line that was split in two.
+! * "lnum" is the newly inserted line. The text properties are now on the line
+! * below it. "kept" is the number of bytes kept in the first line, while
+ * "deleted" is the number of bytes deleted.
+ */
+ void
+! adjust_props_for_split(linenr_T lnum, int kept, int deleted)
+ {
+ char_u *props;
+ int count;
+--- 1028,1044 ----
+
+ /*
+ * Adjust text properties for a line that was split in two.
+! * "lnum_props" is the line that has the properties from before the split.
+! * "lnum_top" is the top line.
+! * "kept" is the number of bytes kept in the first line, while
+ * "deleted" is the number of bytes deleted.
+ */
+ void
+! adjust_props_for_split(
+! linenr_T lnum_props,
+! linenr_T lnum_top,
+! int kept,
+! int deleted)
+ {
+ char_u *props;
+ int count;
+***************
+*** 1049,1059 ****
+
+ if (!curbuf->b_has_textprop)
+ return;
+! count = get_text_props(curbuf, lnum + 1, &props, FALSE);
+ ga_init2(&prevprop, sizeof(textprop_T), 10);
+ ga_init2(&nextprop, sizeof(textprop_T), 10);
+
+- // Get the text properties, which are at "lnum + 1".
+ // Keep the relevant ones in the first line, reducing the length if needed.
+ // Copy the ones that include the split to the second line.
+ // Move the ones after the split to the second line.
+--- 1049,1060 ----
+
+ if (!curbuf->b_has_textprop)
+ return;
+!
+! // Get the text properties from "lnum_props".
+! count = get_text_props(curbuf, lnum_props, &props, FALSE);
+ ga_init2(&prevprop, sizeof(textprop_T), 10);
+ ga_init2(&nextprop, sizeof(textprop_T), 10);
+
+ // Keep the relevant ones in the first line, reducing the length if needed.
+ // Copy the ones that include the split to the second line.
+ // Move the ones after the split to the second line.
+***************
+*** 1089,1098 ****
+ }
+ }
+
+! set_text_props(lnum, prevprop.ga_data, prevprop.ga_len * sizeof(textprop_T));
+ ga_clear(&prevprop);
+!
+! set_text_props(lnum + 1, nextprop.ga_data, nextprop.ga_len * sizeof(textprop_T));
+ ga_clear(&nextprop);
+ }
+
+--- 1090,1100 ----
+ }
+ }
+
+! set_text_props(lnum_top, prevprop.ga_data,
+! prevprop.ga_len * sizeof(textprop_T));
+ ga_clear(&prevprop);
+! set_text_props(lnum_top + 1, nextprop.ga_data,
+! nextprop.ga_len * sizeof(textprop_T));
+ ga_clear(&nextprop);
+ }
+
+*** ../vim-8.1.1332/src/proto/textprop.pro 2019-01-04 23:09:45.249360567 +0100
+--- src/proto/textprop.pro 2019-05-15 22:05:41.925276920 +0200
+***************
+*** 14,18 ****
+ void clear_global_prop_types(void);
+ void clear_buf_prop_types(buf_T *buf);
+ void adjust_prop_columns(linenr_T lnum, colnr_T col, int bytes_added);
+! void adjust_props_for_split(linenr_T lnum, int kept, int deleted);
+ /* vim: set ft=c : */
+--- 14,18 ----
+ void clear_global_prop_types(void);
+ void clear_buf_prop_types(buf_T *buf);
+ void adjust_prop_columns(linenr_T lnum, colnr_T col, int bytes_added);
+! void adjust_props_for_split(linenr_T lnum_props, linenr_T lnum_top, int kept, int deleted);
+ /* vim: set ft=c : */
+*** ../vim-8.1.1332/src/testdir/test_textprop.vim 2019-05-05 15:47:37.825923529 +0200
+--- src/testdir/test_textprop.vim 2019-05-15 22:41:42.505209936 +0200
+***************
+*** 151,156 ****
+--- 151,157 ----
+
+ func SetupOneLine()
+ call setline(1, 'xonex xtwoxx')
++ normal gg0
+ call AddPropTypes()
+ call prop_add(1, 2, {'length': 3, 'id': 11, 'type': 'one'})
+ call prop_add(1, 8, {'length': 3, 'id': 12, 'type': 'two'})
+***************
+*** 271,276 ****
+--- 272,337 ----
+ bwipe!
+ set bs&
+ endfunc
++
++ func Test_prop_open_line()
++ new
++
++ " open new line, props stay in top line
++ let expected = SetupOneLine() " 'xonex xtwoxx'
++ exe "normal o\<Esc>"
++ call assert_equal('xonex xtwoxx', getline(1))
++ call assert_equal('', getline(2))
++ call assert_equal(expected, prop_list(1))
++ call DeletePropTypes()
++
++ " move all props to next line
++ let expected = SetupOneLine() " 'xonex xtwoxx'
++ exe "normal 0i\<CR>\<Esc>"
++ call assert_equal('', getline(1))
++ call assert_equal('xonex xtwoxx', getline(2))
++ call assert_equal(expected, prop_list(2))
++ call DeletePropTypes()
++
++ " split just before prop, move all props to next line
++ let expected = SetupOneLine() " 'xonex xtwoxx'
++ exe "normal 0li\<CR>\<Esc>"
++ call assert_equal('x', getline(1))
++ call assert_equal('onex xtwoxx', getline(2))
++ let expected[0].col -= 1
++ let expected[1].col -= 1
++ call assert_equal(expected, prop_list(2))
++ call DeletePropTypes()
++
++ " split inside prop, split first prop
++ let expected = SetupOneLine() " 'xonex xtwoxx'
++ exe "normal 0lli\<CR>\<Esc>"
++ call assert_equal('xo', getline(1))
++ call assert_equal('nex xtwoxx', getline(2))
++ let exp_first = [deepcopy(expected[0])]
++ let exp_first[0].length = 1
++ call assert_equal(exp_first, prop_list(1))
++ let expected[0].col = 1
++ let expected[0].length = 2
++ let expected[1].col -= 2
++ call assert_equal(expected, prop_list(2))
++ call DeletePropTypes()
++
++ " split just after first prop, empty prop and second prop move to next line
++ let expected = SetupOneLine() " 'xonex xtwoxx'
++ exe "normal 0fea\<CR>\<Esc>"
++ call assert_equal('xone', getline(1))
++ call assert_equal('x xtwoxx', getline(2))
++ let exp_first = expected[0:0]
++ call assert_equal(exp_first, prop_list(1))
++ let expected[0].col = 1
++ let expected[0].length = 0
++ let expected[1].col -= 4
++ call assert_equal(expected, prop_list(2))
++ call DeletePropTypes()
++
++ bwipe!
++ set bs&
++ endfunc
+
+ func Test_prop_clear()
+ new
+*** ../vim-8.1.1332/src/version.c 2019-05-14 21:20:32.597441034 +0200
+--- src/version.c 2019-05-15 22:44:49.468290481 +0200
+***************
+*** 769,770 ****
+--- 769,772 ----
+ { /* Add new patch number below this line */
++ /**/
++ 1333,
+ /**/
+
+--
+BLACK KNIGHT: I'm invincible!
+ARTHUR: You're a looney.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// 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 ///