Pregunta:
No puedo contar la cantidad de veces que he intentado hacer esto:
:set foldmethod=syn^I
¡Parece que la finalización no funciona con los valores de las opciones!
En algunos casos, las opciones son cadenas complejas donde la finalización puede no tener sentido. (Por ejemplo, 'comments'
).
Pero, ¿se ha realizado algún esfuerzo para proporcionar la finalización de wildchar para los casos de uso comunes?
Si no es así, ¿cómo puedo hacer que funcione el ejemplo anterior? (Suponiendo que quisiera completar con una de las cadenas ['manual', 'indent', 'expr', 'marker', 'syntax']
.)
Respuesta:
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í, a modo de ejemplo, se almacenan 3 opciones + valores:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
.
set wildcharm=<c-z>
Esta línea establece la opción 'wildcharm'
y le dice a Vim que si ve <cz>
en un mapeo, debe activar el wildmenu. 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 un mapeo que escribirá 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() ?
El mapeo prueba si la línea de comando coincide con el patrón ^\s*set\s\+\w\+=
, que es una línea que sigue al formulario set option=
, o si el comodín está activo.
\ '<c-z>' :
Si la prueba anterior tiene éxito, el mapeo activa el menú comodín.
\ '<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 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 es 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 comando :Set
le enviará automáticamente 3 argumentos:
- la parte inicial del argumento que se está completando actualmente (es decir,
option=...
) - toda la línea de comando
- la posición del cursor en él
Consulte :h :command-completion-customlist
para obtener más información.
let option = matchstr(a:A, '^.*\ze=')
Extraiga el nombre de la opción del argumento que se completa el.
if !has_key(s:option_values, option)
return
endif
Compruebe si la option
está en su 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 en la lista de candidates
, anteponga la cadena option=
(donde se evaluará la option
).
return filter(candidates, 'v:val =~ "^" . a:A')
Elimine los elementos de los candidates
cuyo comienzo no coincida con el argumento que se está completando y devuelva el resultado.