Quelle est la différence entre les plugins vim snippets?

25

Il existe un grand nombre de plugins d'extraits pour vim: ultisnips , snipmate , xptemplate , neosnippet et bien plus encore.

Ils ont tous des avantages et des inconvénients et plus ou moins de dépendances. Jusqu'à présent, j'utilise des ultisnips mais je n'en ai jamais été totalement satisfait.

Comme nous avons une question très intéressante et complète sur les gestionnaires de plugins, je pense qu'il serait assez utile d'avoir le même genre d'explications sur les plugins d'extraits.

Il y a une liste ici qui pourrait être un bon début mais des réponses complètes, claires et précises que notre communauté peut écrire seraient assez utiles.

statox
la source
1
Vous avez également cette matrice fournie sur le wiki de Marc Weber: vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte
2
À mon humble avis, c'est assez générique, peut-être si vous développez le "jamais été totalement satisfait"? J'utilise "neosnippet.vim" de Shougo.
VanLaser
vous devez mettre à jour le wiki avec les informations d'ici. Merci.
Christian Brabandt
@ChristianBrabandt: Oui dès que j'aurai du temps (dans les prochains jours) je le mettrai à jour.
statox

Réponses:

22

J'utilise les ultisnips depuis plusieurs semaines maintenant.

Je pense que les principaux avantages de ce plugin sont les suivants:

  • C'est assez rapide même avec un grand nombre d'extraits disponibles.
  • La syntaxe de base pour définir un nouvel extrait est facile à comprendre, il est donc facile de créer rapidement un nouvel extrait en faisant ce que vous voulez faire. (Pour des extraits plus complexes, un travail supplémentaire peut être nécessaire.)
  • Cela fonctionne très bien hors de la boîte; une configuration de base vous permet d'utiliser des extraits de code très rapidement.
  • C'est vraiment configurable. Même si la configuration de base fonctionne bien, si vous êtes un utilisateur expérimenté, vous pouvez vraiment l'ajuster assez finement.

Tout d'abord, ultisnips est un moteur d'extraits qui signifie que le plugin fournit des fonctionnalités pour utiliser des extraits mais ne fournit pas les extraits eux-mêmes. Pour obtenir les extraits, l'auteur recommande vim-snippets .

Une fois les deux plugins installés, vous pourrez utiliser vos extraits.

Les snippets de définitions sont stockées dans des fichiers nommés motifs suivants: ft.snippets, ft_*.snippetsou ft/*, où ftest le « filetype » du document en cours et *est une coquille générique correspondant à toute chaîne , y compris la chaîne vide. (Notez que la syntaxe de type de fichier en pointillés comme cuda.cppest prise en charge.)

De cette façon, les extraits de code spécifiques à un type de fichier ne sont développés que lorsque le type de fichier du tampon est défini. Un type de fichier spécial allest disponible pour créer des extraits étendus sur tous les tampons.

En plus des extraits fournis par vim-snippets, l'utilisateur peut définir ses propres extraits. Ma recommandation serait de les placer dans le répertoire de ~/.vim/my-snippets/Ultisnipscette façon, Ultisnips les trouvera sans configuration supplémentaire et il est facile de les conserver dans un référentiel dotfile.

Pour développer les extraits, Ultisnips fournit une variable g:UltiSnipsExpandTrigger qui définit le mappage qui déclenchera l'expansion (j'ai choisi celle **qui me convient le mieux). Notez qu'une intégration devrait être possible mais je ne l'ai pas testée par moi-même).

Pour les utilisateurs expérimentés, Ultisnips fournit également certaines fonctions pour personnaliser le comportement de l'extension ou pour la déclencher différemment. Voir:h UltiSnips-trigger-functions


Il s'agit du premier gestionnaire d'extraits de code que j'ai vraiment beaucoup utilisé et je pense que c'est un bon début pour sa simplicité et sa possibilité d'être réglé.

Enfin, voici une liste de screencasts qui donnent une bonne introduction au plugin:

statox
la source
Savez-vous comment faire en sorte qu'il ne se développe pas lors du déclenchement à moins qu'il ne soit précédé d'espaces OU d'un >(comme dans l'accolade fermante de HTML. Le fait qu'il ne le sache pas à la fin d'une balise est ennuyeux, car si j'active l'option ialors il fait en sorte qu'il le développe même si c'est au milieu d'un mot qui n'est pas bon.
Tallboy
13

J'utilise le SnipMate d' origine depuis que j'ai commencé à utiliser Vim.

  • Il n'a pas de dépendances externes.
  • Il utilise une syntaxe très simple.
  • C'est très simple à installer.
  • Il est abandonné depuis 2009.

Je n'ai rien à redire.

romainl
la source
16
C'est la première fois que je vois quelqu'un mentionner l'abandon comme une caractéristique. : D
muru
6
Un projet abandonné est un projet stable. Vous n'avez pas à vous soucier que votre instance locale soit obsolète ou qu'une mise à jour interrompe votre flux de travail avec un changement d'API. S'il répondait à vos besoins lors de son installation, il continuera de le faire pour toujours. A moins que vos besoins ne changent. La stabilité est la fonctionnalité n ° 1 que je recherche dans n'importe quel outil.
romainl
3
"S'il répondait à vos besoins lorsque vous l'avez installé, il continuera de le faire pour toujours. À moins que vos besoins ne changent." Ou vous trouvez un bogue, à quel point vous devez le corriger vous-même, trouver quelqu'un d'autre pour le corriger ou chercher une alternative; celui qui n'a peut-être pas été abandonné.
1
Merci pour votre réponse @romainl! J'ai une question: vous avez dit que le plugin est abandonné, mais le readme redirige vers une version plus récente qui semble assez active et plusieurs validations semblent corriger certaines choses, n'est-il pas préférable d'utiliser la nouvelle?
statox
1
Il y a quelques bugs et erreurs de documentation dans UltraSnips qui rendent l'expérience d'introduction moins qu'agréable. Après l'avoir finalement lancé, j'ai décidé de vérifier SnipMate et de comprendre l'argument de @ romainl pour la stabilité.
chb
7

Voici une liste des fonctionnalités de mu-template . Discl.: Je suis son mainteneur.

  • Les fichiers modèles peuvent être développés:
    • automatiquement lors de l'ouverture d'un nouveau tampon (sauf s'il est désactivé à partir du .vimrc),
    • explicitement via les menus ou la ligne de commande,
    • du mode INSERT d'une manière semblable à un extrait;
    • du mode VISUAL pour entourer la sélection d'un extrait - l'entourage peut être appliqué à différentes zones de l'extrait (par exemple, des zones de code ou de condition dans une whileinstruction de contrôle);
  • Tous les extraits sont définis dans leur propre fichier modèle - tous les autres moteurs d'extraits utilisent un fichier par type de fichier et y mettent tous les extraits;
  • Les fichiers-modèles peuvent être remplacés par l'utilisateur ou dans le contexte d'un projet spécifique;
  • Des extraits de fichiers spécifiques au type de fichier peuvent être définis pour le mode INSERT (ils peuvent être hérités, par exemple, des extraits de code C peuvent être utilisés à partir de C ++, Java, etc.), la liste des extraits de code correspondants sera présentée avec un indice pour chaque extrait de code;
  • Des expressions VimL calculées peuvent être insérées;
  • Les instructions VimL peuvent être exécutées pendant l'expansion - je l'utilise pour ajouter automatiquement des inclusions manquantes ou importer des instructions;
  • Les fichiers de modèle peuvent inclure d'autres fichiers de modèle de manière fonctionnelle (les paramètres sont même pris en charge) - AFAIK, très peu de moteurs d'extraits de code l'implémentent, ils ne sont même pas en mesure de prendre en charge les alias d'extraits de code, ce qui est trivial à mettre en œuvre grâce à cette fonctionnalité ;
  • Entièrement intégré à mon système d'espace réservé;
  • Prend en charge la ré-indentation (si vous le souhaitez) et l'indentation Python;
  • Fonctionne bien avec pliage vim;
  • I18n amical;
  • Lorsque plusieurs extraits correspondent, un menu de complétion avancé apparaît (il a été inspiré par le menu contextuel YouCompleteMe);
  • Options de style sont automatiquement appliquées (comment préférez-vous vos crochets? if (...) {\n}? if (...)\n{\n}Quelque chose d' autre?), Et bien sûr, ils peuvent être affinés en fonction du projet en cours, ou le type de fichier en cours, ou même les deux;
  • Le plugin est 100% VimL. Python pourrait cependant être utilisé à partir du fichier modèle.
  • mu-template dépend de deux plugins de bibliothèque (lh-vim-lib et lh-dev), et de mon système d'espace réservé (lh-brackets) - c'est pourquoi je recommande de l'installer avec VAM ou VimFlavor car je fournis les fichiers qui déclarent les dépendances;
  • La licence est compatible avec la génération de code - cela signifie que bien que le code mu-template soit sous GPLv3, les extraits ne le sont pas, vous pouvez les utiliser dans du code propriétaire: certains extraits sont cependant sous licence Boost Software;

  • L'expansion se produit après le chargement de tous les vimrcs locaux présents - afin de définir des variables spécifiques au projet avant que l'expansion ne soit effectuée.

  • Grâce au plugin StakeHolders de Tom Link, µTemplate a des espaces réservés liés (la modification d'un espace réservé nommé modifie les autres espaces réservés du même nom). Ne pas installer les parties prenantes ne vous empêchera pas d'utiliser µTemplate.

Pour être parfaitement honnête, la syntaxe du modèle est un peu lourde et le système d'espace réservé appartient à la première génération d'espaces réservés - mu-template est l'un des plus anciens moteurs de modèles / extraits de code pour Vim.

Cependant, le fait qu'il autorise les extraits de code à inclure d'autres extraits de code (conditionnellement et avec des paramètres) qui peuvent ou non être remplacés est très important. Les applications typiques sont

  • le modèle de fichier C ++

    1. qui comprend un en-tête de fichier (généralement affiné différemment pour chaque projet afin d'inclure la bonne notice de copyright)
    2. puis chargez le modèle le mieux adapté au type de fichier actuel (.h, .cpp ou fichier de test unitaire)
      • dans le cas du fichier d'en-tête, des protections anti-réinclusion seront incluses - la façon dont elles sont calculées peut être remplacée (à nouveau pour suivre les politiques du projet)
      • dans le cas des fichiers .cpp, le fichier .h correspondant est automatiquement inclus s'il est trouvé
  • J'ai un extrait / assistant de classe générique dans lh-cpp. Et plusieurs types de classes spécialisées qui utilisent ce modèle de classe commun, mais avec des paramètres différents.

Luc Hermitte
la source
Merci pour votre réponse! J'ai une question: vous avez dit All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it quel est l'avantage de cette architecture par rapport à l'habituelle (ie un fichier par type de fichier)?
statox
@statox Je dirais qu'il s'agit d'un problème de maintenance des extraits. Certains extraits sont excessivement complexes. Jetez un œil à lh-cpp internals/class-skeletonpar exemple. Je préfère ne pas le mélanger avec les extraits de commande. Mais je dois admettre que le fait d'avoir toutes les déclarations de contrôle ensemble ne serait pas si problématique. De plus, grâce à cette approche, je peux très facilement remplacer mes extraits de code, les mettre à jour à la volée, les utiliser comme fonctions, etc.
Luc Hermitte
En effet, quand je vois votre lien, je peux comprendre pourquoi certains extraits vivent mieux dans leurs propres fichiers. Merci pour vos clarifications.
statox
1
@statox En fait, de nombreux extraits que j'ai tendance à être complexes: ils détectent, déduisent et essaient de faire autant de choses intelligentes que possible. La plupart du temps, je déplace le code vers des fonctions chargées automatiquement, mais parfois, il est plus logique d'utiliser plusieurs extraits de code qui s'appellent les uns les autres (et agissent comme des points de variation qui peuvent être ajustés pour les besoins du projet -> déclarations de copyright, ...)
Luc Hermitte
4

SnipMate et UltiSnips sont les deux moteurs d'extraits de code les plus populaires pour Vim. Les deux sont inspirés de la syntaxe d'extrait de TextMate. UltiSnips peut exécuter tous les extraits SnipMate mais possède également une syntaxe supplémentaire pour le rendre plus puissant.

Une bonne règle de base est que si votre Vim prend en charge python, utilisez UltiSnips. Sinon, utilisez SnipMate.

Dans mon .vimrc, je charge (en utilisant Plug) l'un des plugins en fonction de la disponibilité 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 peut également exécuter des codes python dans son extrait, ce qui lui permet de faire des trucs sympas. Ceci est l'un de mes extraits préférés qui dessine une boîte autour d'un texte (de Comment je suis capable de prendre des notes dans des cours de mathématiques en utilisant LaTeX et Vim | Gilles Castel )

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

Avec cet extrait, je peux produire quelque chose comme ceci:

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