]> granicus.if.org Git - vim/commitdiff
patch 8.1.2216: text property in wrong place after :substitute v8.1.2216
authorBram Moolenaar <Bram@vim.org>
Fri, 25 Oct 2019 20:13:29 +0000 (22:13 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 25 Oct 2019 20:13:29 +0000 (22:13 +0200)
Problem:    Text property in wrong place after :substitute.
Solution:   Pass the new column instead of the old one. (Christian Brabandt,
            closes #4427)

src/ex_cmds.c
src/testdir/test_textprop.vim
src/version.c

index e472c8a6fc84d54a1decdd3f8d526341f402451b..7153606282a2287dfb1ac208a44c47db5ae2e791 100644 (file)
@@ -3856,6 +3856,7 @@ do_sub(exarg_T *eap)
            colnr_T     matchcol;
            colnr_T     prev_matchcol = MAXCOL;
            char_u      *new_end, *new_start = NULL;
+           colnr_T     total_added =  0;
            unsigned    new_start_len = 0;
            char_u      *p1;
            int         did_sub = FALSE;
@@ -4279,13 +4280,18 @@ do_sub(exarg_T *eap)
 #ifdef FEAT_TEXT_PROP
                    if (curbuf->b_has_textprop)
                    {
+                       int bytes_added = sublen - 1 - (regmatch.endpos[0].col
+                                                  - regmatch.startpos[0].col);
+
                        // When text properties are changed, need to save for
                        // undo first, unless done already.
-                       if (adjust_prop_columns(lnum, regmatch.startpos[0].col,
-                             sublen - 1 - (regmatch.endpos[0].col
-                                                  - regmatch.startpos[0].col),
-                                                                   apc_flags))
+                       if (adjust_prop_columns(lnum,
+                                       total_added + regmatch.startpos[0].col,
+                                                      bytes_added, apc_flags))
                            apc_flags &= ~APC_SAVE_FOR_UNDO;
+                       // Offset for column byte number of the text property
+                       // in the resulting buffer afterwards.
+                       total_added += bytes_added;
                    }
 #endif
                }
index 54cf5f3c7dede82c6048f919500b60bd14565e28..b09e1a7973ce34b1807c364c3ef6bcdb819d7aa8 100644 (file)
@@ -866,3 +866,31 @@ func Test_textprop_in_unloaded_buf()
   cal delete('Xaaa')
   cal delete('Xbbb')
 endfunc
+
+func Test_proptype_substitute2()
+  new
+  " text_prop.vim
+  call setline(1, [
+        \ 'The   num  123 is smaller than 4567.',
+        \ '123 The number 123 is smaller than 4567.',
+        \ '123 The number 123 is smaller than 4567.'])
+
+  call prop_type_add('number', {'highlight': 'ErrorMsg'})
+
+  call prop_add(1, 12, {'length': 3, 'type': 'number'})
+  call prop_add(2, 1, {'length': 3, 'type': 'number'})
+  call prop_add(3, 36, {'length': 4, 'type': 'number'})
+  set ul&
+  let expected = [{'id': 0, 'col': 13, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}, 
+        \ {'id': 0, 'col': 1, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}, 
+        \ {'id': 0, 'col': 50, 'end': 1, 'type': 'number', 'length': 4, 'start': 1}]
+  " Add some text in between
+  %s/\s\+/   /g
+  call assert_equal(expected, prop_list(1) + prop_list(2) + prop_list(3)) 
+
+  " remove some text
+  :1s/[a-z]\{3\}//g
+  let expected = [{'id': 0, 'col': 10, 'end': 1, 'type': 'number', 'length': 3, 'start': 1}]
+  call assert_equal(expected, prop_list(1))
+  bwipe!
+endfunc
index b30faa75693af64dc73ec62c46f87118bd1dde96..c95f30583c4e4f22a1b1888b9660195d008efd68 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2216,
 /**/
     2215,
 /**/