mirror of
https://github.com/neovim/neovim.git
synced 2025-11-29 21:50:38 +00:00
Note some bugs were judged to have too ugly a fix to solve, tests to
demonstrate these problems, and the explanation behind not fixing them
are below.
describe('register . problems', function()
before_each(reset)
-- The difficulty here is: The basic requirement is that the text
-- inserted is treated as if it were typed in insert mode. This is why
-- the paste method is to enter insert mode and enter the ". register
-- into readbuf1.
-- We can't add a count into the readbuf here because the insert mode
-- count is implemented with readbuf2 which is checked for characters
-- after readbuf1.
-- Hence, the ".gp command (which adds extra characters into readbuf1
-- to emulate leaving the cursor after the text by moving the cursor
-- after inserting the text) would insert the motion characters into
-- the buffer instead of using them to move after the insert has been
-- done.
-- I could probably get this working properly with a special flag put
-- into start_redo_ins() and set in do_put(), but I think this adds
-- much more complexity than fixing this bug justifies.
pending('should not change the ". register with ".2p', function()
local orig_register = funcs.getreg('.')
feed('2".p')
eq(orig_register, funcs.getreg('.'))
end)
describe("cursor positioning after undo and redo with '.'", function()
before_each(reset)
local function make_cursor_test(macro_string)
return function()
feed(macro_string)
local afterpos = funcs.getcurpos()
local orig_string = curbuf_contents()
feed('u.')
eq(afterpos, funcs.getcurpos())
expect(orig_string)
end
end
-- The difficulty here is: setting the cursor after the end of the
-- pasted text is done by adding a motion command to the
-- stuffbuffer after the insert.
-- Modifying 'redobuff' is done in the code that handles inserting
-- text and moving around.
-- I could add a special case in ins_esc() that checks for a flag
-- set in do_put() to add the motion character to the redo buffer,
-- but I think that is starting to get way too convoluted for the
-- benefit.
pending('should be the same after ".gp and ".gpu.',
make_cursor_test('".gp'))
-- The difficulty here is: putting forwards is implemented by using
-- 'a' instead of 'i' to start insert.
-- Undoing with 'u' an insert that began with 'a' leaves the cursor
-- where the first character was inserted, not where the cursor was
-- when the 'a' was pressed.
-- We account for this the first time by saving the cursor position
-- in do_put(), but this isn't stored in redobuff for a second time
-- around.
-- We can't change how such a fundamental action as undo after
-- inserting with 'a' behaves, we could add in a special case
-- whereby we set a flag in do_put() and read it when entering
-- insert mode but this seems like way too much to fix such a minor
-- bug.
pending('should be the same after ".pu. and ".pu.u.',
make_cursor_test('".pu.'))
end)
end)
This commit is contained in:
@@ -1517,10 +1517,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
|
||||
coladvance(curwin->w_curswant);
|
||||
}
|
||||
cap->count0 = redo_VIsual_count;
|
||||
if (redo_VIsual_count != 0)
|
||||
cap->count1 = redo_VIsual_count;
|
||||
else
|
||||
cap->count1 = 1;
|
||||
cap->count1 = (cap->count0 == 0 ? 1 : cap->count0);
|
||||
} else if (VIsual_active) {
|
||||
if (!gui_yank) {
|
||||
/* Save the current VIsual area for '< and '> marks, and "gv" */
|
||||
@@ -7727,16 +7724,22 @@ static void nv_put(cmdarg_T *cap)
|
||||
savereg = copy_register(regname);
|
||||
}
|
||||
|
||||
/* Now delete the selected text. */
|
||||
cap->cmdchar = 'd';
|
||||
cap->nchar = NUL;
|
||||
cap->oap->regname = NUL;
|
||||
nv_operator(cap);
|
||||
do_pending_operator(cap, 0, false);
|
||||
empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
|
||||
// To place the cursor correctly after a blockwise put, and to leave the
|
||||
// text in the correct position when putting over a selection with
|
||||
// 'virtualedit' and past the end of the line, we use the 'c' operator in
|
||||
// do_put(), which requires the visual selection to still be active.
|
||||
if (!VIsual_active || VIsual_mode == 'V' || regname != '.') {
|
||||
// Now delete the selected text.
|
||||
cap->cmdchar = 'd';
|
||||
cap->nchar = NUL;
|
||||
cap->oap->regname = NUL;
|
||||
nv_operator(cap);
|
||||
do_pending_operator(cap, 0, false);
|
||||
empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
|
||||
|
||||
/* delete PUT_LINE_BACKWARD; */
|
||||
cap->oap->regname = regname;
|
||||
// delete PUT_LINE_BACKWARD;
|
||||
cap->oap->regname = regname;
|
||||
}
|
||||
|
||||
/* When deleted a linewise Visual area, put the register as
|
||||
* lines to avoid it joined with the next line. When deletion was
|
||||
|
||||
Reference in New Issue
Block a user