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.