diff src/edit.c @ 34493:1fa23ccd6d9a v9.1.0153

patch 9.1.0153: Text properties corrupted with fo+=aw and backspace Commit: https://github.com/vim/vim/commit/7ac1145fbebb66dfee325dc5265309877d941c4e Author: zeertzjq <zeertzjq@outlook.com> Date: Wed Mar 6 20:54:22 2024 +0100 patch 9.1.0153: Text properties corrupted with fo+=aw and backspace 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>
author Christian Brabandt <cb@256bit.org>
date Wed, 06 Mar 2024 21:00:11 +0100
parents 67674e379c26
children 80991201ed38
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -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;
-
-		    len = (int)STRLEN(ptr);
+									FALSE);
+		    int	    len = ml_get_curline_len();
+
 		    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);