¿Cuál es la diferencia entre los complementos de fragmentos de vim?

25

Hay una gran cantidad de complementos de fragmentos para vim: ultisnips , snipmate , xptemplate , neosnippet y mucho más.

Todos tienen pros y contras y más o menos dependencias. Hasta ahora he estado usando ultisnips pero nunca he estado totalmente satisfecho con él.

Como tenemos una pregunta muy interesante y completa sobre los administradores de complementos , creo que sería bastante útil tener el mismo tipo de explicaciones sobre los complementos de fragmentos.

No es una lista aquí que podría ser un buen comienzo, pero algunas respuestas completas, claras y precises como nuestra comunidad puede escribir sería muy útil.

statox
fuente
1
También tiene esta matriz provista en el wiki de Marc Weber: vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte
2
En mi humilde opinión esto es bastante genérico, tal vez si elaboras el "nunca ha estado totalmente satisfecho con él"? Yo uso "neosnippet.vim" de Shougo.
VanLaser
deberías actualizar el wiki con la información de aquí. Gracias.
Christian Brabandt
@ChristianBrabandt: Sí, tan pronto como tenga algo de tiempo (en los próximos días) lo actualizaré.
statox

Respuestas:

22

He estado usando ultisnips durante varias semanas.

Creo que las principales ventajas de este complemento son las siguientes:

  • Es bastante rápido incluso con una gran cantidad de fragmentos disponibles.
  • La sintaxis básica para definir un nuevo fragmento es fácil de entender, por lo tanto, es fácil crear rápidamente un nuevo fragmento haciendo lo que desea hacer. (Para fragmentos más complejos se puede requerir un trabajo adicional).
  • Funciona muy bien fuera de la caja; Una configuración básica le permite utilizar fragmentos muy rápidamente.
  • Es realmente configurable. Incluso si la configuración básica funciona bien, si eres un usuario avanzado, puedes sintonizarlo muy bien.

En primer lugar, ultisnips es un motor de fragmentos, lo que significa que el complemento proporciona características para usar fragmentos pero no proporciona los fragmentos en sí. Para obtener los fragmentos, el autor recomienda los fragmentos vim .

Una vez que haya instalado ambos complementos, podrá usar sus fragmentos.

Los fragmentos de definiciones se almacenan en archivos denominados siguientes patrones: ft.snippets, ft_*.snippetso ft/*, donde ftes el 'tipo de archivo' del documento actual y *es una forma de concha concordancia de comodines cualquier cadena incluyendo la cadena vacía. (Tenga en cuenta que cuda.cppse admite la sintaxis punteada de tipo de archivo ).

De esta manera, los fragmentos específicos de un tipo de archivo se expanden solo cuando se establece el tipo de archivo del búfer. Un tipo de archivo especial allestá disponible para crear fragmentos expandidos en todos los buffers.

Además de los fragmentos proporcionados por vim-snippets, el usuario puede definir sus propios fragmentos. Mi recomendación sería colocarlos en el directorio de ~/.vim/my-snippets/Ultisnipsesta manera Ultisnips los encontrará sin configuración adicional y es fácil mantenerlos en un repositorio de archivos de puntos.

Para expandir los fragmentos, Ultisnips proporciona una variable g:UltiSnipsExpandTrigger que define el mapeo que desencadenará la expansión (elegí **cuál es bastante conveniente para mí). Tenga en cuenta que una integración debería ser posible pero no la probé yo sola).

Para los usuarios avanzados, Ultisnips también proporciona algunas funciones para personalizar el comportamiento de la expansión o para activarla de manera diferente. Ver:h UltiSnips-trigger-functions


Este es el primer administrador de fragmentos que realmente utilicé ampliamente y creo que este es un buen comienzo, por su simplicidad fuera de la caja y su posibilidad de ajuste.

Finalmente, aquí hay una lista de screencasts que ofrecen una buena introducción al complemento:

statox
fuente
¿Sabes cómo hacerlo para que no se expanda al disparar a menos que esté precedido por un espacio en blanco O a >(como al cerrar la llave de HTML. El hecho de que no sepa que está al final de una etiqueta es molesto, porque si habilito la opción ientonces lo hace para que se expanda incluso si está en el medio de una palabra que no es buena.
Tallboy
13

He estado usando el SnipMate original desde que comencé a usar Vim.

  • No tiene dependencias externas.
  • Utiliza una sintaxis muy simple.
  • Es muy fácil de configurar.
  • Ha sido abandonado desde 2009.

No tengo nada de qué quejarme.

romainl
fuente
16
Es la primera vez que veo a alguien mencionar el abandono como una característica. : D
muru
66
Un proyecto abandonado es un proyecto estable. No necesita preocuparse de que su instancia local esté desactualizada o de que una actualización interrumpa su flujo de trabajo con un cambio de API. Si satisface sus necesidades cuando lo instaló, continuará haciéndolo para siempre. A menos que cambien sus necesidades. La estabilidad es la característica # 1 que busco en cualquier herramienta.
romainl
3
"Si satisface sus necesidades cuando lo instaló, continuará haciéndolo para siempre. A menos que sus necesidades cambien". O bien, encuentra un error, en ese momento necesita repararlo usted mismo, encontrar a alguien más que lo solucione o buscar una alternativa; uno que no ha sido abandonado, tal vez.
1
Gracias por tu respuesta @romainl! Tengo una pregunta: Dijiste que el complemento está abandonado, pero el archivo readme redirige a una versión más nueva que parece bastante activa y varias confirmaciones parecen arreglar algunas cosas, ¿no es mejor usar la nueva?
statox
1
Hay algunos errores y errores de documentación en UltraSnips que hacen que la experiencia introductoria sea menos que placentera. Después de finalmente ponerlo en funcionamiento, decidí revisar SnipMate y puedo entender el argumento de @ romainl para la estabilidad.
chb
7

Aquí hay una lista de características de mu-template . Discl .: Soy su mantenedor.

  • Los archivos de plantilla se pueden expandir:
    • automáticamente al abrir un nuevo búfer (a menos que esté desactivado desde el .vimrc),
    • explícitamente a través de menús o la línea de comando,
    • desde el modo INSERTAR en forma de fragmento;
    • desde el modo VISUAL para rodear la selección con un fragmento: el entorno puede aplicarse a diferentes zonas en el fragmento (por ejemplo, zonas de código o condición en una whiledeclaración de control);
  • Todos los fragmentos están definidos en su propio archivo de plantilla: todos los demás motores de fragmentos usan un archivo por tipo de archivo y colocan todos los fragmentos en él;
  • Los archivos de plantilla pueden ser anulados por el usuario o en el contexto de un proyecto específico;
  • Se pueden definir fragmentos específicos de tipo de archivo para el modo INSERTAR (se pueden heredar, por ejemplo, se pueden usar fragmentos C de C ++, Java, etc.), la lista de fragmentos coincidentes se presentará con una pista para cada fragmento;
  • Se pueden insertar expresiones VimL calculadas;
  • Las instrucciones de VimL se pueden ejecutar durante la expansión: lo uso para agregar automáticamente las inclusiones faltantes o las declaraciones de importación;
  • Los archivos de plantilla pueden incluir otros archivos de plantilla de una manera similar a la función (incluso los parámetros son compatibles): AFAIK, muy pocos motores de fragmentos implementan esto, ni siquiera son capaces de admitir alias de fragmentos, lo cual es trivial de implementar gracias a Esta característica ;
  • Totalmente integrado con mi sistema de marcadores de posición;
  • Admite la sangría (si lo desea) y la sangría de Python;
  • Funciona bien con vim plegable;
  • I18n amigable;
  • Cuando coinciden varios fragmentos, aparece un menú de finalización avanzado (se ha inspirado en el menú emergente YouCompleteMe);
  • Las opciones de estilo se aplican automáticamente (¿cómo prefiere sus corchetes? ¿ if (...) {\n}? if (...)\n{\n}¿Algo más?) Y, por supuesto, se pueden ajustar según el proyecto actual o el tipo de archivo actual, o incluso ambos;
  • El complemento es 100% VimL. Sin embargo, Python podría usarse desde el archivo de plantilla.
  • mu-template depende de dos complementos de biblioteca (lh-vim-lib y lh-dev) y de mi sistema de marcador de posición (lh-brackets); por eso recomiendo instalarlo con VAM o VimFlavor ya que proporciono los archivos que declaran las dependencias
  • La licencia es compatible con la generación de código, lo que significa que si bien el código mu-template está bajo GPLv3, los fragmentos no lo están, puede usarlos en código propietario: algunos fragmentos están bajo la Licencia de software Boost;

  • La expansión se produce después de cargar cualquier vimrcs local presente, con el fin de establecer variables específicas del proyecto antes de que se complete la expansión.

  • Gracias al complemento StakeHolders de Tom Link, µTemplate tiene marcadores de posición vinculados (la modificación de un marcador de posición con nombre modifica otros marcadores de posición con el mismo nombre). No instalar Stakeholders no le impedirá usar µTemplate.

Para ser sincero, la sintaxis de la plantilla es un poco engorrosa y el sistema de marcador de posición pertenece a la primera generación de marcadores de posición: mu-template es uno de los motores de plantillas / fragmentos más antiguos para Vim.

Sin embargo, el hecho de que permite que los fragmentos incluyan otros fragmentos (condicionalmente y con parámetros) que pueden ser anulados o no es bastante importante. Las aplicaciones típicas son

  • la plantilla de archivo C ++

    1. que incluye un encabezado de archivo (generalmente ajustado de manera diferente para cada proyecto para incluir el aviso de copyright correcto)
    2. luego cargue la plantilla que mejor se ajuste al tipo de archivo actual (.h, .cpp o archivo de prueba unitaria)
      • en el caso del archivo de encabezado, se incluirán guardas anti-reinclusión; la forma en que se computan puede ser anulada (nuevamente para seguir las políticas del proyecto)
      • en el caso de los archivos .cpp, el archivo .h correspondiente se incluye automáticamente si se encuentra
  • Tengo un fragmento de clase genérico / asistente en lh-cpp. Y varios tipos de clases especializadas que usan esta plantilla de clase común, pero con diferentes parámetros.

Luc Hermitte
fuente
¡Gracias por tu respuesta! Tengo una pregunta: ¿ha dicho All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it cuál es la ventaja de esta arquitectura en comparación con la habitual (es decir, un archivo por tipo de archivo)?
statox
@statox Yo diría que este es un problema de mantenimiento de fragmentos. Algunos fragmentos son excesivamente complejos. Eche un vistazo a lh-cpp, internals/class-skeletonpor ejemplo. Prefiero no mezclarlo con los fragmentos de instrucciones de control. Pero debo admitir que tener todas las declaraciones de control juntas no sería tan problemático. Además, gracias a este enfoque, que pueden reemplazar muy fácilmente mis fragmentos, actualizarlos sobre la marcha, utilizarlos como funciones, etc
Luc HERMITTE
De hecho, cuando veo su enlace, puedo entender por qué algunos fragmentos viven mejor en sus propios archivos. Gracias por sus aclaraciones
statox
1
@statox En realidad, muchos fragmentos que tengo tienden a ser complejos: detectan, deducen e intentan hacer tantas cosas inteligentes como sea posible. La mayoría de las veces muevo el código a funciones cargadas automáticamente, pero a veces tiene más sentido usar varios fragmentos que se llaman entre sí (y actúan como puntos de variación que pueden ajustarse para las necesidades del proyecto -> declaraciones de derechos de autor, ...)
Luc Hermitte
4

SnipMate y UltiSnips son los dos motores de fragmentos más populares para Vim. Ambos están inspirados en la sintaxis de fragmentos de TextMate. UltiSnips puede ejecutar todos los fragmentos de SnipMate pero también tiene una sintaxis adicional para hacerlo más potente.

Una buena regla general es que si su Vim tiene soporte para python, entonces use UltiSnips. Si no, entonces use SnipMate.

En mi .vimrc, cargo (usando Plug) cualquiera de los complementos dependiendo de la disponibilidad de python.

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnips también puede ejecutar códigos de python en su fragmento, lo que le permite hacer algunos trucos geniales. Este es uno de mis fragmentos favoritos que dibuja un cuadro alrededor de un texto (de Cómo puedo tomar notas en conferencias de matemáticas usando LaTeX y Vim | Gilles Castel )

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

Con este fragmento, puedo generar algo como esto:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
otter.pro
fuente