From ac48506ac62b2ece523d5af6ea6c95b699d70b94 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 23 Mar 2022 19:45:01 +0000 Subject: 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) --- src/ex_docmd.c | 14 +++++++++----- src/proto/ex_docmd.pro | 2 +- src/syntax.c | 2 +- src/testdir/test_vim9_cmd.vim | 15 +++++++++++++-- src/version.c | 2 ++ src/vim9cmds.c | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index c33dcbca01..a35924a570 100644 --- 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 { diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index 3be7471070..40f2649829 100644 --- 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); diff --git a/src/syntax.c b/src/syntax.c index 6683d2a3ed..74687cb4d9 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -4764,7 +4764,7 @@ syn_cmd_include(exarg_T *eap, int syncing UNUSED) * 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 ".." we ":source" the diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index b15028adf4..38ee7f23fe 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1178,8 +1178,19 @@ def Test_map_command() nnoremap :echo 'hit F3 #' assert_equal(":echo 'hit F3 #'", maparg("", "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 MyFunc('a') \| MyFunc('b') + enddef + Init() + unmap + END + v9.CheckScriptSuccess(lines) enddef def Test_normal_command() diff --git a/src/version.c b/src/version.c index ad4f3c8139..dd2330e4a7 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4615, /**/ 4614, /**/ diff --git a/src/vim9cmds.c b/src/vim9cmds.c index 072a106a50..483b1f34b2 100644 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -1848,7 +1848,7 @@ compile_exec(char_u *line_arg, exarg_T *eap, cctx_T *cctx) if ((argt & EX_TRLBAR) && !usefilter) { eap->argt = argt; - separate_nextcmd(eap); + separate_nextcmd(eap, TRUE); if (eap->nextcmd != NULL) nextcmd = eap->nextcmd; } -- cgit v1.2.3