From d0c8dfc578dfda90a9f1311e9bb919f93df1a445 Mon Sep 17 00:00:00 2001 From: Kwon-Young Date: Sun, 2 Sep 2018 00:52:54 -0400 Subject: [PATCH] vim-patch:8.0.1089: range count in user command Problem: Cannot get range count in user command. Solution: Add argument. https://github.com/vim/vim/commit/c168bd4bd3a9b856fc410fc4515dcca1d10d7461 close #8946 --- runtime/doc/map.txt | 2 ++ src/nvim/ex_docmd.c | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt index d630bf5652..836ac890be 100644 --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1365,6 +1365,8 @@ The valid escape sequences are The starting line of the command range. ** The final line of the command range. + ** + The number of items in the command range: 0, 1 or 2 ** Any count supplied (as described for the '-range' and '-count' attributes). diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index f7bfeebe0a..8445d27c8f 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -5188,9 +5188,10 @@ static void ex_command(exarg_T *eap) while (*p == '-') { ++p; end = skiptowhite(p); - if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, &addr_type_arg) - == FAIL) + if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl, &compl_arg, + &addr_type_arg) == FAIL) { return; + } p = skipwhite(end); } @@ -5221,9 +5222,10 @@ static void ex_command(exarg_T *eap) || (name_len <= 4 && STRNCMP(name, "Next", name_len) == 0)) { EMSG(_("E841: Reserved name, cannot be used for user defined command")); return; - } else + } else { uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg, addr_type_arg, eap->forceit); + } } /* @@ -5397,8 +5399,18 @@ uc_check_code( char_u *p = code + 1; size_t l = len - 2; int quote = 0; - enum { ct_ARGS, ct_BANG, ct_COUNT, ct_LINE1, ct_LINE2, ct_MODS, - ct_REGISTER, ct_LT, ct_NONE } type = ct_NONE; + enum { + ct_ARGS, + ct_BANG, + ct_COUNT, + ct_LINE1, + ct_LINE2, + ct_RANGE, + ct_MODS, + ct_REGISTER, + ct_LT, + ct_NONE + } type = ct_NONE; if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-') { quote = (*p == 'q' || *p == 'Q') ? 1 : 2; @@ -5419,6 +5431,8 @@ uc_check_code( type = ct_LINE1; } else if (STRNICMP(p, "line2>", l) == 0) { type = ct_LINE2; + } else if (STRNICMP(p, "range>", l) == 0) { + type = ct_RANGE; } else if (STRNICMP(p, "lt>", l) == 0) { type = ct_LT; } else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0) { @@ -5506,11 +5520,13 @@ uc_check_code( case ct_LINE1: case ct_LINE2: + case ct_RANGE: case ct_COUNT: { char num_buf[20]; long num = (type == ct_LINE1) ? eap->line1 : (type == ct_LINE2) ? eap->line2 : + (type == ct_RANGE) ? eap->addr_count : (eap->addr_count > 0) ? eap->line2 : cmd->uc_def; size_t num_len;