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.
plugin-ultisnips
snippets
statox
fuente
fuente
Respuestas:
He estado usando ultisnips durante varias semanas.
Creo que las principales ventajas de este complemento son las siguientes:
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_*.snippets
oft/*
, dondeft
es 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 quecuda.cpp
se 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
all
está 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/Ultisnips
esta 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:
fuente
>
(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óni
entonces lo hace para que se expanda incluso si está en el medio de una palabra que no es buena.He estado usando el SnipMate original desde que comencé a usar Vim.
No tengo nada de qué quejarme.
fuente
Aquí hay una lista de características de mu-template . Discl .: Soy su mantenedor.
while
declaración de control);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;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 ++
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.
fuente
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)?internals/class-skeleton
por 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, etcSnipMate 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.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 )
Con este fragmento, puedo generar algo como esto:
fuente