mirror of
https://github.com/vim/vim.git
synced 2025-09-07 22:03:36 -04:00
patch 9.1.0601: Wrong cursor position with 'breakindent' when wide char doesn't fit
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>
This commit is contained in:
parent
99984fc58a
commit
b5d6b5caac
@ -1397,17 +1397,17 @@ win_lbr_chartabsize(
|
|||||||
else if (max_head_vcol > vcol + head_prev + prev_rem)
|
else if (max_head_vcol > vcol + head_prev + prev_rem)
|
||||||
head += (max_head_vcol - (vcol + head_prev + prev_rem)
|
head += (max_head_vcol - (vcol + head_prev + prev_rem)
|
||||||
+ width2 - 1) / width2 * head_mid;
|
+ width2 - 1) / width2 * head_mid;
|
||||||
# ifdef FEAT_PROP_POPUP
|
|
||||||
else if (max_head_vcol < 0)
|
else if (max_head_vcol < 0)
|
||||||
{
|
{
|
||||||
int off = 0;
|
int off = mb_added;
|
||||||
|
# ifdef FEAT_PROP_POPUP
|
||||||
if (*s != NUL
|
if (*s != NUL
|
||||||
&& ((State & MODE_NORMAL) || cts->cts_start_incl))
|
&& ((State & MODE_NORMAL) || cts->cts_start_incl))
|
||||||
off += cts->cts_cur_text_width;
|
off += cts->cts_cur_text_width;
|
||||||
|
# endif
|
||||||
if (off >= prev_rem)
|
if (off >= prev_rem)
|
||||||
head += (1 + (off - prev_rem) / width) * head_mid;
|
head += (1 + (off - prev_rem) / width) * head_mid;
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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|
|
@ -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|
|
@ -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|
|
@ -1165,4 +1165,15 @@ func Test_breakindent_min_with_signcol()
|
|||||||
call s:close_windows()
|
call s:close_windows()
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -280,6 +280,9 @@ func Test_chinese_char_on_wrap_column()
|
|||||||
call s:compare_lines(expect, lines)
|
call s:compare_lines(expect, lines)
|
||||||
call assert_equal(len(expect), winline())
|
call assert_equal(len(expect), winline())
|
||||||
call assert_equal(strwidth(trim(expect[-1], ' ', 2)), wincol())
|
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()
|
call s:close_windows()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@ -315,6 +318,9 @@ func Test_chinese_char_on_wrap_column_sbr()
|
|||||||
call s:compare_lines(expect, lines)
|
call s:compare_lines(expect, lines)
|
||||||
call assert_equal(len(expect), winline())
|
call assert_equal(len(expect), winline())
|
||||||
call assert_equal(strwidth(trim(expect[-1], ' ', 2)), wincol())
|
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()
|
call s:close_windows()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@ -2901,6 +2901,10 @@ func Test_prop_inserts_text_before_double_width_wrap()
|
|||||||
call writefile(lines, 'XscriptPropsBeforeDoubleWidthWrap', 'D')
|
call writefile(lines, 'XscriptPropsBeforeDoubleWidthWrap', 'D')
|
||||||
let buf = RunVimInTerminal('-S XscriptPropsBeforeDoubleWidthWrap', #{rows: 3, cols: 50})
|
let buf = RunVimInTerminal('-S XscriptPropsBeforeDoubleWidthWrap', #{rows: 3, cols: 50})
|
||||||
call VerifyScreenDump(buf, 'Test_prop_inserts_text_before_double_width_wrap_1', {})
|
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)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
601,
|
||||||
/**/
|
/**/
|
||||||
600,
|
600,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user