Não sei qual é a melhor maneira de gerenciar mais de 500 abreviações. Talvez a longo prazo, como o @statox explicou, você possa dar uma olhada nos snippets para reduzir esse número.
E se você deseja concluir automaticamente as abreviações, tente o seguinte 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 usá-lo, você teria que pressionar C-x C-u
após o início de uma abreviação.
O autocmd configura a variável s:abbrev_list
que deve conter todas as suas abreviações.
A função CompleteAbbrev()
deve retornar uma lista de candidatos com base na palavra antes do cursor.
O 'completefunc'
valor da opção informa ao Vim qual função chamar quando você pressiona C-x C-u
.
Observe que a opção é local no buffer, portanto, você ainda pode usar outras funções em diferentes tipos de buffers, usando um autocmd e o FileType
evento, por exemplo.
Veja :h complete-functions
para mais informações sobre como a função funciona.
Outra solução seria usar a conclusão 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 solução, você teria que fazer três coisas:
- Escreva
{lhs}
todas as suas abreviações dentro de um arquivo dedicado.
Por exemplo /home/user/mysynonyms.txt
,. E agrupe-os em torno de temas semelhantes.
Adicione o caminho para este arquivo na opção 'thesaurus'
:
set thesaurus+=/home/user/mysynonyms.txt
Clique C-x C-t
após o início do nome de qualquer abreviação dentro de um grupo.
Por exemplo, suponha que você tenha as seguintes abreviações:
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
Você pode agrupá-los de acordo com a linguagem de programação a que pertencem.
Dentro /home/user/mysynonyms.txt
, você escreveria:
cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc
Agora, sempre que você clicar C-x C-t
no nome de uma abreviação (ou apenas no início), o Vim deve exibir, no menu pop-up, todas as abreviações que estão na mesma linha.
Veja como ficaria:
Observe que as abreviações não precisam começar com os mesmos caracteres para serem agrupados; elas podem ser totalmente diferentes. Desde que estejam na mesma linha do seu arquivo de sinônimos, o Vim mostrará todos eles.
E você não precisa usar a linguagem de programação para decidir em qual grupo colocar uma abreviação. Você pode agrupá-los de acordo com qualquer similaridade / tópico / categoria significativa que tiver em mente.
Assim, quando você esquecer uma abreviação específica, poderá digitar as primeiras letras de uma categoria, clicar C-x C-t
e escolher a relevante dentro do menu.
Edit:
Para despejar todas as suas abreviações /home/user/mysynonyms.txt
, você pode usar estes 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:
eu adicionei o sinalizador n
quando a substitute()
função é chamada porque você não precisa de substituição. Seu único objetivo é adicionar uma abreviação dentro de uma lista sempre que uma for encontrada.
Mas como você tem muitas abreviações, isso pode tornar o processo inutilmente lento, eu não sei. Inicialmente, não o coloquei porque não sei qual versão do Vim você está usando. Se sua versão for mais recente que 7.3.627 , deverá estar ok, caso contrário, você precisará remover o n
sinalizador.