mirror of
https://github.com/neovim/neovim.git
synced 2025-09-07 03:48:18 +00:00
feat(editor)!: insert-mode ctrl-r should work like paste #35477
Problem: insert-mode ctrl-r input is treated like raw user input, which is almost never useful. This means any newlines in the input are affected by autoindent, etc., which is: - slow - usually breaks the formatting of the input Solution: - ctrl-r should be treated like a paste, not user-input. - does not affect `<c-r>=`, so `<c-r>=@x` can still be used to get the old behavior. Co-authored-by: Justin M. Keyes <justinkz@gmail.com> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
@@ -142,13 +142,16 @@ CTRL-R {register} *c_CTRL-R* *c_<C-R>*
|
|||||||
typing CTRL-R and the second character '"' will be displayed
|
typing CTRL-R and the second character '"' will be displayed
|
||||||
to indicate that you are expected to enter the name of a
|
to indicate that you are expected to enter the name of a
|
||||||
register.
|
register.
|
||||||
The text is inserted as if you typed it, but mappings and
|
When used with named or clipboard registers (A-Z,a-z,0-9,+)
|
||||||
abbreviations are not used. Command-line completion through
|
text is inserted literally like pasting with "p". For other
|
||||||
'wildchar' is not triggered though. And characters that end
|
registers, the text is inserted as if you typed it, but
|
||||||
the command line are inserted literally (<Esc>, <CR>, <NL>,
|
mappings and abbreviations are not used. Command-line
|
||||||
<C-C>). A <BS> or CTRL-W could still end the command line
|
completion through 'wildchar' is not triggered though. And
|
||||||
though, and remaining characters will then be interpreted in
|
characters that end the command line are inserted literally
|
||||||
another mode, which might not be what you intended.
|
(<Esc>, <CR>, <NL>, <C-C>). A <BS> or CTRL-W could still end
|
||||||
|
the command line though, and remaining characters will then be
|
||||||
|
interpreted in another mode, which might not be what you
|
||||||
|
intended.
|
||||||
Special registers:
|
Special registers:
|
||||||
'"' the unnamed register, containing the text of
|
'"' the unnamed register, containing the text of
|
||||||
the last delete or yank
|
the last delete or yank
|
||||||
@@ -176,7 +179,9 @@ CTRL-R {register} *c_CTRL-R* *c_<C-R>*
|
|||||||
sure the expression evaluates to an empty
|
sure the expression evaluates to an empty
|
||||||
string. E.g.: >
|
string. E.g.: >
|
||||||
<C-R><C-R>=setcmdpos(2)[-1]<CR>
|
<C-R><C-R>=setcmdpos(2)[-1]<CR>
|
||||||
< See |registers| about registers.
|
< You can use this to insert a register as
|
||||||
|
typed with CTRL-R =@reg.
|
||||||
|
See |registers| about registers.
|
||||||
Implementation detail: When using the |expression| register
|
Implementation detail: When using the |expression| register
|
||||||
and invoking setcmdpos(), this sets the position before
|
and invoking setcmdpos(), this sets the position before
|
||||||
inserting the resulting string. Use CTRL-R CTRL-R to set the
|
inserting the resulting string. Use CTRL-R CTRL-R to set the
|
||||||
|
@@ -103,12 +103,15 @@ CTRL-P Find previous keyword (see |i_CTRL-P|).
|
|||||||
CTRL-R {register} *i_CTRL-R*
|
CTRL-R {register} *i_CTRL-R*
|
||||||
Insert the contents of a register. Between typing CTRL-R and
|
Insert the contents of a register. Between typing CTRL-R and
|
||||||
the second character, '"' will be displayed to indicate that
|
the second character, '"' will be displayed to indicate that
|
||||||
you are expected to enter the name of a register.
|
you are expected to enter the name of a register. When used
|
||||||
The text is inserted as if you typed it, but mappings and
|
with When used with named or clipboard registers
|
||||||
abbreviations are not used. If you have options like
|
(A-Z,a-z,0-9,+) text is inserted literally like pasting with
|
||||||
'textwidth', 'formatoptions', or 'autoindent' set, this will
|
"p". For other registers, the text is inserted as if you typed
|
||||||
influence what will be inserted. This is different from what
|
it, but mappings and abbreviations are not used. If you have
|
||||||
happens with the "p" command and pasting with the mouse.
|
options like 'textwidth', 'formatoptions', or 'autoindent'
|
||||||
|
set, this will influence what will be inserted. This is
|
||||||
|
different from what happens with the "p" command and pasting
|
||||||
|
with the mouse.
|
||||||
Special registers:
|
Special registers:
|
||||||
'"' the unnamed register, containing the text of
|
'"' the unnamed register, containing the text of
|
||||||
the last delete or yank
|
the last delete or yank
|
||||||
@@ -131,6 +134,8 @@ CTRL-R {register} *i_CTRL-R*
|
|||||||
special keys. E.g., you can use this to move
|
special keys. E.g., you can use this to move
|
||||||
the cursor up:
|
the cursor up:
|
||||||
CTRL-R ="\<Up>"
|
CTRL-R ="\<Up>"
|
||||||
|
you can use this to insert a register as
|
||||||
|
typed with CTRL-R =@reg.
|
||||||
Use CTRL-R CTRL-R to insert text literally.
|
Use CTRL-R CTRL-R to insert text literally.
|
||||||
When the result is a |List| the items are used
|
When the result is a |List| the items are used
|
||||||
as lines. They can have line breaks inside
|
as lines. They can have line breaks inside
|
||||||
|
@@ -68,7 +68,8 @@ DIAGNOSTICS
|
|||||||
|
|
||||||
EDITOR
|
EDITOR
|
||||||
|
|
||||||
• todo
|
• |i_CTRL-R| inserts named registers (A-Z,a-z,0-9) literally like pasting instead of
|
||||||
|
as typed. To get the old behavior you can use `<C-R>=@x`.
|
||||||
|
|
||||||
EVENTS
|
EVENTS
|
||||||
|
|
||||||
|
@@ -316,6 +316,8 @@ Commands:
|
|||||||
Editor:
|
Editor:
|
||||||
- |prompt-buffer| supports multiline input/paste, undo/redo, and o/O normal
|
- |prompt-buffer| supports multiline input/paste, undo/redo, and o/O normal
|
||||||
commands.
|
commands.
|
||||||
|
- |i_CTRL-R| inserts named registers (A-Z,a-z,0-9) literally like pasting instead of
|
||||||
|
as typed. To get the old behavior you can use `<C-R>=@x`.
|
||||||
|
|
||||||
Events (autocommands):
|
Events (autocommands):
|
||||||
- Fixed inconsistent behavior in execution of nested autocommands #23368
|
- Fixed inconsistent behavior in execution of nested autocommands #23368
|
||||||
|
@@ -2854,6 +2854,8 @@ static void ins_reg(void)
|
|||||||
vim_beep(kOptBoFlagRegister);
|
vim_beep(kOptBoFlagRegister);
|
||||||
need_redraw = true; // remove the '"'
|
need_redraw = true; // remove the '"'
|
||||||
} else {
|
} else {
|
||||||
|
yankreg_T *reg = get_yank_register(regname, YREG_PASTE);
|
||||||
|
|
||||||
if (literally == Ctrl_O || literally == Ctrl_P) {
|
if (literally == Ctrl_O || literally == Ctrl_P) {
|
||||||
// Append the command to the redo buffer.
|
// Append the command to the redo buffer.
|
||||||
AppendCharToRedobuff(Ctrl_R);
|
AppendCharToRedobuff(Ctrl_R);
|
||||||
@@ -2862,7 +2864,11 @@ static void ins_reg(void)
|
|||||||
|
|
||||||
do_put(regname, NULL, BACKWARD, 1,
|
do_put(regname, NULL, BACKWARD, 1,
|
||||||
(literally == Ctrl_P ? PUT_FIXINDENT : 0) | PUT_CURSEND);
|
(literally == Ctrl_P ? PUT_FIXINDENT : 0) | PUT_CURSEND);
|
||||||
} else if (insert_reg(regname, NULL, literally) == FAIL) {
|
} else if (reg->y_size > 1 && is_literal_register(regname)) {
|
||||||
|
AppendCharToRedobuff(Ctrl_R);
|
||||||
|
AppendCharToRedobuff(regname);
|
||||||
|
do_put(regname, NULL, BACKWARD, 1, PUT_CURSEND);
|
||||||
|
} else if (insert_reg(regname, NULL, !!literally) == FAIL) {
|
||||||
vim_beep(kOptBoFlagRegister);
|
vim_beep(kOptBoFlagRegister);
|
||||||
need_redraw = true; // remove the '"'
|
need_redraw = true; // remove the '"'
|
||||||
} else if (stop_insert_mode) {
|
} else if (stop_insert_mode) {
|
||||||
|
@@ -152,7 +152,7 @@ static inline int op_reg_index(const int regname)
|
|||||||
static inline bool is_literal_register(const int regname)
|
static inline bool is_literal_register(const int regname)
|
||||||
FUNC_ATTR_CONST
|
FUNC_ATTR_CONST
|
||||||
{
|
{
|
||||||
return regname == '*' || regname == '+';
|
return regname == '*' || regname == '+' || ASCII_ISALNUM(regname);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXTERN LuaRef repeat_luaref INIT( = LUA_NOREF); ///< LuaRef for "."
|
EXTERN LuaRef repeat_luaref INIT( = LUA_NOREF); ///< LuaRef for "."
|
||||||
|
@@ -83,6 +83,36 @@ describe('insert-mode', function()
|
|||||||
{5:-- INSERT --} |
|
{5:-- INSERT --} |
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('inserts named registers literally', function()
|
||||||
|
local screen = Screen.new(50, 6)
|
||||||
|
-- regular text without special charecter command
|
||||||
|
command('let @a = "test"')
|
||||||
|
feed('i<C-R>a<ESC>')
|
||||||
|
screen:expect([[
|
||||||
|
tes^t |
|
||||||
|
{1:~ }|*4
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
-- text with backspace character gets written literally by default
|
||||||
|
command('let @a = "test\\<C-H>"')
|
||||||
|
feed('cc<C-R>a<ESC>')
|
||||||
|
screen:expect([[
|
||||||
|
test{18:^^H} |
|
||||||
|
{1:~ }|*4
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
-- =@reg<CR> can be used to get effect of keypress
|
||||||
|
command('let @a = "test\\<C-H>"')
|
||||||
|
feed('cc<C-R>=@a<CR><ESC>')
|
||||||
|
screen:expect([[
|
||||||
|
te^s |
|
||||||
|
{1:~ }|*4
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('Ctrl-O', function()
|
describe('Ctrl-O', function()
|
||||||
|
@@ -2090,7 +2090,7 @@ func Test_Cmdline()
|
|||||||
|
|
||||||
let g:log = []
|
let g:log = []
|
||||||
let @r = 'abc'
|
let @r = 'abc'
|
||||||
call feedkeys(":0\<C-R>r1\<C-R>\<C-O>r2\<C-R>\<C-R>r3\<Esc>", 'xt')
|
call feedkeys(":0\<C-R>=@r\<CR>1\<C-R>\<C-O>r2\<C-R>\<C-R>r3\<Esc>", 'xt')
|
||||||
call assert_equal([
|
call assert_equal([
|
||||||
\ '0',
|
\ '0',
|
||||||
\ '0a',
|
\ '0a',
|
||||||
|
@@ -905,7 +905,7 @@ func Test_cmdline_paste()
|
|||||||
|
|
||||||
" Test for pasting register containing CTRL-H using CTRL-R and CTRL-R CTRL-R
|
" Test for pasting register containing CTRL-H using CTRL-R and CTRL-R CTRL-R
|
||||||
let @a = "xy\<C-H>z"
|
let @a = "xy\<C-H>z"
|
||||||
call feedkeys(":\"\<C-R>a\<CR>", 'xt')
|
call feedkeys(":\"\<C-R>=@a\<CR>\<CR>", 'xt')
|
||||||
call assert_equal('"xz', @:)
|
call assert_equal('"xz', @:)
|
||||||
call feedkeys(":\"\<C-R>\<C-R>a\<CR>", 'xt')
|
call feedkeys(":\"\<C-R>\<C-R>a\<CR>", 'xt')
|
||||||
call assert_equal("\"xy\<C-H>z", @:)
|
call assert_equal("\"xy\<C-H>z", @:)
|
||||||
|
@@ -1523,7 +1523,7 @@ func Test_complete_reginsert()
|
|||||||
exe "normal Goa\<C-P>\<C-R>=\"\\<C-P>\"\<CR>"
|
exe "normal Goa\<C-P>\<C-R>=\"\\<C-P>\"\<CR>"
|
||||||
call assert_equal('a123', getline(5))
|
call assert_equal('a123', getline(5))
|
||||||
let @r = "\<C-P>\<C-P>"
|
let @r = "\<C-P>\<C-P>"
|
||||||
exe "normal GCa\<C-P>\<C-R>r"
|
exe "normal GCa\<C-P>\<C-R>=@r\<CR>"
|
||||||
call assert_equal('a12', getline(5))
|
call assert_equal('a12', getline(5))
|
||||||
exe "normal GCa\<C-P>\<C-R>=\"x\"\<CR>"
|
exe "normal GCa\<C-P>\<C-R>=\"x\"\<CR>"
|
||||||
call assert_equal('a1234x', getline(5))
|
call assert_equal('a1234x', getline(5))
|
||||||
|
Reference in New Issue
Block a user