mirror of
https://github.com/neovim/neovim.git
synced 2025-10-05 17:36:29 +00:00
fix(terminal): do not trim whitespace that is actually in the terminal (#16423)
This commit is contained in:
@@ -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 = 1;
|
|
||||||
}
|
|
||||||
char c = *ptr;
|
|
||||||
ptr += cell_len;
|
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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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|
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user