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.