From 30ff1e3b0274a40bc64025bf0eaca20f636e6414 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Thu, 16 Oct 2025 19:17:02 +0000 Subject: [PATCH] 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 Signed-off-by: Christian Brabandt --- runtime/autoload/vimcomplete.vim | 21 ++++++++++++++------- runtime/doc/insert.txt | 32 +++++++++++++++++++++++++++++++- runtime/doc/tags | 1 + 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/runtime/autoload/vimcomplete.vim b/runtime/autoload/vimcomplete.vim index 0de3bf2dbf..d95c8b1caa 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 -# Last Change: 2025-10-13 +# Last Change: 2025-10-15 # # Usage: # setlocal omnifunc=vimcomplete#Complete @@ -22,12 +22,15 @@ def GetTrigger(line: string): list 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 diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt index c08147c60f..1e148f9f3a 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 6a53471f9c..df78fc45fc 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*