fix(terminal): do not trim whitespace that is actually in the terminal (#16423)

This commit is contained in:
zeertzjq
2022-05-17 21:09:28 +08:00
committed by GitHub
parent bbfc4567df
commit f49699737c
4 changed files with 66 additions and 15 deletions

View File

@@ -1374,26 +1374,21 @@ static void fetch_row(Terminal *term, int row, int end_col)
while (col < end_col) { while (col < end_col) {
VTermScreenCell cell; VTermScreenCell cell;
fetch_cell(term, row, col, &cell); fetch_cell(term, row, col, &cell);
int cell_len = 0;
if (cell.chars[0]) { if (cell.chars[0]) {
int cell_len = 0;
for (int i = 0; cell.chars[i]; i++) { for (int i = 0; cell.chars[i]; i++) {
cell_len += utf_char2bytes((int)cell.chars[i], ptr + cell_len); cell_len += utf_char2bytes((int)cell.chars[i], ptr + cell_len);
} }
} else { ptr += cell_len;
*ptr = ' ';
cell_len = 1;
}
char c = *ptr;
ptr += cell_len;
if (c != ' ') {
// only increase the line length if the last character is not whitespace
line_len = (size_t)(ptr - term->textbuf); line_len = (size_t)(ptr - term->textbuf);
} else {
*ptr++ = ' ';
} }
col += cell.width; col += cell.width;
} }
// trim trailing whitespace // end of line
term->textbuf[line_len] = 0; term->textbuf[line_len] = NUL;
} }
static bool fetch_cell(Terminal *term, int row, int col, VTermScreenCell *cell) static bool fetch_cell(Terminal *term, int row, int col, VTermScreenCell *cell)

View File

@@ -785,7 +785,8 @@ describe('API: buffer events:', function()
local function lines_subset(first, second) local function lines_subset(first, second)
for i = 1,#first do for i = 1,#first do
if first[i] ~= second[i] then -- need to ignore trailing spaces
if first[i]:gsub(' +$', '') ~= second[i]:gsub(' +$', '') then
return false return false
end end
end end

View File

@@ -496,12 +496,13 @@ describe('sysinit', function()
it('fixed hang issue with -D (#12647)', function() it('fixed hang issue with -D (#12647)', function()
if helpers.pending_win32(pending) then return end if helpers.pending_win32(pending) then return end
local screen local screen
screen = Screen.new(60, 6) screen = Screen.new(60, 7)
screen:attach() screen:attach()
command([[let g:id = termopen('"]]..nvim_prog.. command([[let g:id = termopen('"]]..nvim_prog..
[[" -u NONE -i NONE --cmd "set noruler" -D')]]) [[" -u NONE -i NONE --cmd "set noruler" -D')]])
screen:expect([[ screen:expect([[
^ | ^ |
|
Entering Debug mode. Type "cont" to continue. | Entering Debug mode. Type "cont" to continue. |
cmd: augroup nvim_terminal | cmd: augroup nvim_terminal |
> | > |
@@ -512,6 +513,7 @@ describe('sysinit', function()
screen:expect([[ screen:expect([[
^ | ^ |
~ | ~ |
~ |
[No Name] | [No Name] |
| |
<" -u NONE -i NONE --cmd "set noruler" -D 1,0-1 All| <" -u NONE -i NONE --cmd "set noruler" -D 1,0-1 All|

View File

@@ -5,6 +5,7 @@ local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
local nvim_dir, command = helpers.nvim_dir, helpers.command local nvim_dir, command = helpers.nvim_dir, helpers.command
local nvim_prog = helpers.nvim_prog local nvim_prog = helpers.nvim_prog
local eq, eval = helpers.eq, helpers.eval local eq, eval = helpers.eq, helpers.eval
local matches = helpers.matches
local feed_command = helpers.feed_command local feed_command = helpers.feed_command
local hide_cursor = thelpers.hide_cursor local hide_cursor = thelpers.hide_cursor
local show_cursor = thelpers.show_cursor local show_cursor = thelpers.show_cursor
@@ -177,7 +178,6 @@ describe('cursor with customized highlighting', function()
end) end)
describe('buffer cursor position is correct in terminal without number column', function() describe('buffer cursor position is correct in terminal without number column', function()
if helpers.pending_win32(pending) then return end
local screen local screen
local function setup_ex_register(str) local function setup_ex_register(str)
@@ -525,10 +525,36 @@ describe('buffer cursor position is correct in terminal without number column',
eq({6, 1}, eval('nvim_win_get_cursor(0)')) eq({6, 1}, eval('nvim_win_get_cursor(0)'))
end) end)
end) end)
it('at the end of a line with trailing spaces #16234', function()
setup_ex_register('aaaaaaaa ')
feed('<C-R>r')
screen:expect([[
|
|
|
|
Entering Ex mode. Type "visual" to go to Normal mode. |
:aaaaaaaa {1: } |
{3:-- TERMINAL --} |
]])
matches('^:aaaaaaaa ', eval('nvim_get_current_line()'))
eq({6, 13}, eval('nvim_win_get_cursor(0)'))
feed([[<C-\><C-N>]])
screen:expect([[
|
|
|
|
Entering Ex mode. Type "visual" to go to Normal mode. |
:aaaaaaaa ^ {2: } |
|
]])
eq({6, 12}, eval('nvim_win_get_cursor(0)'))
end)
end) end)
describe('buffer cursor position is correct in terminal with number column', function() describe('buffer cursor position is correct in terminal with number column', function()
if helpers.pending_win32(pending) then return end
local screen local screen
local function setup_ex_register(str) local function setup_ex_register(str)
@@ -879,4 +905,31 @@ describe('buffer cursor position is correct in terminal with number column', fun
eq({6, 1}, eval('nvim_win_get_cursor(0)')) eq({6, 1}, eval('nvim_win_get_cursor(0)'))
end) end)
end) end)
it('at the end of a line with trailing spaces #16234', function()
setup_ex_register('aaaaaaaa ')
feed('<C-R>r')
screen:expect([[
{7: 1 } |
{7: 2 } |
{7: 3 } |
{7: 4 } |
{7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
{7: 6 }:aaaaaaaa {1: } |
{3:-- TERMINAL --} |
]])
matches('^:aaaaaaaa ', eval('nvim_get_current_line()'))
eq({6, 13}, eval('nvim_win_get_cursor(0)'))
feed([[<C-\><C-N>]])
screen:expect([[
{7: 1 } |
{7: 2 } |
{7: 3 } |
{7: 4 } |
{7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
{7: 6 }:aaaaaaaa ^ {2: } |
|
]])
eq({6, 12}, eval('nvim_win_get_cursor(0)'))
end)
end) end)