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.
\vi?abbr\s+(\k+)
? Você poderia me fornecer um link com um trecho das suas abreviações para ver se posso reproduzir seu problema?n
sinalizador à chamada substituta (editei a resposta para incluí-la). Se você fizer uma pesquisa na suavimrc
e copiar e colar isso\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
, ela destaca suas abreviações?Uma dica da wikia sugere um método para exibir seletivamente suas abreviações:
Você pode listar todas as suas abreviações com
(substitua
ab
poriab
para listar apenas as abreviações do modo de inserção)E você pode listar todas as abreviações com o mesmo prefixo com
Isso não é tão ideal quanto a conclusão de abreviações, mas pode ser uma boa maneira de obter rapidamente uma lista de suas abreviações existentes.
Para tornar essa solução mais eficiente, uma boa prática seria criar uma abreviação específica para um tipo de arquivo. Por exemplo, esta abreviação é útil apenas em um buffer java:
Portanto, é bom defini-lo assim:
A parte de comando automático permite criar a abreviação apenas quando você estiver em um buffer java e a
<buffer>
opção tornar a abreviação acessível somente a partir desse buffer.Dessa forma
:iab
, a abreviação será exibida apenas quando você estiver em um buffer java. Se você tiver muitas abreviações, pode ser interessante criar uma função por tipo de arquivo que defina todas as abreviações e permita que o comando automático chame a função. Algo como:Outra solução poderia ser criar sua própria função de preenchimento automático usando uma lista da sua abreviação como fonte de palavras-chave.
Finalmente, tenho que dizer que estou impressionado com "mais de 500 abreviações", não sei quais você está usando, mas talvez seja interessante para você dar uma olhada no conceito de snippets, se você não estiver familiarizado com eles. Como são modelos acionados ao digitar uma palavra-chave e pressionar uma tecla de atalho, eles são mais flexíveis do que as abreviações, pode permitir reduzir o número de abreviações que você está usando. Veja aqui uma introdução interessante.
fonte
Que tal agrupar as abreviações por tipo de arquivo?
Em vez de ter todos eles em seu
~/.vimrc
arquivo, divida-os e coloque-os nos locais apropriados no diretório de tempo de execução, que é~/.vim
em sistemas operacionais semelhantes ao Unix.Por exemplo, suas abreviações do Markdown estariam localizadas no arquivo
~/.vim/after/ftplugin/markdown.vim
, que o Vim verifica após o carregamento do plug-in do tipo de arquivo Markdown.Acontece que não devemos ter
.vimrc
arquivos enormes ; você obtém mais flexibilidade usando$VIMRUNTIME
. O caminho de tempo de execução está documentado no sistema de ajuda do Vim::h 'runtimepath'
.Aprendi sobre isso pela primeira vez no excelente artigo De .vimrc a .vim no calendário de advento Vimways, com o tema Vim .
fonte