Como gerencio e lembro de muitas abreviações no meu vimrc?

10

Tenho mais de 500 abreviações ( iabbr, abbr) e alguns mapeamentos no meu arquivo vimrc de Java, PHP, C / C ++ e Latex.

Não é fácil lembrar imediatamente quando não uso os idiomas há algum tempo.

Gostaria de saber se posso concluir o nome da abreviação. Existe alguma maneira melhor de acessar / gerenciar todas essas abreviações?

1234
fonte

Respostas:

10

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-uapós o início de uma abreviação.


O autocmd configura a variável s:abbrev_listque 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 FileTypeevento, por exemplo.

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

  1. 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.
  2. Adicione o caminho para este arquivo na opção 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Clique C-x C-tapó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-tno 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:

insira a descrição da imagem aqui

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-te 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 nquando 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 nsinalizador.

user9433424
fonte
resposta fantástica e abrangente. you Rock
1234
\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ \ buffer \>) \ s +) {, 2} ( \ k +) não está funcionando no meu arquivo vimrc
1234
@JoobLee Funciona no meu sistema, você tem alguma mensagem de erro? Funciona com um regex mais simples (mas menos confiável) \vi?abbr\s+(\k+)? Você poderia me fornecer um link com um trecho das suas abreviações para ver se posso reproduzir seu problema?
User9433424 de
@JoobLee Se a sua versão do Vim for recente o suficiente, adicione o nsinalizador à chamada substituta (editei a resposta para incluí-la). Se você fizer uma pesquisa na sua vimrce copiar e colar isso \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, ela destaca suas abreviações?
User9433424 de
9

Uma dica da wikia sugere um método para exibir seletivamente suas abreviações:

Você pode listar todas as suas abreviações com

:ab<CR>

(substitua abpor iabpara listar apenas as abreviações do modo de inserção)

E você pode listar todas as abreviações com o mesmo prefixo com

:ab prefix<CR>

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:

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

Portanto, é bom defini-lo assim:

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

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:

autocmd! FileType latex call CreateLatexAbbrev()

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

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.

statox
fonte
1

Que tal agrupar as abreviações por tipo de arquivo?

Em vez de ter todos eles em seu ~/.vimrcarquivo, divida-os e coloque-os nos locais apropriados no diretório de tempo de execução, que é ~/.vimem 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 .vimrcarquivos 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 .

Alwillis
fonte