]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0153: Text properties corrupted with fo+=aw and backspace v9.1.0153
authorzeertzjq <zeertzjq@outlook.com>
Wed, 6 Mar 2024 19:54:22 +0000 (20:54 +0100)
committerChristian Brabandt <cb@256bit.org>
Wed, 6 Mar 2024 19:54:22 +0000 (20:54 +0100)
Problem:  Text properties corrupted with fo+=aw and backspace
Solution: Allocate line and move text properties
          (zeertzjq)

closes: #14147

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/edit.c
src/testdir/test_comments.vim
src/testdir/test_textprop.vim
src/version.c

index d7c80ffcdf336989343ed4f9ccaafed0f8ada744..998647cd8e895ef1239476228b80c0670a24f524 100644 (file)
@@ -4101,12 +4101,30 @@ ins_bs(
                                           && has_format_option(FO_WHITE_PAR))
                {
                    char_u  *ptr = ml_get_buf(curbuf, curwin->w_cursor.lnum,
-                                                                       TRUE);
-                   int     len;
+                                                                       FALSE);
+                   int     len = ml_get_curline_len();
 
-                   len = (int)STRLEN(ptr);
                    if (len > 0 && ptr[len - 1] == ' ')
-                       ptr[len - 1] = NUL;
+                   {
+                       char_u *newp = alloc(curbuf->b_ml.ml_line_len - 1);
+
+                       if (newp != NULL)
+                       {
+                           mch_memmove(newp, ptr, len - 1);
+                           newp[len - 1] = NUL;
+                           if (curbuf->b_ml.ml_line_len > len + 1)
+                               mch_memmove(newp + len, ptr + len + 1,
+                                          curbuf->b_ml.ml_line_len - len - 1);
+
+                           if (curbuf->b_ml.ml_flags
+                                             & (ML_LINE_DIRTY | ML_ALLOCATED))
+                               vim_free(curbuf->b_ml.ml_line_ptr);
+                           curbuf->b_ml.ml_line_ptr = newp;
+                           curbuf->b_ml.ml_line_len--;
+                           curbuf->b_ml.ml_line_textlen--;
+                           curbuf->b_ml.ml_flags |= ML_LINE_DIRTY;
+                       }
+                   }
                }
 
                (void)do_join(2, FALSE, FALSE, FALSE, FALSE);
index c34b85c42d720000807ae5520375fe56d8831ad6..67454f477ef6d22d9b4ba83d63361ba29733b5b4 100644 (file)
@@ -237,6 +237,12 @@ func Test_comment_autoformat()
   call feedkeys("aone\ntwo\n", 'xt')
   call assert_equal(['one', 'two', ''], getline(1, '$'))
 
+  set backspace=indent,eol,start
+  %d
+  call feedkeys("aone \n\<BS>", 'xt')
+  call assert_equal(['one'], getline(1, '$'))
+  set backspace&
+
   close!
 endfunc
 
index 7542c08da1b94f5c37596ad30efebb1065588609..1074b0ca54640e4b7c38d3dbf91666db4a9dd501 100644 (file)
@@ -4466,4 +4466,23 @@ func Test_textprop_notype_join()
   bwipe!
 endfunc
 
+" This was causing text property corruption.
+func Test_textprop_backspace_fo_aw()
+  new
+  call setline(1, 'foobar')
+  call prop_type_add('test', {'highlight': 'ErrorMsg'})
+  call prop_add(1, 1, {'type': 'test', 'length': 3})
+  set backspace=indent,eol,start
+  setlocal formatoptions+=aw
+  call feedkeys("A \<CR>\<BS>\<Esc>", 'tx')
+  call assert_equal('foobar', getline(1))
+  call assert_equal([
+        \ #{id: 0, col: 1, start: 1, end: 1, type_bufnr: 0,
+        \   type: 'test', length: 3}], prop_list(1))
+
+  bwipe!
+  set backspace&
+  call prop_type_delete('test')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index cf0af43043cbdb4e11fc4b2dc1673fb7caf778a6..8ada6585d58cd7867921d3c687610bfe8440f0fa 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    153,
 /**/
     152,
 /**/