No sé cuál es la mejor manera de gestionar más de 500 abreviaturas. Tal vez a largo plazo, como explicó @statox, podría echar un vistazo a los fragmentos para reducir este número.
Y si desea completar automáticamente las abreviaturas, puede probar el siguiente código:
augroup GetAbbrev
autocmd!
autocmd VimEnter * let s:abbrev_list = [] |
\ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END
set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
if a:findstart
return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
else
return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
endif
endfunction
Para usarlo, deberías golpear C-x C-u
después del comienzo de una abreviatura.
El autocmd configura la variable s:abbrev_list
que debe contener todas sus abreviaturas.
La función CompleteAbbrev()
debe devolver una lista de candidatos basada en la palabra antes del cursor.
El 'completefunc'
valor de la opción le dice a Vim a qué función llamar cuando golpeas C-x C-u
.
Tenga en cuenta que la opción es local para el búfer, por lo que aún podría usar otras funciones en diferentes tipos de búferes, usando un autocmd y el FileType
evento, por ejemplo.
Consulte :h complete-functions
para obtener más información sobre cómo funciona la función.
Otra solución sería utilizar la finalización de sinónimos. De :h i_^x^t
:
*i_CTRL-X_CTRL-T*
CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses
the 'thesaurus' option instead of 'dictionary'. If a
match is found in the thesaurus file, all the
remaining words on the same line are included as
matches, even though they don't complete the word.
Thus a word can be completely replaced.
For an example, imagine the 'thesaurus' file has a
line like this:
angry furious mad enraged
Placing the cursor after the letters "ang" and typing
CTRL-X CTRL-T would complete the word "angry";
subsequent presses would change the word to "furious",
"mad" etc.
Other uses include translation between two languages,
or grouping API functions by keyword.
Para usar esta solución, deberías hacer 3 cosas:
- Escriba el
{lhs}
de todas sus abreviaturas dentro de un archivo dedicado.
Por ejemplo, /home/user/mysynonyms.txt
. Y agrúpelos en torno a temas similares.
Agregue la ruta a este archivo a la opción 'thesaurus'
:
set thesaurus+=/home/user/mysynonyms.txt
Presione C-x C-t
después del comienzo del nombre de cualquier abreviatura dentro de un grupo.
Por ejemplo, suponga que tiene las siguientes abreviaturas:
iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC
iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC
iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC
Puede agruparlos según el lenguaje de programación al que pertenecen.
En el interior /home/user/mysynonyms.txt
, escribirías:
cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc
Ahora, cada vez que pulse C-x C-t
después del nombre de una abreviatura (o solo su comienzo), Vim debería mostrar, en el menú emergente, todas las abreviaturas que están en la misma línea.
Así es como se vería:
Tenga en cuenta que las abreviaturas no necesitan comenzar con los mismos caracteres para ser agrupados, podrían ser completamente diferentes. Mientras estén en la misma línea en su archivo de sinónimos, Vim los mostrará a todos.
Y no tiene que usar el lenguaje de programación para decidir en qué grupo poner una abreviatura. Puede agruparlos de acuerdo con cualquier similitud / tema / categoría significativa que tenga en mente.
Entonces, cuando olvida una abreviatura específica, puede escribir las primeras letras de una categoría, presionar C-x C-t
y elegir la correspondiente dentro del menú.
Editar:
para volcar todas sus abreviaturas /home/user/mysynonyms.txt
, puede usar estos 3 comandos Ex:
:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')
Edit2:
agregué la bandera n
cuando substitute()
se llama a la función porque no necesita ninguna sustitución. Su único propósito es agregar una abreviatura dentro de una lista cada vez que se encuentra una.
Pero debido a que tiene muchas abreviaturas, podría hacer que el proceso sea inútilmente lento, no lo sé. Inicialmente, no lo puse porque no sé qué versión de Vim estás usando. Si su versión es más reciente que 7.3.627 , debería estar bien, de lo contrario, tendría que eliminar la n
bandera.
\vi?abbr\s+(\k+)
? ¿Podría darme un enlace con un extracto de sus abreviaturas para ver si puedo reproducir su problema?n
bandera a la llamada alternativa (he editado la respuesta para incluirla). Si realiza una búsqueda en suvimrc
y copia y pega esto\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
, ¿resalta sus abreviaturas?Un consejo de wikia sugiere un método para mostrar selectivamente sus abreviaturas:
Puede enumerar todas sus abreviaturas con
(reemplace
ab
poriab
para listar solo abreviaturas de modo de inserción)Y puede enumerar todas las abreviaturas con el mismo prefijo con
Esto no es tan ideal como completar una abreviatura, pero podría ser una buena manera de tener rápidamente una lista de sus abreviaturas existentes.
Para hacer esta solución más eficiente, una buena práctica sería crear una abreviatura específica para un tipo de archivo. Por ejemplo, esta abreviatura solo es útil en un búfer de Java:
Entonces es bueno definirlo así:
La parte de autocomando permite crear la abreviatura solo cuando está en un búfer de Java y la
<buffer>
opción hace que la abreviatura sea accesible solo desde este búfer.De esta manera,
:iab
se mostrará la abreviatura solo cuando se encuentre en un búfer de Java. Si tiene muchas abreviaturas, puede ser interesante crear una función por tipo de archivo que defina todas las abreviaturas y permita que el autocomando llame a la función. Algo como:Otra solución podría ser crear su propia función de autocompletar utilizando una lista de su abreviatura como fuente de palabras clave.
Finalmente, tengo que decir que estoy bastante impresionado con "más de 500 abreviaturas", no sé cuáles está utilizando, pero tal vez le resulte interesante echar un vistazo al concepto de fragmentos si no está familiarizado con ellos. Como son plantillas que se activan al ingresar una palabra clave y presionar una tecla de acceso rápido, son más flexibles que las abreviaturas, podría permitirle reducir la cantidad de abreviaturas que está utilizando. Vea aquí para una introducción interesante.
fuente
¿Qué hay de agrupar las abreviaturas por tipo de archivo?
En lugar de tenerlos todos en su
~/.vimrc
archivo, divídalos y colóquelos en las ubicaciones adecuadas en su directorio de tiempo de ejecución, que se encuentra~/.vim
en sistemas operativos tipo Unix.Por ejemplo, sus abreviaturas de Markdown se ubicarían en el archivo
~/.vim/after/ftplugin/markdown.vim
, que Vim verificará después de que se cargue el complemento de tipo de archivo Markdown.Resulta que no deberíamos tener
.vimrc
archivos enormes ; obtienes más flexibilidad usando$VIMRUNTIME
. La vía de ejecución, está documentado en el sistema de ayuda de Vim::h 'runtimepath'
.Lo aprendí por primera vez del excelente artículo De .vimrc a .vim en el calendario de adviento de Vim Vimways .
fuente