Pergunta
Recentemente comecei a usar o Vim como meu editor de texto e atualmente estou trabalhando em minhas próprias personalizações.
Suponho que os mapeamentos de teclado possam fazer praticamente qualquer coisa, mas por enquanto estou usando-os quase exclusivamente como uma espécie de recurso de snippets.
Então, por exemplo, se eu digitar def{TAB}
(:imap def{TAB} def ():<ESC>3ha
), ele se expande para:
def |(): # '|' represents the caret
Isso funciona como esperado, mas acho irritante quando o Vim espera por um comando completo enquanto digito uma palavra contendo "def" e não estou interessado em expandi-lo.
- Existe uma maneira de evitar isso ou usar essa função de forma mais eficaz para esse fim?
- Algum outro recurso do Vim é mais adequado para isso?
Depois de dar uma rápida olhada SnippetsEmu, parece que é a melhor opção e muito mais fácil de personalizar do que eu pensava.
Para continuar com o exemplo anterior:
:Snippet def <{}>():
Uma vez definido, você pode expandir seu snippet digitando def{TAB}
.
Solução
SnippetsEmu é um plugin de snippets útil.
Outras dicas
Snipmate - como texmate :)http://www.vim.org/scripts/script.php?script_id=2540
vídeo:http://vimeo.com/3535418
snippet def
""" ${1:docstring} """
def ${2:name}:
return ${3:value}
Como outra sugestão (embora um pouco diferente) usando a funcionalidade integrada do vim:
:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT>
Agora, sempre que você digitar def seguido por um espaço ou outro caractere que não seja de palavra, ele será expandido para o mesmo que você forneceu como saída de SnippetsEmu (o espaço vem do espaço que você inseriu para acionar a conclusão).
Essa abordagem não sofre o problema de "atraso" que você encontrou ao usar :inoremap e está integrada ao vim.Para obter mais informações sobre esse recurso, consulte :help abbrev
.
Você pode estar preocupado com o fato de ser acionado por espaço e não por guia, ele será acionado desnecessariamente, mas em geral o vim é bastante inteligente sobre quando acioná-lo.O problema também pode ser mitigado ativando a abreviação apenas para determinados tipos de arquivo (por exemplo, python):
au filetype python :iabbrev ... etc
Snip[ets] (Manager|Emu|Mate|.vim) também é, obviamente, uma solução perfeita, mas é bom estar ciente das alternativas (especialmente quando elas estão integradas).
Se o SnippetsEmu for muito pesado ou ambicioso para o que você precisa (era para mim), escrevi um plugin que gerencia snippets com base no tipo de arquivo.Ele ainda possui preenchimento de guia ao escolher o snippet!:)
Venha aqui: trechos.vim
Acabei de instalar UltiSnips.Há um bom artigo que explica por que você pode escolher o UltiSnips: Por que UltiSnips?
Não usei nenhum dos outros plug-ins de snippet;Decidi arriscar com um que parecesse completo e fosse capaz de me acomodar à medida que eu ganhasse mais habilidades no Vim e quisesse fazer coisas mais sofisticadas.
Conforme observado pelo MDCore, SnippetsEmu é um script Vim popular que faz exatamente isso e muito mais.Se você precisar apenas expandir (sem mover o cursor para trás), poderá usar o padrão :ab[breviate]
comando.
:ab[breviate] [<expr>] {lhs} {rhs}
add abbreviation for {lhs} to {rhs}. If {lhs} already
existed it is replaced with the new {rhs}. {rhs} may
contain spaces.
See |:map-<expr>| for the optional <expr> argument.