Skip to content

Commit

Permalink
cmdline: CTRL-R: Omit trailing <CR>.
Browse files Browse the repository at this point in the history
The "technically correct" interpretation is to execute the first line
that is seen (and this is what happens on middle-click paste in Vim).
^M is only intended to "defuse" the newline, so the user can review it.

The parent commit changed the behavior to insert <Space> between lines,
but that's a higher-risk change: it is arguably possible that some user
*wants* the literal ^M chars when e.g. assigning to a register:
    :let @A='<C-R>b'

To avoid that risk, keep the old behavior and only omit the last ^M.
This makes `yy:<C-R>0` nicer at no cost.
  • Loading branch information
justinmk committed Feb 18, 2017
1 parent 308ccb6 commit baab49e
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 16 deletions.
3 changes: 1 addition & 2 deletions runtime/doc/vim_diff.txt
Expand Up @@ -238,8 +238,7 @@ newly allocated memory all over the place) and fail on types which cannot be
coerced to strings. See |id()| for more details, currently it uses
`printf("%p", {expr})` internally.

|c_CTRL-R| pasting a non-special register into the |cmdline| separates lines
by <Space> instead of <CR>.
|c_CTRL-R| pasting a non-special register into |cmdline| omits the last <CR>.

==============================================================================
5. Missing legacy features *nvim-features-missing*
Expand Down
6 changes: 3 additions & 3 deletions src/nvim/ex_getln.c
Expand Up @@ -2471,10 +2471,10 @@ void restore_cmdline_alloc(char_u *p)
///
/// @param regname Register name.
/// @param literally Insert text literally instead of "as typed".
/// @param remspc When true, remove trailing <Space>.
/// @param remcr When true, remove trailing CR.
///
/// @returns FAIL for failure, OK otherwise
static bool cmdline_paste(int regname, bool literally, bool remspc)
static bool cmdline_paste(int regname, bool literally, bool remcr)
{
long i;
char_u *arg;
Expand Down Expand Up @@ -2539,7 +2539,7 @@ static bool cmdline_paste(int regname, bool literally, bool remspc)
return OK;
}

return cmdline_paste_reg(regname, literally, remspc);
return cmdline_paste_reg(regname, literally, remcr);
}

/*
Expand Down
10 changes: 5 additions & 5 deletions src/nvim/ops.c
Expand Up @@ -1266,10 +1266,10 @@ int get_spec_reg(
///
/// @param regname Register name.
/// @param literally Insert text literally instead of "as typed".
/// @param remspc When true, don't add <Space> characters.
/// @param remcr When true, don't add CR characters.
///
/// @returns FAIL for failure, OK otherwise
bool cmdline_paste_reg(int regname, bool literally, bool remspc)
bool cmdline_paste_reg(int regname, bool literally, bool remcr)
{
yankreg_T *reg = get_yank_register(regname, YREG_PASTE);
if (reg->y_array == NULL)
Expand All @@ -1278,9 +1278,9 @@ bool cmdline_paste_reg(int regname, bool literally, bool remspc)
for (size_t i = 0; i < reg->y_size; i++) {
cmdline_paste_str(reg->y_array[i], literally);

// Insert space between lines, unless `remspc` is true.
if (i < reg->y_size - 1 && !remspc) {
cmdline_paste_str((char_u *)" ", literally);
// Insert ^M between lines, unless `remcr` is true.
if (i < reg->y_size - 1 && !remcr) {
cmdline_paste_str((char_u *)"\r", literally);
}

/* Check for CTRL-C, in case someone tries to paste a few thousand
Expand Down
12 changes: 6 additions & 6 deletions test/functional/cmdline/ctrl_r_spec.lua
Expand Up @@ -5,24 +5,24 @@ local clear, insert, funcs, eq, feed =
describe('cmdline CTRL-R', function()
before_each(clear)

it('pasting non-special register inserts <Space> between lines', function()
it('pasting non-special register inserts <CR> *between* lines', function()
insert([[
line1abc
line2somemoretext
]])
-- Yank 2 lines linewise, then paste to cmdline.
feed([[<C-\><C-N>gg0yj:<C-R>0]])
-- <Space> inserted *between* lines, not after the final line.
eq('line1abc line2somemoretext', funcs.getcmdline())
-- <CR> inserted between lines, NOT after the final line.
eq('line1abc\rline2somemoretext', funcs.getcmdline())

-- Yank 2 lines characterwise, then paste to cmdline.
feed([[<C-\><C-N>gg05lyvj:<C-R>0]])
-- <Space> inserted *between* lines, not after the final line.
eq('abc line2', funcs.getcmdline())
-- <CR> inserted between lines, NOT after the final line.
eq('abc\rline2', funcs.getcmdline())

-- Yank 1 line linewise, then paste to cmdline.
feed([[<C-\><C-N>ggyy:<C-R>0]])
-- No spaces inserted.
-- No <CR> inserted.
eq('line1abc', funcs.getcmdline())
end)

Expand Down

0 comments on commit baab49e

Please sign in to comment.