Autocompletado para valores de opciones en cmdline


10

No puedo contar la cantidad de veces que intenté hacer esto:

:set foldmethod=syn^I

¡Parece que la finalización no funciona en los valores de las opciones!

En algunos casos, las opciones son cadenas complejas donde la finalización puede no tener sentido. (Ej 'comments'.)

Pero, ¿se han realizado esfuerzos para proporcionar la finalización de los comodines para los casos de uso comunes?

Si no, ¿cómo podría hacer que el ejemplo anterior funcione? (Suponiendo que quisiera completar una de las cadenas ['manual', 'indent', 'expr', 'marker', 'syntax']).

Respuestas:


3

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_valuescuyo 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 :setcon el comando personalizado :Sety activa el menú comodín.

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

Defina el comando personalizado :Setque 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 :Setcomando 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-customlistpara 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 optionestá 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 optionse evaluará).

return filter(candidates, 'v:val =~ "^" . a:A')

Elimine los elementos candidatescuyo comienzo no coincida con el argumento que se está completando y devuelva el resultado.


2

AFAIK, no podemos agregar cmdline-complete a los comandos incorporados que no lo proporcionan. O bien "anulamos" el comando con otro que admitirá la finalización (aquí, podría definirlo :Setcon mayúscula S), o pirateamos el código fuente de vim para agregar lo que falta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.