tutorial texto insertar editar descargar commands comandos vim

texto - vim python



¿Cómo crear breves fragmentos en Vim? (6)

Recientemente comencé a usar Vim como mi editor de texto y actualmente estoy trabajando en mis propias personalizaciones.

Supongo que las asignaciones de teclado pueden hacer casi cualquier cosa, pero por el momento las estoy usando como una especie de recurso de fragmentos de código casi exclusivamente.

Entonces, por ejemplo, si :imap def{TAB} def ():<ESC>3ha def{TAB} ( :imap def{TAB} def ():<ESC>3ha ), se expande a:

def |(): # ''|'' represents the caret

Esto funciona como se esperaba, pero me resulta molesto cuando Vim espera un comando completo mientras estoy escribiendo una palabra que contiene "def" y no estoy interesado en expandirla.

  • ¿Hay alguna manera de evitar esto o utilizar esta función de manera más efectiva para este fin?
  • ¿Hay alguna otra característica de Vim más adecuada para esto?

Después de echar un rápido vistazo a SnippetsEmu , parece que es la mejor opción y mucho más fácil de personalizar de lo que pensé en un principio.

Para continuar con el ejemplo anterior:

:Snippet def <{}>():

Una vez definido, puede expandir su fragmento escribiendo def{TAB} .


Acabo de instalar UltiSnips . Hay un buen artículo que explica por qué puede elegir UltiSnips: ¿Por qué UltiSnips?

No he usado ninguno de los otros complementos de fragmentos; Decidí dar el paso con uno que parecía completo y que podría acomodarme a medida que ganase más habilidades de Vim y quisiera hacer cosas más sofisticadas.


Como otra sugerencia (aunque ligeramente diferente) usando la funcionalidad incorporada de vim:

:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT>

Ahora, cada vez que escriba def seguido de un espacio u otro carácter que no sea de palabra, se ampliará al mismo valor que el resultado de SnippetsEmu (el espacio proviene del espacio que ingresó para activar la terminación).

Este enfoque no sufre el problema de "retraso" que encontró al usar: inoremap, y está incorporado en vim. Para obtener más información sobre esta función, consulte :help abbrev .

Es posible que le preocupe que se active por espacio, no por tabulación, se activará innecesariamente, pero en general, vim es muy inteligente sobre cuándo dispararlo. El problema se puede mitigar adicionalmente habilitando la abreviatura solo para ciertos tipos de archivos (por ejemplo, python):

au filetype python :iabbrev ... etc

Snip [ets] (Manager | Emu | Mate | .vim) es, por supuesto, también una solución perfecta, pero es bueno estar al tanto de las alternativas (especialmente cuando están integradas).


Como señaló MDCore, SnippetsEmu es un popular script de Vim que hace exactamente eso y más. Si solo necesita expandir (sin mover el cursor), puede usar el comando estándar :ab[breviate] .

: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.


Si SnippetsEmu es demasiado pesado o ambicioso para lo que necesita (fue para mí), escribí un complemento que administra los fragmentos basados ​​en el tipo de archivo. ¡Incluso tiene la finalización de pestañas al elegir el fragmento! :)

Obtenlo aquí: snippets.vim



SnippetsEmu es un complemento útil de fragmentos de código.