¿Cómo creo mi propia lista de autocompletado para ciertos tipos de archivos?
Por ejemplo, me gustaría que css y html se autocompleten de la lista de clases css en FontAwesome .
fuente
¿Cómo creo mi propia lista de autocompletado para ciertos tipos de archivos?
Por ejemplo, me gustaría que css y html se autocompleten de la lista de clases css en FontAwesome .
La finalización del diccionario sería una solución barata y no intrusiva:
guarde fontawesome.txt en algún lugar de su máquina,
pon esto en after/ftplugin/css.vim
(crea el archivo si no existe):
setlocal complete+=k
setlocal dictionary+=/path/to/fontawesome.txt
setlocal iskeyword+=-
iniciar una nueva sesión o hacerlo :e
en un búfer CSS para forzar el archivo anterior
presione <C-n>
o <C-p>
en modo de inserción,
¡disfrutar!
Referencia:
:help ins-completion
:help 'complete'
:help 'dictionary'
:help 'iskeyword'
EDITAR Gracias al comentario de romainl, he editado mi respuesta para mostrar cómo crear una función de finalización definida por el usuario. En la versión anterior, estaba anulando el omni-finalización incorporado que no era bueno porque el usuario habría perdido la finalización predeterminada que es bastante poderosa.
Una solución vimscript
Una solución es usar vimscript y el hecho de que vim le permite crear una función de finalización personalizada.
La ventaja de esta solución es que no necesita un complemento adicional, simplemente puede crear una función de finalización definida por el usuario y usar la función de finalización incorporada.
Usaré tu ejemplo de las clases fontAwesome en css
archivos:
Cree el archivo ~/.vim/autoload/csscomplete.vim
y ponga las siguientes líneas en él:
let s:matches=".fa-lg .fa-2x .fa-3x .fa-4x .fa-5x .fa-fw .fa-ul .fa-ul .fa-li .fa-li.fa-lg .fa-border .fa-pull-left .fa-pull-right .fa.fa-pull-left"
function! csscomplete#CompleteFA(findstart, base)
if a:findstart
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && (line[start - 1] =~ '\a' || line[start - 1] =~ '.' || line[start - 1] =~ '-')
let start -= 1
endwhile
return start
else
" find classes matching "a:base"
let res = []
for m in split(s:matches)
if m =~ '^' . a:base
call add(res, m)
endif
endfor
return res
endif
endfun
Luego cree el archivo ~/.vim/after/ftplugin/css.vim
y ponga en él la siguiente línea:
setlocal completefunc=csscomplete#CompleteFA
Luego puede activar su función de finalización definida por el usuario con <C-x><C-u>
. Intentará encontrar una coincidencia con la última palabra escrita.
En la captura de pantalla, escribí .fa-l
y luego activé la función con <C-x><C-u>
:
¿Como funciona?
Primero, aquí hay algunos temas de documentación relevantes:
Una gran respuesta sobre la organización de archivos.
Si desea crear una finalización personalizada para un tipo de archivo en particular, debe colocarla en el archivo $HOME/.vim/autoload/{FILETYPE}complete.vim
.
Luego, en este archivo, debe crear su función de finalización, que se llama dos veces:
En la primera llamada, su primer argumento es la posición actual del cursor y la función determinará la palabra a completar. En mi función, utilicé 3 comparaciones para completar la palabra porque la clase puede estar compuesta de letras .
y -
(creo que es posible mejorar esta coincidencia, pero estoy muy mal con la expresión regular)
En la segunda llamada, el segundo argumento es la palabra que debe coincidir y luego la función la compara con la lista de posibles clases para que coincida con 1 . Aquí puede ver que devuelvo un diccionario que completará el menú de finalización, pero cuando lea la documentación verá que puede crear un diccionario mucho más complejo para personalizar aún más el comportamiento de su función.
También debe decirle a Vim "para este tipo de archivo, use esta función completa que creé". Para hacerlo, debe establecer completefunc
el nombre de la función que creó (aquí csscomplete#CompleteFA
) y esta configuración debe realizarse en el archivo $HOME/.vim/after/ftplugin/{FILETYPE}.vim
.
1 En mi función, la variable s:matches
contiene todas las coincidencias posibles. Aquí solo pongo algunas sugerencias de legibilidad, pero puedes poner todas las clases ofrecidas por FontAwesome (Puedes encontrar la lista completa en este archivo creado por romainl).
¿Qué pasa si no me gusta Vimscript?
Una posibilidad es usar el complemento YoucompleteMe que ofrece una API para jugar con el menú de finalización. Puede crear la función de Python que hará el trabajo correspondiente y utilizará la API para completar la interfaz de Vim. Más detalles aquí .
:help i_ctrl-x_ctrl-u
.A veces, desea un autocompletado personalizado que no interfiera con ninguno de los autocompletados integrados o definidos por el usuario. Esto es especialmente útil para scripts o complementos que están destinados a funcionar para una amplia gama de tipos de archivos.
Esto se puede hacer bastante fácil con la
complete()
función y un contenedor simple; la mayor parte del procedimiento es el mismo que se describe en:help complete-functions
la respuesta de Statox, excepto que necesita definir sus propias asignaciones y debe llamarse acomplete()
sí mismo en lugar de devolver un valor.Aquí hay un ejemplo básico, los comentarios deben explicar cómo funciona.
fuente