]> granicus.if.org Git - vim/commitdiff
patch 8.2.0335: no completion for :disassemble v8.2.0335
authorBram Moolenaar <Bram@vim.org>
Sat, 29 Feb 2020 21:06:30 +0000 (22:06 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 29 Feb 2020 21:06:30 +0000 (22:06 +0100)
Problem:    No completion for :disassemble.
Solution:   Make completion work.  Also complete script-local functions if the
            name starts with "s:".

runtime/doc/vim9.txt
src/cmdexpand.c
src/testdir/test_cmdline.vim
src/version.c

index d634f22fdddaa578cc317d7d5b282e7fe7b8b615..3ba92dbcaf66cd1c16459748f3430b59db7a7c41 100644 (file)
@@ -149,6 +149,12 @@ with `substitute(` this will use the function, prepend a colon to use the
 command instead: >
        :substitute(pattern (replacement (
 
+Note that while variables need to be defined before they can be used,
+functions can be called before being defined.  This is required to be able
+have cyclic dependencies between functions.  It is slightly less efficient,
+since the function has to be looked up by name.  And a typo in the function
+name will only be found when the call is executed.
+
 
 No curly braces expansion ~
 
@@ -275,6 +281,8 @@ script, then script-local variables must be accessed with the "s:" prefix.
                                                *:disa* *:disassemble*
 :disa[ssemble] {func}  Show the instructions generated for {func}.
                        This is for debugging and testing.
+                       Note that for command line completion of {func} you
+                       can prepend "s:" to find script-local functions.
 
 ==============================================================================
 
index b5da922fd181837cc8c97ae13c59214413b6acff..ece5a468b18de784923acf26a51fd26d21fac550 100644 (file)
@@ -1550,6 +1550,7 @@ set_one_cmd_context(
 
        case CMD_function:
        case CMD_delfunction:
+       case CMD_disassemble:
            xp->xp_context = EXPAND_USER_FUNC;
            xp->xp_pattern = arg;
            break;
@@ -1978,6 +1979,7 @@ ExpandFromContext(
     regmatch_T regmatch;
     int                ret;
     int                flags;
+    char_u     *tofree = NULL;
 
     flags = EW_DIR;    // include directories
     if (options & WILD_LIST_NOTFOUND)
@@ -2115,6 +2117,17 @@ ExpandFromContext(
     if (xp->xp_context == EXPAND_PACKADD)
        return ExpandPackAddDir(pat, num_file, file);
 
+    // When expanding a function name starting with s:, match the <SNR>nr_
+    // prefix.
+    if (xp->xp_context == EXPAND_USER_FUNC && STRNCMP(pat, "^s:", 3) == 0)
+    {
+       int len = (int)STRLEN(pat) + 20;
+
+       tofree = alloc(len);
+       snprintf((char *)tofree, len, "^<SNR>\\d\\+_%s", pat + 3);
+       pat = tofree;
+    }
+
     regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
     if (regmatch.regprog == NULL)
        return FAIL;
@@ -2204,6 +2217,7 @@ ExpandFromContext(
     }
 
     vim_regfree(regmatch.regprog);
+    vim_free(tofree);
 
     return ret;
 }
index 1baed7961f8cc031d7a2bc3b84bb24859446cee4..8c580262ac7ae94156a8c3bb28ab7a3310962968 100644 (file)
@@ -559,6 +559,17 @@ func Test_cmdline_complete_user_cmd()
   delcommand Foo
 endfunc
 
+func s:ScriptLocalFunction()
+  echo 'yes'
+endfunc
+
+func Test_cmdline_complete_user_func()
+  call feedkeys(":func Test_cmdline_complete_user\<Tab>\<Home>\"\<cr>", 'tx')
+  call assert_match('"func Test_cmdline_complete_user', @:)
+  call feedkeys(":func s:ScriptL\<Tab>\<Home>\"\<cr>", 'tx')
+  call assert_match('"func <SNR>\d\+_ScriptLocalFunction', @:)
+endfunc
+
 func Test_cmdline_complete_user_names()
   if has('unix') && executable('whoami')
     let whoami = systemlist('whoami')[0]
index 4dc9642a5c2b14934caa2a417feccfd278e72798..23c45082c7a49d250c0cea932aa159373e0435c5 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    335,
 /**/
     334,
 /**/