Cómo crear fragmentos cortos en Vim?


Recientemente he comenzado 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 instalación de fragmentos casi exclusivamente.

Así que, por ejemplo, si escribo 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 escribo una palabra que contiene " def " y no estoy interesado en expandirlo.

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

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

Para continuar con el ejemplo anterior:

:Snippet def <{}>():

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

 28
vim
Author: Peter Mortensen, 2008-08-19

6 answers

SnippetsEmu es un complemento útil de snippets.

 5
Author: MDCore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 20:49:19

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}
 34
Author: SergioAraujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-25 23:11:10

Como otra sugerencia (aunque ligeramente diferente) usando la funcionalidad integrada 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 expandirá a lo mismo que lo que ha dado como salida de SnippetsEmu (el espacio proviene del espacio que ingresó para activar la finalización).

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

Puede que le preocupe que al ser activado por espacio no tabulación se disparará innecesariamente, pero en general vim es bastante inteligente sobre cuándo activarlo. 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).

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-30 05:21:22

Si SnippetsEmu es demasiado pesado o ambicioso para lo que necesita (lo era para mí), escribí un plugin que administra fragmentos basados en el tipo de archivo. Incluso tiene la terminación de la pestaña al elegir el fragmento! :)

Consíguelo aquí: fragmentos.vim

 6
Author: Jeremy Cantrell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-01 08:21:41

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

No he utilizado ninguno de los otros complementos de fragmento; decidí dar el paso con uno que parecía con todas las funciones y sería capaz de acomodarme a medida que gano más habilidades Vim y quiero hacer cosas más sofisticadas.

 5
Author: alwillis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-29 06:12:46

Como señala MDCore, SnippetsEmu es un popular script Vim que hace precisamente eso y más. Si solo necesita expandir (sin mover hacia atrás el recuadro), 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.
 4
Author: Sébastien RoccaSerra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-16 00:04:29