]> granicus.if.org Git - vim/commitdiff
patch 8.2.0109: corrupted text properties when expanding spaces v8.2.0109
authorBram Moolenaar <Bram@vim.org>
Thu, 9 Jan 2020 20:35:48 +0000 (21:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 9 Jan 2020 20:35:48 +0000 (21:35 +0100)
Problem:    Corrupted text properties when expanding spaces.
Solution:   Reallocate the line. (Nobuhiro Takasaki, closes #5457)

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

index d2e45dd2f0e19f803394bd5042e4b98ec7f67e32..8160fe56930ace1d393a4081f58fd3789412f108 100644 (file)
@@ -5604,9 +5604,25 @@ ins_tab(void)
 #ifdef FEAT_PROP_POPUP
                if (!(State & VREPLACE_FLAG))
                {
-                   mch_memmove(ptr, ptr + i, curbuf->b_ml.ml_line_len - i
-                                          - (ptr - curbuf->b_ml.ml_line_ptr));
+                   char_u  *newp;
+                   int     col;
+
+                   newp = alloc(curbuf->b_ml.ml_line_len - i);
+                   if (newp == NULL)
+                       return FALSE;
+
+                   col = ptr - curbuf->b_ml.ml_line_ptr;
+                   if (col > 0)
+                       mch_memmove(newp, ptr - col, col);
+                   mch_memmove(newp + col, ptr + i,
+                                          curbuf->b_ml.ml_line_len - col - i);
+
+                   if (curbuf->b_ml.ml_flags & ML_LINE_DIRTY)
+                       vim_free(curbuf->b_ml.ml_line_ptr);
+                   curbuf->b_ml.ml_line_ptr = newp;
                    curbuf->b_ml.ml_line_len -= i;
+                   curbuf->b_ml.ml_flags =
+                          (curbuf->b_ml.ml_flags | ML_LINE_DIRTY) & ~ML_EMPTY;
                }
                else
 #endif
index 54b42c1467e1893eae7c969dc2b56a6cde49f904..c71f1a7d4dfe3cf99eb463ef13ae3af43ded36c0 100644 (file)
@@ -926,19 +926,32 @@ func Test_proptype_substitute2()
   bwipe!
 endfunc
 
+func SaveOptions()
+  let d = #{tabstop: &tabstop,
+         \ softtabstop: &softtabstop,
+         \ shiftwidth: &shiftwidth,
+         \ expandtab: &expandtab,
+         \ foldmethod: '"' .. &foldmethod .. '"',
+         \ }
+  return d
+endfunc
+
+func RestoreOptions(dict)
+  for name in keys(a:dict)
+    exe 'let &' .. name .. ' = ' .. a:dict[name]
+  endfor
+endfunc
+
 func Test_textprop_noexpandtab()
-  %bwipe!
   new
-  let save_ts = &tabstop
+  let save_dict = SaveOptions()
+
   set tabstop=8
-  let save_sts = &softtabstop
   set softtabstop=4
-  let save_sw = &shiftwidth
   set shiftwidth=4
-  let save_et = &expandtab
   set noexpandtab
-  let save_fdm = &foldmethod
   set foldmethod=marker
+
   call feedkeys("\<esc>\<esc>0Ca\<cr>\<esc>\<up>", "tx")
   call prop_type_add('test', {'highlight': 'ErrorMsg'})
   call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
@@ -955,9 +968,51 @@ func Test_textprop_noexpandtab()
   catch /^Vim\%((\a\+)\)\=:E964/
   endtry
   call prop_remove({'type': 'test'})
-  let &foldmethod = save_fdm
-  let &expandtab = save_et
-  let &shiftwidth = save_sw
-  let &softtabstop = save_sts
-  let &tabstop = save_ts
+  call prop_type_delete('test')
+
+  call RestoreOptions(save_dict)
+  bwipe!
+endfunc
+
+func Test_textprop_noexpandtab_redraw()
+  new
+  let save_dict = SaveOptions()
+
+  set tabstop=8
+  set softtabstop=4
+  set shiftwidth=4
+  set noexpandtab
+  set foldmethod=marker
+
+  call feedkeys("\<esc>\<esc>0Ca\<cr>\<space>\<esc>\<up>", "tx")
+  call prop_type_add('test', {'highlight': 'ErrorMsg'})
+  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
+  call feedkeys("0i\<tab>", "tx")
+  " Internally broken at the next line
+  call feedkeys("A\<left>\<tab>", "tx")
+  redraw
+  " Index calculation failed internally on next line
+  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
+  call prop_remove({'type': 'test', 'all': v:true})
+  call prop_type_delete('test')
+  call prop_type_delete('test')
+
+  call RestoreOptions(save_dict)
+  bwipe!
+endfunc
+
+func Test_textprop_ins_str()
+  new
+  call setline(1, 'just some text')
+  call prop_type_add('test', {'highlight': 'ErrorMsg'})
+  call prop_add(1, 1, {'end_col': 2, 'type': 'test'})
+  call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1))
+
+  call feedkeys("foi\<F8>\<Esc>", "tx")
+  call assert_equal('just s<F8>ome text', getline(1))
+  call assert_equal([{'id': 0, 'col': 1, 'end': 1, 'type': 'test', 'length': 1, 'start': 1}], prop_list(1))
+
+  bwipe!
+  call prop_remove({'type': 'test'})
+  call prop_type_delete('test')
 endfunc
index e06dfc6d1cfdd5e5f2a610e4ab1f14c508902ccd..815fc472af4f12e0feb156dc2944a409efa7b51c 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    109,
 /**/
     108,
 /**/