Sie können den folgenden Code ausprobieren:
let s:option_values = {'foldmethod' : ['manual', 'indent', 'expr', 'marker', 'syntax'],
\ 'bufhidden' : ['hide', 'unload', 'delete', 'wipe'],
\ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}
set wildcharm=<c-z>
cnoremap <expr> <tab>
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
\ '<c-z>' :
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
function! s:SetComplete(A, L, P) abort
let option = matchstr(a:A, '^.*\ze=')
if !has_key(s:option_values, option)
return
endif
let candidates = copy(s:option_values[option])
call map(candidates, 'option . "=" . v:val')
return filter(candidates, 'v:val =~ "^" . a:A')
endfunction
Zunächst wird ein Wörterbuch definiert, s:option_values
dessen Zweck darin besteht, Ihre Optionen (als Schlüssel) und deren Werte (als Listenwerte) zu enthalten. Hier als Beispiel 3 Optionen + Werte werden gespeichert:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
.
set wildcharm=<c-z>
Diese Zeile setzt die 'wildcharm'
Option und teilt Vim mit, dass <c-z>
das Platzmenü aktiviert werden muss , wenn es in einem Mapping angezeigt wird. Wenn Sie <tab>
in eine Zuordnung schreiben, ohne diese Option festzulegen, wird einfach ein wörtliches Tabulatorzeichen eingefügt.
cnoremap <expr> <tab>
Beginnen Sie mit der Definition einer Zuordnung, die die Auswertung eines Ausdrucks eingibt, wenn Sie <tab>
auf die Befehlszeile klicken.
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
Das Mapping testet, ob die Befehlszeile mit dem Muster übereinstimmt ^\s*set\s\+\w\+=
, bei dem es sich um eine Zeile handelt, die dem Formular folgt set option=
, oder ob das Platzhaltermenü aktiv ist.
\ '<c-z>' :
Wenn der vorherige Test erfolgreich ist, aktiviert das Mapping das Platzhaltermenü.
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
Andernfalls wird der Systembefehl :set
durch den benutzerdefinierten Befehl ersetzt :Set
und das Platzhaltermenü aktiviert.
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
Definieren Sie den benutzerdefinierten Befehl :Set
, der dasselbe tut wie :set
, außer dass eine benutzerdefinierte Vervollständigungsfunktion verwendet werden kann, deren Name hier steht s:SetComplete()
.
function! s:SetComplete(A, L, P) abort
Beginnen Sie mit der Definition der benutzerdefinierten Vervollständigungsfunktion.
Es muss Vorschläge / Kandidaten über eine Liste zurückgeben.
Der :Set
Befehl sendet automatisch 3 Argumente an ihn:
- der führende Teil des Arguments wird derzeit abgeschlossen am (dh
option=...
)
- die gesamte Kommandozeile
- die Cursorposition darin
Siehe :h :command-completion-customlist
für weitere Informationen.
let option = matchstr(a:A, '^.*\ze=')
Extrahieren Sie den Namen der Option aus dem Argument, das am ausgeführt wird.
if !has_key(s:option_values, option)
return
endif
Überprüfen Sie, ob option
es in Ihrem Wörterbuch ist. Ist dies nicht der Fall, gibt die Funktion nichts zurück.
let candidates = copy(s:option_values[option])
Holen Sie sich eine Kopie der Werteliste, die die Option aus Ihrem Wörterbuch übernehmen kann.
call map(candidates, 'option . "=" . v:val')
candidates
Stellen Sie für jeden Wert in der Liste die Zeichenfolge voran option=
(wo option
ausgewertet wird).
return filter(candidates, 'v:val =~ "^" . a:A')
Entfernen Sie die Elemente, candidates
deren Anfang nicht mit dem Argument übereinstimmt, das gerade ausgeführt wird, und geben Sie das Ergebnis zurück.