]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0601: Wrong cursor position with 'breakindent' when wide char doesn't fit v9.1.0601
authorzeertzjq <zeertzjq@outlook.com>
Thu, 18 Jul 2024 19:13:31 +0000 (21:13 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 18 Jul 2024 19:13:31 +0000 (21:13 +0200)
Problem:  Wrong cursor position with 'breakindent' when a double-width
          character doesn't fit in a screen line (mikoto2000)
Solution: Include the width of the 'breakindent' properly.
          (zeertzjq)

fixes: #15289
closes: #15290

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/charset.c
src/testdir/dumps/Test_breakindent_with_double_width_wrap_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_3.dump [new file with mode: 0644]
src/testdir/test_breakindent.vim
src/testdir/test_listlbr_utf8.vim
src/testdir/test_textprop.vim
src/version.c

index 45b16aa3ab7a9584381919a3d5c0a52e8e90a311..19b089526aac7982cd72418f9c82ad67117f92f2 100644 (file)
@@ -1397,17 +1397,17 @@ win_lbr_chartabsize(
                else if (max_head_vcol > vcol + head_prev + prev_rem)
                    head += (max_head_vcol - (vcol + head_prev + prev_rem)
                                             + width2 - 1) / width2 * head_mid;
-#  ifdef FEAT_PROP_POPUP
                else if (max_head_vcol < 0)
                {
-                   int off = 0;
+                   int off = mb_added;
+#  ifdef FEAT_PROP_POPUP
                    if (*s != NUL
                             && ((State & MODE_NORMAL) || cts->cts_start_incl))
                        off += cts->cts_cur_text_width;
+#  endif
                    if (off >= prev_rem)
                        head += (1 + (off - prev_rem) / width) * head_mid;
                }
-#  endif
            }
        }
 
diff --git a/src/testdir/dumps/Test_breakindent_with_double_width_wrap_1.dump b/src/testdir/dumps/Test_breakindent_with_double_width_wrap_1.dump
new file mode 100644 (file)
index 0000000..7b761bc
--- /dev/null
@@ -0,0 +1,6 @@
+| +0&#ffffff0@7|a@40|>+0#4040ff13&
+| +0#0000000&@7>口*&@2| +&@35
+|~+0#4040ff13&| @48
+|~| @48
+|~| @48
+| +0#0000000&@31|1|,|4|3|-|5|9| @6|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_2.dump b/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_2.dump
new file mode 100644 (file)
index 0000000..6022a16
--- /dev/null
@@ -0,0 +1,3 @@
+|a+0&#ffffff0@39|b+0#e000e06&@8|>+0#4040ff13&
+>口*0#0000000&|1+&|2|3|4|5| @42
+@32|1|,|4|1|-|5|1| @6|A|l@1| 
diff --git a/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_3.dump b/src/testdir/dumps/Test_prop_inserts_text_before_double_width_wrap_3.dump
new file mode 100644 (file)
index 0000000..c033399
--- /dev/null
@@ -0,0 +1,3 @@
+|a+0&#ffffff0@39|b+0#e000e06&@8|>+0#4040ff13&
+|+@2>口*0#0000000&|1+&|2|3|4|5| @39
+|:|s|e|t| |s|h|o|w|b|r|e|a|k|=|+@2| @13|1|,|4|1|-|5|4| @6|A|l@1| 
index 96d91c949ca078c22336988f2d46a9b30b217f08..b306c0207887c4dacd15abaa5a6c151b227dd05e 100644 (file)
@@ -1165,4 +1165,15 @@ func Test_breakindent_min_with_signcol()
   call s:close_windows()
 endfunc
 
+func Test_breakindent_with_double_width_wrap()
+  50vnew
+  setlocal tabstop=8 breakindent nolist
+  call setline(1, "\t" .. repeat('a', winwidth(0) - 9) .. '口口口')
+  normal! $g0
+  call assert_equal(2, winline())
+  call assert_equal(9, wincol())
+
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 313ff30cc41cda435b9ac429a900638c8e741cb5..693f2015fcf9f36ddc989f687ba7b2948c41f170 100644 (file)
@@ -280,6 +280,9 @@ func Test_chinese_char_on_wrap_column()
   call s:compare_lines(expect, lines)
   call assert_equal(len(expect), winline())
   call assert_equal(strwidth(trim(expect[-1], ' ', 2)), wincol())
+  norm! g0
+  call assert_equal(len(expect), winline())
+  call assert_equal(1, wincol())
   call s:close_windows()
 endfunc
 
@@ -315,6 +318,9 @@ func Test_chinese_char_on_wrap_column_sbr()
   call s:compare_lines(expect, lines)
   call assert_equal(len(expect), winline())
   call assert_equal(strwidth(trim(expect[-1], ' ', 2)), wincol())
+  norm! g0
+  call assert_equal(len(expect), winline())
+  call assert_equal(4, wincol())
   call s:close_windows()
 endfunc
 
index 2bf28349d7bf3c950b2da9b4a6cd1e6f213b695e..57277f79e2506e793acc5d349a84681c1dd4861d 100644 (file)
@@ -2901,6 +2901,10 @@ func Test_prop_inserts_text_before_double_width_wrap()
   call writefile(lines, 'XscriptPropsBeforeDoubleWidthWrap', 'D')
   let buf = RunVimInTerminal('-S XscriptPropsBeforeDoubleWidthWrap', #{rows: 3, cols: 50})
   call VerifyScreenDump(buf, 'Test_prop_inserts_text_before_double_width_wrap_1', {})
+  call term_sendkeys(buf, 'g0')
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_before_double_width_wrap_2', {})
+  call term_sendkeys(buf, ":set showbreak=+++\<CR>")
+  call VerifyScreenDump(buf, 'Test_prop_inserts_text_before_double_width_wrap_3', {})
 
   call StopVimInTerminal(buf)
 endfunc
index ae733c82cda531d09acadbcf675140a029bf60d7..5473fe0c435c738f69a874a04465385105712c57 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    601,
 /**/
     600,
 /**/