Mercurial > vim
changeset 28179:49631bf057d3 v8.2.4615
patch 8.2.4615: mapping with escaped bar does not work in :def function
Commit: https://github.com/vim/vim/commit/ac48506ac62b2ece523d5af6ea6c95b699d70b94
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Mar 23 19:45:01 2022 +0000
patch 8.2.4615: mapping with escaped bar does not work in :def function
Problem: Mapping with escaped bar does not work in :def function. (Sergey
Vlasov)
Solution: Do not remove the backslash. (closes #10002)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 23 Mar 2022 21:00:05 +0100 |
parents | 96d002169529 |
children | d56d48f416b1 |
files | src/ex_docmd.c src/proto/ex_docmd.pro src/syntax.c src/testdir/test_vim9_cmd.vim src/version.c src/vim9cmds.c |
diffstat | 6 files changed, 27 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2275,7 +2275,7 @@ do_one_cmd( */ if ((ea.argt & EX_TRLBAR) && !ea.usefilter) { - separate_nextcmd(&ea); + separate_nextcmd(&ea, FALSE); } else if (ea.cmdidx == CMD_bang || ea.cmdidx == CMD_terminal @@ -5081,9 +5081,10 @@ repl_cmdline( /* * Check for '|' to separate commands and '"' to start comments. + * If "keep_backslash" is TRUE do not remove any backslash. */ void -separate_nextcmd(exarg_T *eap) +separate_nextcmd(exarg_T *eap, int keep_backslash) { char_u *p; @@ -5097,7 +5098,7 @@ separate_nextcmd(exarg_T *eap) { if (*p == Ctrl_V) { - if (eap->argt & (EX_CTRLV | EX_XFILE)) + if ((eap->argt & (EX_CTRLV | EX_XFILE)) || keep_backslash) ++p; // skip CTRL-V and next char else // remove CTRL-V and skip next char @@ -5144,8 +5145,11 @@ separate_nextcmd(exarg_T *eap) if ((vim_strchr(p_cpo, CPO_BAR) == NULL || !(eap->argt & EX_CTRLV)) && *(p - 1) == '\\') { - STRMOVE(p - 1, p); // remove the '\' - --p; + if (!keep_backslash) + { + STRMOVE(p - 1, p); // remove the '\' + --p; + } } else {
--- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -26,7 +26,7 @@ long excmd_get_argt(cmdidx_T idx); char_u *skip_range(char_u *cmd_start, int skip_star, int *ctx); void ex_ni(exarg_T *eap); int expand_filename(exarg_T *eap, char_u **cmdlinep, char **errormsgp); -void separate_nextcmd(exarg_T *eap); +void separate_nextcmd(exarg_T *eap, int keep_backslash); char_u *skip_cmd_arg(char_u *p, int rembs); int get_bad_opt(char_u *p, exarg_T *eap); int ends_excmd(int c);
--- a/src/syntax.c +++ b/src/syntax.c @@ -4764,7 +4764,7 @@ syn_cmd_include(exarg_T *eap, int syncin * filename to include. */ eap->argt |= (EX_XFILE | EX_NOSPC); - separate_nextcmd(eap); + separate_nextcmd(eap, FALSE); if (*eap->arg == '<' || *eap->arg == '$' || mch_isFullName(eap->arg)) { // For an absolute path, "$VIM/..." or "<sfile>.." we ":source" the
--- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1178,8 +1178,19 @@ def Test_map_command() nnoremap <F3> :echo 'hit F3 #'<CR> assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n")) END - v9.CheckDefSuccess(lines) - v9.CheckScriptSuccess(['vim9script'] + lines) + v9.CheckDefAndScriptSuccess(lines) + + # backslash before bar is not removed + lines =<< trim END + vim9script + + def Init() + noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR> + enddef + Init() + unmap <buffer> <F5> + END + v9.CheckScriptSuccess(lines) enddef def Test_normal_command()