Puedes probar el siguiente código:
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
Primero define un diccionario s:option_values
cuyo propósito es contener sus opciones (como sus claves) y sus valores (como sus valores que son listas). Aquí, como ejemplo, se almacenan + 3 opciones de valores:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
.
set wildcharm=<c-z>
Esta línea establece la 'wildcharm'
opción y le dice a Vim que si ve <c-z>
en un mapeo, debe activar el menú salvaje. Sin configurar esta opción, si escribe <tab>
en una asignación, simplemente insertará un carácter de tabulación literal.
cnoremap <expr> <tab>
Comience la definición de una asignación que escriba la evaluación de una expresión cada vez que presione <tab>
en la línea de comandos.
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
La asignación prueba si la línea de comandos coincide con el patrón ^\s*set\s\+\w\+=
, que es una línea que sigue el formulario set option=
, o si el menú comodín está activo.
\ '<c-z>' :
Si la prueba anterior tiene éxito, la asignación activa el menú salvaje.
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
De lo contrario, reemplaza el comando del sistema :set
con el comando personalizado :Set
y activa el menú comodín.
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
Defina el comando personalizado :Set
que hace lo mismo que :set
, excepto que puede usar una función de finalización personalizada cuyo nombre está aquí s:SetComplete()
.
function! s:SetComplete(A, L, P) abort
Comience la definición de la función de finalización personalizada.
Debe devolver sugerencias / candidatos a través de una lista.
El :Set
comando le enviará automáticamente 3 argumentos:
- la parte principal del argumento que se está completando actualmente (es decir
option=...
)
- toda la línea de comando
- la posición del cursor en ella
Ver :h :command-completion-customlist
para más información.
let option = matchstr(a:A, '^.*\ze=')
Extraiga el nombre de la opción del argumento que se está completando.
if !has_key(s:option_values, option)
return
endif
Comprueba si option
está en tu diccionario. Si no es así, la función no devuelve nada.
let candidates = copy(s:option_values[option])
Obtenga una copia de la lista de valores que la opción puede tomar de su diccionario.
call map(candidates, 'option . "=" . v:val')
Para cada valor de la lista candidates
, anteponga la cadena option=
(donde option
se evaluará).
return filter(candidates, 'v:val =~ "^" . a:A')
Elimine los elementos candidates
cuyo comienzo no coincida con el argumento que se está completando y devuelva el resultado.