]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(vimcomplete): do not complete 'shellcmd' on WSL and Windows
authorMaxim Kim <habamax@gmail.com>
Thu, 16 Oct 2025 19:17:02 +0000 (19:17 +0000)
committerChristian Brabandt <cb@256bit.org>
Thu, 16 Oct 2025 19:17:02 +0000 (19:17 +0000)
- shellcmd completion is VERY slow on both WSL and Windows, e.g. `term
  something` or `!something` might take ~10 seconds to show first
  results. Do not complete it there.

- revert previous change to not complete on whitespace, do not complete
  on *empty* lines instead.

closes: #18568

Signed-off-by: Maxim Kim <habamax@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/autoload/vimcomplete.vim
runtime/doc/insert.txt
runtime/doc/tags

index 0de3bf2dbf9045d9943c85897569ec933610100f..d95c8b1caa088e97d59abd7371693bdd513a6096 100644 (file)
@@ -3,7 +3,7 @@ vim9script
 # Vim completion script
 # Language:    Vim script
 # Maintainer:  Maxim Kim <habamax@gmail.com>
-# Last Change: 2025-10-13
+# Last Change: 2025-10-15
 #
 # Usage:
 # setlocal omnifunc=vimcomplete#Complete
@@ -22,12 +22,15 @@ def GetTrigger(line: string): list<any>
         result = 'function'
     elseif line =~ '\v%(^|\s+)\&\k*$'
         result = 'option'
+    elseif line =~ '\vse%[t]\s+(\k+\s+)*no\k*$'
+        result = 'nooption'
+        result_len = -2
     elseif line =~ '[\[(]\s*$'
         result = 'expression'
     elseif line =~ '[lvgsb]:\k*$'
         result = 'var'
         result_len = 2
-    else
+    elseif line !~ '^\s*$'
         result = getcompletiontype(line) ?? 'cmdline'
     endif
     return [result, result_len]
@@ -35,10 +38,8 @@ enddef
 
 export def Complete(findstart: number, base: string): any
     if findstart > 0
+        prefix = ""
         var line = getline('.')->strpart(0, col('.') - 1)
-        if line =~ '\s\+$'
-            return -2
-        endif
         var keyword = line->matchstr('\k\+$')
         var stx = synstack(line('.'), col('.') - 1)->map('synIDattr(v:val, "name")')->join()
         if stx =~? 'Comment' || (stx =~ 'String' && stx !~ 'vimStringInterpolationExpr')
@@ -60,6 +61,9 @@ export def Complete(findstart: number, base: string): any
     elseif trigger == 'option'
         items = getcompletion(base, 'option')
             ->mapnew((_, v) => ({word: v, kind: 'v', menu: 'Option', dup: 0}))
+    elseif trigger == 'nooption'
+        items = getcompletion(base[2 : ], 'option')
+            ->mapnew((_, v) => ({word: v, kind: 'v', menu: 'Option', dup: 0}))
     elseif trigger == 'var'
         items = getcompletion(base, 'var')
             ->mapnew((_, v) => ({word: v, kind: 'v', menu: 'Variable', dup: 0}))
@@ -74,8 +78,11 @@ export def Complete(findstart: number, base: string): any
         items = commands + functions
     else
         try
-            items = getcompletion(prefix, 'cmdline')
-                ->mapnew((_, v) => ({word: v->matchstr('\k\+'), kind: 'v', dup: 0}))
+            # :! and :term completion is very slow on Windows and WSL, disable it there.
+            if !((has("win32") || has("win32unix") || exists("$WSLENV")) && getcompletiontype(prefix) == 'shellcmd')
+                items = getcompletion(prefix, 'cmdline')
+                    ->mapnew((_, v) => ({word: v->matchstr('\k\+'), kind: 'v', dup: 0}))
+            endif
         catch /E220/
         endtry
 
index c08147c60f8472034bb5683508d7dfbdac213ba8..1e148f9f3a44bfc8cc5f1b74d8aff34997cd7dc0 100644 (file)
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 9.1.  Last change: 2025 Oct 14
+*insert.txt*    For Vim version 9.1.  Last change: 2025 Oct 16
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1704,6 +1704,36 @@ Notes:
 <  to your vimrc
 
 
+VIM                                                    *ft-vim-omni*
+
+Simple completion of Vimscript and Vim9script languages.
+
+Complete:
+
+- set and & options
+- commands and command arguments
+- function names after ->
+- expressions
+- l:, v:, g:, s: and b: variables
+- fallback to command line completion to get candidates
+
+Notes
+
+- It doesn't complete command arguments that rely on 'shellcmd' completion
+  type in Windows and WSL due to general slowness of canditate gathering,
+  e.g.
+>
+     terminal dir
+     !dir
+<
+  These completions might take several seconds to gather candidates.
+
+- 'autocomplete' can't complete "no" options:
+>
+     set noautoindent
+     set nobuflisted
+<
+
 SYNTAX                                                 *ft-syntax-omni*
 
 Vim has the ability to color syntax highlight nearly 500 languages.  Part of
index 6a53471f9c5a48e243bc8568a46a95a7fcd4a0b8..df78fc45fc2e94bf93e9392050d9adf3ad57cf0f 100644 (file)
@@ -7678,6 +7678,7 @@ ft-vb-syntax      syntax.txt      /*ft-vb-syntax*
 ft-verilog-indent      indent.txt      /*ft-verilog-indent*
 ft-vhdl-indent indent.txt      /*ft-vhdl-indent*
 ft-vim-indent  indent.txt      /*ft-vim-indent*
+ft-vim-omni    insert.txt      /*ft-vim-omni*
 ft-vim-plugin  filetype.txt    /*ft-vim-plugin*
 ft-vim-syntax  syntax.txt      /*ft-vim-syntax*
 ft-xf86conf-syntax     syntax.txt      /*ft-xf86conf-syntax*