command-line – Finalización automática para valores de opción en la línea cmd

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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım