mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 23:18:33 +00:00
Merge pull request #17155 from zeertzjq/vim-8.2.3121
vim-patch:8.2.{3121,3410}: two 'listchars' fixes
This commit is contained in:
@@ -3720,41 +3720,46 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
|
|||||||
tab_len += n_extra - tab_len;
|
tab_len += n_extra - tab_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if n_extra > 0, it gives the number of chars
|
// If n_extra > 0, it gives the number of chars
|
||||||
// to use for a tab, else we need to calculate the width
|
// to use for a tab, else we need to calculate the width
|
||||||
// for a tab
|
// for a tab.
|
||||||
int len = (tab_len * utf_char2len(wp->w_p_lcs_chars.tab2));
|
int len = (tab_len * utf_char2len(wp->w_p_lcs_chars.tab2));
|
||||||
|
if (wp->w_p_lcs_chars.tab3) {
|
||||||
|
len += utf_char2len(wp->w_p_lcs_chars.tab3);
|
||||||
|
}
|
||||||
if (n_extra > 0) {
|
if (n_extra > 0) {
|
||||||
len += n_extra - tab_len;
|
len += n_extra - tab_len;
|
||||||
}
|
}
|
||||||
c = wp->w_p_lcs_chars.tab1;
|
c = wp->w_p_lcs_chars.tab1;
|
||||||
p = xmalloc(len + 1);
|
p = xmalloc(len + 1);
|
||||||
memset(p, ' ', len);
|
if (p == NULL) {
|
||||||
p[len] = NUL;
|
n_extra = 0;
|
||||||
xfree(p_extra_free);
|
} else {
|
||||||
p_extra_free = p;
|
memset(p, ' ', len);
|
||||||
for (i = 0; i < tab_len; i++) {
|
p[len] = NUL;
|
||||||
if (*p == NUL) {
|
xfree(p_extra_free);
|
||||||
tab_len = i;
|
p_extra_free = p;
|
||||||
break;
|
for (i = 0; i < tab_len; i++) {
|
||||||
}
|
if (*p == NUL) {
|
||||||
int lcs = wp->w_p_lcs_chars.tab2;
|
tab_len = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
int lcs = wp->w_p_lcs_chars.tab2;
|
||||||
|
|
||||||
// if tab3 is given, need to change the char
|
// if tab3 is given, use it for the last char
|
||||||
// for tab
|
if (wp->w_p_lcs_chars.tab3 && i == tab_len - 1) {
|
||||||
if (wp->w_p_lcs_chars.tab3 && i == tab_len - 1) {
|
lcs = wp->w_p_lcs_chars.tab3;
|
||||||
lcs = wp->w_p_lcs_chars.tab3;
|
}
|
||||||
|
p += utf_char2bytes(lcs, p);
|
||||||
|
n_extra += utf_char2len(lcs) - (saved_nextra > 0 ? 1 : 0);
|
||||||
}
|
}
|
||||||
utf_char2bytes(lcs, p);
|
p_extra = p_extra_free;
|
||||||
p += utf_char2len(lcs);
|
|
||||||
n_extra += utf_char2len(lcs) - (saved_nextra > 0 ? 1 : 0);
|
|
||||||
}
|
|
||||||
p_extra = p_extra_free;
|
|
||||||
|
|
||||||
// n_extra will be increased by FIX_FOX_BOGUSCOLS
|
// n_extra will be increased by FIX_FOX_BOGUSCOLS
|
||||||
// macro below, so need to adjust for that here
|
// macro below, so need to adjust for that here
|
||||||
if (vcol_off > 0) {
|
if (vcol_off > 0) {
|
||||||
n_extra -= vcol_off;
|
n_extra -= vcol_off;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4232,6 +4237,7 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
|
|||||||
// Show "extends" character from 'listchars' if beyond the line end and
|
// Show "extends" character from 'listchars' if beyond the line end and
|
||||||
// 'list' is set.
|
// 'list' is set.
|
||||||
if (wp->w_p_lcs_chars.ext != NUL
|
if (wp->w_p_lcs_chars.ext != NUL
|
||||||
|
&& draw_state == WL_LINE
|
||||||
&& wp->w_p_list
|
&& wp->w_p_list
|
||||||
&& !wp->w_p_wrap
|
&& !wp->w_p_wrap
|
||||||
&& filler_todo <= 0
|
&& filler_todo <= 0
|
||||||
@@ -4427,7 +4433,8 @@ static int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool noc
|
|||||||
*/
|
*/
|
||||||
if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns))
|
if ((wp->w_p_rl ? (col < 0) : (col >= grid->Columns))
|
||||||
&& foldinfo.fi_lines == 0
|
&& foldinfo.fi_lines == 0
|
||||||
&& (*ptr != NUL
|
&& (draw_state != WL_LINE
|
||||||
|
|| *ptr != NUL
|
||||||
|| filler_todo > 0
|
|| filler_todo > 0
|
||||||
|| (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL
|
|| (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL
|
||||||
&& p_extra != at_end_str)
|
&& p_extra != at_end_str)
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
" Tests for 'listchars' display with 'list' and :list
|
" Tests for 'listchars' display with 'list' and :list
|
||||||
|
|
||||||
|
source check.vim
|
||||||
source view_util.vim
|
source view_util.vim
|
||||||
|
source screendump.vim
|
||||||
|
|
||||||
func Test_listchars()
|
func Test_listchars()
|
||||||
enew!
|
enew!
|
||||||
@@ -517,4 +519,34 @@ func Test_listchars_window_local()
|
|||||||
set list& listchars&
|
set list& listchars&
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_listchars_foldcolumn()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
call setline(1, ['aaa', '', 'a', 'aaaaaa'])
|
||||||
|
vsplit
|
||||||
|
vsplit
|
||||||
|
windo set signcolumn=yes foldcolumn=1 winminwidth=0 nowrap list listchars=extends:>,precedes:<
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XTest_listchars')
|
||||||
|
|
||||||
|
let buf = RunVimInTerminal('-S XTest_listchars', {'rows': 10, 'cols': 60})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "13\<C-W>>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_listchars_01', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_listchars_02', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_listchars_03', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_listchars_04', {})
|
||||||
|
call term_sendkeys(buf, "\<C-W>>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_listchars_05', {})
|
||||||
|
|
||||||
|
" clean up
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('XTest_listchars')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -69,6 +69,16 @@ func Test_nolinebreak_with_list()
|
|||||||
call s:close_windows()
|
call s:close_windows()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" this was causing a crash
|
||||||
|
func Test_linebreak_with_list_and_tabs()
|
||||||
|
set linebreak list listchars=tab:⇤\ ⇥ tabstop=100
|
||||||
|
new
|
||||||
|
call setline(1, "\t\t\ttext")
|
||||||
|
redraw
|
||||||
|
bwipe!
|
||||||
|
set nolinebreak nolist listchars&vim tabstop=8
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_linebreak_with_nolist()
|
func Test_linebreak_with_nolist()
|
||||||
call s:test_windows('setl nolist')
|
call s:test_windows('setl nolist')
|
||||||
call setline(1, "\t*mask = nil;")
|
call setline(1, "\t*mask = nil;")
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
-- Tests for 'listchars' display with 'list' and :list.
|
-- Tests for 'listchars' display with 'list' and :list.
|
||||||
|
|
||||||
local helpers = require('test.functional.helpers')(after_each)
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
|
local Screen = require('test.functional.ui.screen')
|
||||||
|
local feed, insert, exec = helpers.feed, helpers.insert, helpers.exec
|
||||||
local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
|
local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
|
||||||
|
|
||||||
-- luacheck: ignore 621 (Indentation)
|
-- luacheck: ignore 621 (Indentation)
|
||||||
@@ -13,7 +14,7 @@ describe("'listchars'", function()
|
|||||||
|
|
||||||
-- luacheck: ignore 613 (Trailing whitespace in a string)
|
-- luacheck: ignore 613 (Trailing whitespace in a string)
|
||||||
it("works with 'list'", function()
|
it("works with 'list'", function()
|
||||||
source([[
|
exec([[
|
||||||
function GetScreenCharsForLine(lnum)
|
function GetScreenCharsForLine(lnum)
|
||||||
return join(map(range(1, virtcol('$')), 'nr2char(screenchar(a:lnum, v:val))'), '')
|
return join(map(range(1, virtcol('$')), 'nr2char(screenchar(a:lnum, v:val))'), '')
|
||||||
endfunction
|
endfunction
|
||||||
@@ -98,4 +99,80 @@ describe("'listchars'", function()
|
|||||||
.....h>-$
|
.....h>-$
|
||||||
iii<<<<><<$]])
|
iii<<<<><<$]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('"exceeds" character does not appear in foldcolumn vim-patch:8.2.3121', function()
|
||||||
|
local screen = Screen.new(60, 10)
|
||||||
|
screen:attach()
|
||||||
|
exec([[
|
||||||
|
call setline(1, ['aaa', '', 'a', 'aaaaaa'])
|
||||||
|
vsplit
|
||||||
|
vsplit
|
||||||
|
windo set signcolumn=yes foldcolumn=1 winminwidth=0 nowrap list listchars=extends:>,precedes:<
|
||||||
|
]])
|
||||||
|
feed('13<C-W>>')
|
||||||
|
screen:expect([[
|
||||||
|
aaa │ a>│ ^aaa |
|
||||||
|
│ │ |
|
||||||
|
a │ a │ a |
|
||||||
|
aaaaaa │ a>│ aaaaaa |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
[No Name] [+] <[+] [No Name] [+] |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('<C-W>>')
|
||||||
|
screen:expect([[
|
||||||
|
aaa │ >│ ^aaa |
|
||||||
|
│ │ |
|
||||||
|
a │ a│ a |
|
||||||
|
aaaaaa │ >│ aaaaaa |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
[No Name] [+] <+] [No Name] [+] |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('<C-W>>')
|
||||||
|
screen:expect([[
|
||||||
|
aaa │ │ ^aaa |
|
||||||
|
│ │ |
|
||||||
|
a │ │ a |
|
||||||
|
aaaaaa │ │ aaaaaa |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
[No Name] [+] <] [No Name] [+] |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('<C-W>>')
|
||||||
|
screen:expect([[
|
||||||
|
aaa │ │ ^aaa |
|
||||||
|
│ │ |
|
||||||
|
a │ │ a |
|
||||||
|
aaaaaa │ │ aaaaaa |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
~ │~ │~ |
|
||||||
|
[No Name] [+] < [No Name] [+] |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('<C-W>>')
|
||||||
|
screen:expect([[
|
||||||
|
aaa │ │ ^aaa |
|
||||||
|
│ │ |
|
||||||
|
a │ │ a |
|
||||||
|
aaaaaa │ │ aaaaaa |
|
||||||
|
~ │~│~ |
|
||||||
|
~ │~│~ |
|
||||||
|
~ │~│~ |
|
||||||
|
~ │~│~ |
|
||||||
|
[No Name] [+] < [No Name] [+] |
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Reference in New Issue
Block a user