Merge pull request #18305 from zeertzjq/mapping-rhs

feat(mappings): do not simplify the rhs of a mapping
This commit is contained in:
zeertzjq 2022-04-29 22:10:25 +08:00 committed by GitHub
commit d5dc3dad80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 26 deletions

View File

@ -366,8 +366,9 @@ Macro/|recording| behavior
the results of keys from 'keymap'. the results of keys from 'keymap'.
Mappings: Mappings:
Creating a mapping for a simplifiable key (e.g. <C-I>) doesn't replace an - Creating a mapping for a simplifiable key (e.g. <C-I>) doesn't replace an
existing mapping for its simplified form (e.g. <Tab>). existing mapping for its simplified form (e.g. <Tab>).
- The rhs of a mapping is not simplified when it is defined.
Motion: Motion:
The |jumplist| avoids useless/phantom jumps. The |jumplist| avoids useless/phantom jumps.

View File

@ -2885,8 +2885,8 @@ void set_maparg_lhs_rhs(const char_u *const orig_lhs, const size_t orig_lhs_len,
mapargs->rhs_len = 0; mapargs->rhs_len = 0;
mapargs->rhs_is_noop = true; mapargs->rhs_is_noop = true;
} else { } else {
replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf, REPTERM_DO_LT, NULL, replaced = replace_termcodes(orig_rhs, orig_rhs_len, &rhs_buf,
cpo_flags); REPTERM_DO_LT | REPTERM_NO_SIMPLIFY, NULL, cpo_flags);
mapargs->rhs_len = STRLEN(replaced); mapargs->rhs_len = STRLEN(replaced);
mapargs->rhs_is_noop = false; mapargs->rhs_is_noop = false;
mapargs->rhs = xcalloc(mapargs->rhs_len + 1, sizeof(char_u)); mapargs->rhs = xcalloc(mapargs->rhs_len + 1, sizeof(char_u));
@ -4861,15 +4861,21 @@ char_u *getcmdkeycmd(int promptc, void *cookie, int indent, bool do_concat)
// special case to give nicer error message // special case to give nicer error message
emsg(e_cmdmap_repeated); emsg(e_cmdmap_repeated);
aborted = true; aborted = true;
} else if (IS_SPECIAL(c1)) { } else if (c1 == K_SNR) {
if (c1 == K_SNR) { ga_concat(&line_ga, "<SNR>");
ga_concat(&line_ga, "<SNR>");
} else {
semsg(e_cmdmap_key, get_special_key_name(c1, cmod));
aborted = true;
}
} else { } else {
ga_append(&line_ga, (char)c1); if (cmod != 0) {
ga_append(&line_ga, (char)K_SPECIAL);
ga_append(&line_ga, (char)KS_MODIFIER);
ga_append(&line_ga, (char)cmod);
}
if (IS_SPECIAL(c1)) {
ga_append(&line_ga, (char)K_SPECIAL);
ga_append(&line_ga, (char)K_SECOND(c1));
ga_append(&line_ga, (char)K_THIRD(c1));
} else {
ga_append(&line_ga, (char)c1);
}
} }
cmod = 0; cmod = 0;

View File

@ -997,8 +997,8 @@ EXTERN char e_float_as_string[] INIT(= N_("E806: using Float as a String"));
EXTERN char e_autocmd_err[] INIT(= N_("E5500: autocmd has thrown an exception: %s")); EXTERN char e_autocmd_err[] INIT(= N_("E5500: autocmd has thrown an exception: %s"));
EXTERN char e_cmdmap_err[] INIT(= N_("E5520: <Cmd> mapping must end with <CR>")); EXTERN char e_cmdmap_err[] INIT(= N_("E5520: <Cmd> mapping must end with <CR>"));
EXTERN char e_cmdmap_repeated[] INIT(= N_("E5521: <Cmd> mapping must end with <CR> before second <Cmd>")); EXTERN char e_cmdmap_repeated[]
EXTERN char e_cmdmap_key[] INIT(= N_("E5522: <Cmd> mapping must not include %s key")); INIT(= N_("E5521: <Cmd> mapping must end with <CR> before second <Cmd>"));
EXTERN char e_api_error[] INIT(= N_("E5555: API call: %s")); EXTERN char e_api_error[] INIT(= N_("E5555: API call: %s"));

View File

@ -93,19 +93,6 @@ describe('mappings with <Cmd>', function()
{2:E5521: <Cmd> mapping must end with <CR> before second <Cmd>} | {2:E5521: <Cmd> mapping must end with <CR> before second <Cmd>} |
]]) ]])
command('noremap <F3> <Cmd><F3>let x = 2<cr>')
feed('<F3>')
screen:expect([[
^some short lines |
of test text |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{2:E5522: <Cmd> mapping must not include <F3> key} |
]])
command('noremap <F3> <Cmd>let x = 3') command('noremap <F3> <Cmd>let x = 3')
feed('<F3>') feed('<F3>')
screen:expect([[ screen:expect([[
@ -121,6 +108,34 @@ describe('mappings with <Cmd>', function()
eq(0, eval('x')) eq(0, eval('x'))
end) end)
it('allows special keys and modifiers', function()
command('noremap <F3> <Cmd>normal! <Down><CR>')
feed('<F3>')
screen:expect([[
some short lines |
^of test text |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
|
]])
command('noremap <F3> <Cmd>normal! <C-Right><CR>')
feed('<F3>')
screen:expect([[
some short lines |
of ^test text |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
|
]])
end)
it('works in various modes and sees correct `mode()` value', function() it('works in various modes and sees correct `mode()` value', function()
-- normal mode -- normal mode
feed('<F3>') feed('<F3>')

View File

@ -313,6 +313,11 @@ it('unsimplified mapping works when there was a partial match vim-patch:8.2.4504
expect('xb') expect('xb')
end) end)
it('rhs of a mapping is not simplified', function()
command('nnoremap <Plug>foo <C-J>')
eq('<C-J>', funcs.maparg('<Plug>foo'))
end)
describe('input non-printable chars', function() describe('input non-printable chars', function()
after_each(function() after_each(function()
os.remove('Xtest-overwrite') os.remove('Xtest-overwrite')