API: nvim_put: always PUT_CURSEND

Fixes strange behavior where sometimes the buffer contents of a series
of paste chunks (vim._paste) would be out-of-order.

Now the tui_spec.lua screen-tests are much more reliable. But they still
sometimes fail because of off-by-one cursor (caused by "typeahead race"
resulting in wrong mode; fixed later in this patch-series).
This commit is contained in:
Justin M. Keyes
2019-08-20 22:41:21 +02:00
parent 1fdae25b2b
commit 613296936b
3 changed files with 16 additions and 10 deletions

View File

@@ -1249,13 +1249,7 @@ void nvim_put(ArrayOf(String) lines, String type, Boolean direction,
finish_yankreg_from_object(reg, false); finish_yankreg_from_object(reg, false);
bool VIsual_was_active = VIsual_active; bool VIsual_was_active = VIsual_active;
int flags = 0; int flags = PUT_CURSEND;
if (State & INSERT) {
flags |= PUT_CURSEND;
} else if (VIsual_active) {
// TODO: fix VIsual when cursor is before, or emulate the delete as well
flags |= lt(VIsual, curwin->w_cursor) ? PUT_CURSEND : 0;
}
msg_silent++; // Avoid "N more lines" message. msg_silent++; // Avoid "N more lines" message.
do_put(0, reg, direction ? BACKWARD : FORWARD, 1, flags); do_put(0, reg, direction ? BACKWARD : FORWARD, 1, flags);
msg_silent--; msg_silent--;

View File

@@ -382,6 +382,7 @@ describe('API', function()
line 1 line 1
line 2 line 2
line 3]]) line 3]])
command('1')
-- blockwise -- blockwise
nvim('put', {'AA','BB'}, 'b', false) nvim('put', {'AA','BB'}, 'b', false)
expect([[ expect([[

View File

@@ -190,9 +190,16 @@ describe('TUI', function()
end) end)
it('paste: exactly 64 bytes #10311', function() it('paste: exactly 64 bytes #10311', function()
local expected = string.rep('z', 64)
-- "bracketed paste" -- "bracketed paste"
feed_data('i\027[200~'..string.rep('z', 64)..'\027[201~') feed_data('i\027[200~'..expected..'\027[201~')
feed_data(' end') feed_data(' end')
expected = expected..' end'
retry(nil, nil, function()
local _, buflines = child_session:request(
'nvim_buf_get_lines', 0, 0, -1, false)
eq({expected}, buflines)
end)
screen:expect([[ screen:expect([[
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz| zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz|
zzzzzzzzzzzzzz end{1: } | zzzzzzzzzzzzzz end{1: } |
@@ -210,9 +217,13 @@ describe('TUI', function()
for i = 1, 3000 do for i = 1, 3000 do
t[i] = 'item ' .. tostring(i) t[i] = 'item ' .. tostring(i)
end end
local expected = table.concat(t, '\n')
-- "bracketed paste" -- "bracketed paste"
feed_data('i\027[200~'..expected..'\027[201~') feed_data('i\027[200~'..table.concat(t, '\n')..'\027[201~')
retry(nil, nil, function()
local _, buflines = child_session:request(
'nvim_buf_get_lines', 0, 0, -1, false)
eq(t, buflines)
end)
feed_data(' end') feed_data(' end')
screen:expect([[ screen:expect([[
item 2997 | item 2997 |