runtime(vimcomplete): do not complete 'shellcmd' on WSL and Windows

Commit: 
https://github.com/vim/vim/commit/30ff1e3b0274a40bc64025bf0eaca20f636e6414
Author: Maxim Kim <[email protected]>
Date:   Thu Oct 16 19:17:02 2025 +0000

    runtime(vimcomplete): do not complete 'shellcmd' on WSL and Windows
    
    - 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 <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/runtime/autoload/vimcomplete.vim b/runtime/autoload/vimcomplete.vim
index 0de3bf2db..d95c8b1ca 100644
--- a/runtime/autoload/vimcomplete.vim
+++ b/runtime/autoload/vimcomplete.vim
@@ -3,7 +3,7 @@ vim9script
 # Vim completion script
 # Language:    Vim script
 # Maintainer:  Maxim Kim <[email protected]>
-# 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 =~ ' %(^|\s+)\&\k*$'
         result = 'option'
+    elseif line =~ ' se%[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
 
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index c08147c60..1e148f9f3 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -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
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 6a53471f9..df78fc45f 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -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*

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1v9Tfo-001Kez-BC%40256bit.org.

Raspunde prin e-mail lui