¿Cómo manejo y recuerdo muchas abreviaturas en mi vimrc?

10

Tengo más de 500 abreviaturas ( iabbr, abbr) y algunas asignaciones en mi archivo vimrc de Java, PHP, C / C ++ y Latex.

No es fácil recordar de inmediato cuando no uso los idiomas durante algún tiempo.

Me pregunto si puedo completar el nombre de la abreviatura. ¿Hay alguna forma mejor de acceder / administrar todas estas abreviaturas?

1234
fuente

Respuestas:

10

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-udespués del comienzo de una abreviatura.


El autocmd configura la variable s:abbrev_listque 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 FileTypeevento, por ejemplo.

Consulte :h complete-functionspara 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:

  1. 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.
  2. Agregue la ruta a este archivo a la opción 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Presione C-x C-tdespué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-tdespué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:

ingrese la descripción de la imagen aquí

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-ty 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 ncuando 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 nbandera.

usuario9433424
fuente
Fantástica y completa respuesta. You Rock
1234
\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ <buffer \>) \ s +) {, 2} ( \ k +) no funciona en mi archivo vimrc
1234
@JoobLee Funciona en mi sistema, ¿tienes algún mensaje de error? ¿Funciona con una expresión regular más simple (pero menos confiable) \vi?abbr\s+(\k+)? ¿Podría darme un enlace con un extracto de sus abreviaturas para ver si puedo reproducir su problema?
user9433424
@JoobLee Si su versión de Vim es lo suficientemente reciente, agregue la nbandera a la llamada alternativa (he editado la respuesta para incluirla). Si realiza una búsqueda en su vimrcy copia y pega esto \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, ¿resalta sus abreviaturas?
user9433424
9

Un consejo de wikia sugiere un método para mostrar selectivamente sus abreviaturas:

Puede enumerar todas sus abreviaturas con

:ab<CR>

(reemplace abpor iabpara listar solo abreviaturas de modo de inserción)

Y puede enumerar todas las abreviaturas con el mismo prefijo con

:ab prefix<CR>

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:

iabbrev syso System.out.println("");

Entonces es bueno definirlo así:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

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, :iabse 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:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

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.

statox
fuente
1

¿Qué hay de agrupar las abreviaturas por tipo de archivo?

En lugar de tenerlos todos en su ~/.vimrcarchivo, divídalos y colóquelos en las ubicaciones adecuadas en su directorio de tiempo de ejecución, que se encuentra ~/.vimen 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 .vimrcarchivos 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 .

alwillis
fuente