diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-07-14 16:49:03 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-14 16:49:03 +0800 |
commit | f0eb855607f82026d8a32dffb3cdf59212694538 (patch) | |
tree | b4532a00a60eefe2aee77e7bdbf7ef1eb769c9da /src | |
parent | 49ba36becd0bbf1052802b846f418aee673b28a5 (diff) | |
parent | c8401515cdaad20220e30f5a0c39ddb7bae77f5e (diff) | |
download | rneovim-f0eb855607f82026d8a32dffb3cdf59212694538.tar.gz rneovim-f0eb855607f82026d8a32dffb3cdf59212694538.tar.bz2 rneovim-f0eb855607f82026d8a32dffb3cdf59212694538.zip |
Merge pull request #29696 from zeertzjq/vim-9.1.0573
vim-patch:9.1.{0573,0574,0582}
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_cmds.c | 6 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 16 | ||||
-rw-r--r-- | src/nvim/getchar.c | 2 |
3 files changed, 19 insertions, 5 deletions
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 0aa897105e..e4e9075afa 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -2784,7 +2784,11 @@ void ex_append(exarg_T *eap) indent = get_indent_lnum(lnum); } } - if (eap->ea_getline == NULL) { + if (*eap->arg == '|') { + // Get the text after the trailing bar. + theline = xstrdup(eap->arg + 1); + *eap->arg = NUL; + } else if (eap->ea_getline == NULL) { // No getline() function, use the lines that follow. This ends // when there is no more. if (eap->nextcmd == NULL || *eap->nextcmd == NUL) { diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 2495b673e4..b252ba2b20 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -2079,6 +2079,7 @@ static char *do_one_cmd(char **cmdlinep, int flags, cstack_T *cstack, LineGetter if (ea.skip) { // skip this if inside :if goto doend; } + assert(errormsg == NULL); errormsg = ex_range_without_command(&ea); goto doend; } @@ -2425,13 +2426,17 @@ char *ex_errmsg(const char *const msg, const char *const arg) return ex_error_buf; } +/// The "+" string used in place of an empty command in Ex mode. +/// This string is used in pointer comparison. +static char exmode_plus[] = "+"; + /// Handle a range without a command. /// Returns an error message on failure. static char *ex_range_without_command(exarg_T *eap) { char *errormsg = NULL; - if (*eap->cmd == '|' || (exmode_active && eap->line1 != eap->line2)) { + if (*eap->cmd == '|' || (exmode_active && eap->cmd != exmode_plus + 1)) { eap->cmdidx = CMD_print; eap->argt = EX_RANGE | EX_COUNT | EX_TRLBAR; if ((errormsg = invalid_range(eap)) == NULL) { @@ -2490,7 +2495,7 @@ int parse_command_modifiers(exarg_T *eap, const char **errormsg, cmdmod_T *cmod, if (*eap->cmd == NUL && exmode_active && getline_equal(eap->ea_getline, eap->cookie, getexline) && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count) { - eap->cmd = "+"; + eap->cmd = exmode_plus; if (!skip_only) { ex_pressedreturn = true; } @@ -4107,7 +4112,12 @@ void separate_nextcmd(exarg_T *eap) && !(eap->argt & EX_NOTRLCOM) && (eap->cmdidx != CMD_at || p != eap->arg) && (eap->cmdidx != CMD_redir - || p != eap->arg + 1 || p[-1] != '@')) || *p == '|' || *p == '\n') { + || p != eap->arg + 1 || p[-1] != '@')) + || (*p == '|' + && eap->cmdidx != CMD_append + && eap->cmdidx != CMD_change + && eap->cmdidx != CMD_insert) + || *p == '\n') { // We remove the '\' before the '|', unless EX_CTRLV is used // AND 'b' is present in 'cpoptions'. if ((vim_strchr(p_cpo, CPO_BAR) == NULL diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index d6534a08ff..154a6a636a 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -2729,7 +2729,7 @@ static int vgetorpeek(bool advance) timedout = true; continue; } - // In Ex-mode \n is compatible with original Vim behaviour. + // For the command line only CTRL-C always breaks it. // For the cmdline window: Alternate between ESC and // CTRL-C: ESC for most situations and CTRL-C to close the |