Was ist der Unterschied zwischen den Vim Snippets Plugins?


25

Es gibt eine große Anzahl von Snippets-Plugins für Vim: Ultisnips , Snipmate , Xptemplate , Neosnippet und vieles mehr.

Sie alle haben Vor- und Nachteile und mehr oder weniger Abhängigkeiten. Bisher habe ich Ultisnips verwendet, war aber noch nie total zufrieden damit.

Da wir eine sehr interessante und vollständige Frage zu Plugin-Managern haben, halte ich es für ziemlich nützlich, die gleichen Erklärungen zu Snippets-Plugins zu haben.

Es gibt hier eine Auflistung , die ein guter Anfang sein könnte, aber einige vollständige, klare und präzise Antworten, die unsere Community schreiben kann, wären ziemlich nützlich.


1
Sie haben auch diese Matrix auf Marc Weber-Wiki bereitgestellt
Luc Hermitte

2
IMHO ist das ziemlich allgemein, vielleicht, wenn Sie das "nie völlig zufrieden damit gewesen" erarbeiten? Ich benutze Shougos "neosnippet.vim".
VanLaser

Sie sollten das Wiki mit den Informationen von hier aktualisieren. Vielen Dank.
Christian Brabandt

@ChristianBrabandt: Ja, sobald ich etwas Zeit habe (in den nächsten Tagen), werde ich es aktualisieren.
statox

Antworten:


22

Ich benutze Ultisnips seit einigen Wochen.

Ich denke, die Hauptvorteile dieses Plugins sind die folgenden:

  • Es ist ziemlich schnell, auch wenn eine große Anzahl von Snippets verfügbar ist.
  • Die grundlegende Syntax zum Definieren eines neuen Snippets ist einfach zu verstehen, sodass Sie schnell ein neues Snippet erstellen können, das das tut, was Sie tun möchten. (Für komplexere Snippets kann zusätzliche Arbeit erforderlich sein.)
  • Es funktioniert sehr gut aus der Box; Mit einer Grundkonfiguration können Sie Snippets sehr schnell verwenden.
  • Es ist wirklich konfigurierbar. Auch wenn die Grundkonfiguration gut funktioniert, können Sie sie als Power-User wirklich sehr fein einstellen.

Zunächst einmal ist ultisnip eine Snippet-Engine, was bedeutet, dass das Plugin Funktionen zur Verwendung von Snippets bereitstellt, die Snippets selbst jedoch nicht. Um die Snippets zu erhalten, empfiehlt der Autor vim-snippets .

Sobald Sie beide Plugins installiert haben, können Sie Ihre Snippets verwenden.

Die Schnipsel Begriffsbestimmungen in Dateien gespeichert sind , folgenden Muster genannt: ft.snippets, ft_*.snippets, oder ft/*, wo ftist der ‚Dateityp‘ des aktuellen Dokuments und *eine schalenartige Wildcard - Matching beliebige Zeichenfolge einschließlich dem leeren String. (Beachten Sie, dass die Syntax von gepunkteten Dateitypen cuda.cppunterstützt wird.)

Auf diese Weise werden für einen Dateityp spezifische Snippets nur dann erweitert, wenn der Dateityp des Puffers festgelegt ist. Ein spezieller Dateityp allist verfügbar, um Snippets zu erstellen, die auf allen Puffern erweitert sind.

Zusätzlich zu den von vim-snippets bereitgestellten Snippets kann der Benutzer eigene Snippets definieren. Meine Empfehlung wäre, sie so in das Verzeichnis zu stellen ~/.vim/my-snippets/Ultisnips, dass Ultisnips sie ohne zusätzliche Konfiguration findet, und es ist einfach, sie in einem Dotfile-Repository zu verwalten.

Um die Snippets zu erweitern, stellt Ultisnips eine Variable zur Verfügung, g:UltiSnipsExpandTrigger die das Mapping definiert, das die Erweiterung auslöst (ich habe gewählt, **was für mich recht praktisch ist). Beachten Sie, dass eine Integration möglich sein sollte, aber ich habe es nicht selbst getestet).

Für Power-User bietet Ultisnips auch einige Funktionen, um das Verhalten der Erweiterung anzupassen oder sie anders auszulösen. Sehen:h UltiSnips-trigger-functions


Dies ist der erste Snippet-Manager, den ich wirklich ausgiebig verwendet habe, und ich denke, dies ist zunächst einmal ein guter, da er sofort einsatzbereit ist und gestimmt werden kann.

Zum Schluss hier eine Liste von Screencasts, die eine gute Einführung in das Plugin geben:


Wissen Sie, wie man es so macht, dass es beim Auslösen nicht expandiert, es sei denn, es steht vor einem Leerzeichen ODER einem >(wie in schließender Klammer von HTML) Die Option idann macht es so, dass es es erweitert, auch wenn es in der Mitte eines Wortes, das nicht gut ist.
Tallboy

12

Ich benutze den ursprünglichen SnipMate seit ich Vim benutze.

  • Es gibt keine externen Abhängigkeiten.
  • Es verwendet eine sehr einfache Syntax.
  • Es ist sehr einfach einzurichten.
  • Es wurde seit 2009 aufgegeben.

Ich habe nichts zu beanstanden.


16
Das ist das erste Mal, dass ich jemanden sehe, der Verlassenheit als Merkmal erwähnt. : D
muru

6
Ein aufgegebenes Projekt ist ein stabiles Projekt. Sie müssen sich keine Sorgen machen, dass Ihre lokale Instanz veraltet ist oder dass ein Update Ihren Workflow durch eine API-Änderung unterbricht. Wenn es Ihren Anforderungen bei der Installation entsprach, wird es dies für immer tun. Es sei denn, Ihre Bedürfnisse ändern sich. Stabilität ist das wichtigste Merkmal, nach dem ich bei jedem Werkzeug Ausschau halte.
Romainl

3
"Wenn es Ihren Anforderungen bei der Installation entsprach, wird es dies für immer tun. Es sei denn, Ihre Anforderungen ändern sich." Oder Sie finden einen Fehler. An diesem Punkt müssen Sie ihn selbst beheben, jemanden finden, der ihn behebt, oder nach einer Alternative suchen. vielleicht eine, die nicht aufgegeben wurde.

1
Danke für deine Antwort @romainl! Ich habe eine Frage: Sie sagten, das Plugin sei verlassen, aber die Readme-Datei verweist auf eine neuere Version, die ziemlich aktiv zu sein scheint, und mehrere Commits scheinen einige Probleme zu beheben. Ist es nicht besser, das neue zu verwenden?
statox

1
Es gibt einige Fehler und Dokumentationsfehler in UltraSnips, die zu einer unangenehmen Einführung führen. Nachdem ich es endlich zum Laufen gebracht hatte, entschloss ich mich, SnipMate auszuprobieren und kann @ romainls Argument für Stabilität verstehen.
chb

7

Hier ist eine Liste der Funktionen von mu-template . Discl .: Ich bin sein Betreuer.

  • Template-Dateien können erweitert werden:
    • automatisch beim Öffnen eines neuen Puffers (sofern nicht aus der .vimrc deaktiviert),
    • explizit über Menüs oder die Befehlszeile,
    • aus dem INSERT-Modus auf schnipselartige Weise;
    • aus dem VISUAL-Modus, um die Auswahl mit einem Snippet zu umgeben - das Surrounding kann auf verschiedene Zonen im Snippet angewendet werden (z. B. Code- oder Bedingungszonen in einer whileSteueranweisung);
  • Alle Snippets werden in einer eigenen Vorlagendatei definiert. Alle anderen Snippet-Engines verwenden eine Datei pro Dateityp und fügen alle Snippets ein.
  • Die Vorlagendateien können vom Benutzer oder im Rahmen eines bestimmten Projekts überschrieben werden.
  • Für den INSERT-Modus können Dateityp-spezifische Snippets definiert werden (sie können vererbt werden, z. B. können C-Snippets aus C ++, Java usw. verwendet werden). Die Liste der übereinstimmenden Snippets wird mit einem Hinweis für jedes Snippet angezeigt.
  • Berechnete VimL-Ausdrücke können eingefügt werden.
  • VimL-Anweisungen können während der Erweiterung ausgeführt werden. Ich verwende sie, um fehlende Includes oder Importanweisungen automatisch hinzuzufügen.
  • Vorlagendateien können andere Vorlagendateien auf funktionsähnliche Weise enthalten (Parameter werden sogar unterstützt) - AFAIK, nur sehr wenige Snippet-Engines implementieren dies, sie können nicht einmal Snippet-Aliase unterstützen, was dank der einfachen Implementierung trivial ist Dieses Feature ;
  • Vollständig in mein Platzhaltersystem integriert;
  • Unterstützt erneutes Einrücken (falls gewünscht) und Python-Einrücken;
  • Funktioniert gut mit Vim-Falzen;
  • I18n freundlich;
  • Wenn mehrere Snippets übereinstimmen, wird ein erweitertes Abschlussmenü angezeigt (das vom YouCompleteMe-Popup-Menü inspiriert wurde).
  • Style - Optionen werden automatisch angewendet (wie bevorzugen Sie Ihre Klammern? if (...) {\n}? if (...)\n{\n}Etwas anderes?), Und natürlich können sie fein je nach dem aktuellen Projekt abgestimmt werden, oder die aktuelle Datei des Typs, oder sogar beides;
  • Das Plugin ist 100% VimL. Python kann jedoch aus der Vorlagendatei verwendet werden.
  • mu-template hängt von zwei Bibliotheks-Plugins (lh-vim-lib und lh-dev) und von meinem Platzhaltersystem (lh-brackets) ab - daher empfehle ich, es mit VAM oder VimFlavor zu installieren, wenn ich die deklarierenden Dateien zur Verfügung stelle die Abhängigkeiten;
  • Die Lizenz ist mit der Codegenerierung kompatibel. Das bedeutet, dass mu-template-Code zwar unter GPLv3, die Snippets jedoch nicht. Sie können sie jedoch in proprietärem Code verwenden. Einige Snippets befinden sich jedoch unter Boost Software License.

  • Die Erweiterung erfolgt nach dem Laden vorhandener lokaler vimrcs, um projektspezifische Variablen festzulegen, bevor die Erweiterung durchgeführt wird.

  • Dank des StakeHolders-Plugins von Tom Link hat µTemplate Platzhalter gebunden (durch Ändern eines benannten Platzhalters werden andere Platzhalter mit demselben Namen geändert). Wenn Sie Stakeholder nicht installieren, können Sie µTemplate nicht verwenden.

Um ganz ehrlich zu sein, ist die Template-Syntax etwas umständlich und das Platzhaltersystem gehört zur ersten Platzhalter-Generation - mu-template ist eine der ältesten Template- / Snippets-Engines für Vim.

Es ist jedoch sehr wichtig, dass Snippets andere Snippets (bedingt und mit Parametern) enthalten können, die möglicherweise überschrieben werden oder nicht. Typische Anwendungen sind

  • die C ++ - Dateivorlage

    1. die einen Datei-Header enthält (normalerweise für jedes Projekt unterschiedlich fein abgestimmt, um den richtigen Copyright-Hinweis einzubeziehen)
    2. Laden Sie dann die Vorlage, die am besten zum aktuellen Dateityp passt (.h-, .cpp- oder Unit-Test-Datei).
      • Im Fall von Header-Dateien werden Anti-Wiedereinschluss-Schutzmaßnahmen eingeschlossen - die Art und Weise, wie sie berechnet werden, kann überschrieben werden (erneut, um die Projektrichtlinien zu befolgen).
      • Im Fall von CPP-Dateien wird die entsprechende H-Datei automatisch einbezogen, wenn sie gefunden wird
  • Ich habe ein allgemeines Klassen-Snippet / Wizard in lh-cpp. Und mehrere spezialisierte Klassenarten , die diese gemeinsame Klassenvorlage verwenden, aber unterschiedliche Parameter haben.


Danke für deine Antwort! Ich habe eine Frage: Sie sagten, All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it was ist der Vorteil dieser Architektur gegenüber der üblichen (dh eine Datei pro Dateityp)?
statox

@statox Ich würde sagen, dies ist ein Snippets-Wartungsproblem. Einige Schnipsel sind zu komplex. Schauen Sie sich internals/class-skeletonzum Beispiel lh-cpp an. Ich hätte es lieber nicht mit den Kontrollanweisungsschnipsel gemischt. Aber ich muss zugeben, dass es nicht so problematisch wäre, alle Kontrollanweisungen zusammen zu haben. Darüber hinaus kann ich dank dieses Ansatzes sehr einfach meine Snippets überschreiben, sie im laufenden Betrieb aktualisieren, sie als Funktionen verwenden usw.
Luc Hermitte

In der Tat, wenn ich Ihren Link sehe, kann ich verstehen, warum einige Schnipsel besser in ihren eigenen Dateien leben. Vielen Dank für Ihre Klarstellung.
statox

1
@statox Tatsächlich sind viele Schnipsel, die ich habe, in der Regel komplex: Sie erkennen, leiten daraus ab und versuchen, so viele clevere Dinge wie möglich zu tun. Die meiste Zeit verschiebe ich den Code auf automatisch geladene Funktionen, aber manchmal ist es sinnvoller, mehrere Ausschnitte zu verwenden , die sich gegenseitig aufrufen (und als Variationspunkte dienen, die für Projektanforderungen optimiert werden können -> Copyright-Vermerke, ...)
Luc Hermitte

4

SnipMate und UltiSnips sind die beiden beliebtesten Snippet-Engines für Vim. Beide sind von der Snippet-Syntax von TextMate inspiriert. UltiSnips kann alle SnipMate-Snippets ausführen, verfügt jedoch auch über eine zusätzliche Syntax, um die Funktionalität zu verbessern.

Als Faustregel gilt: Wenn Ihr Vim Python unterstützt, verwenden Sie UltiSnips. Wenn nicht, verwenden Sie SnipMate.

In my .vimrclade ich (mit Plug) je nach Python-Verfügbarkeit eines der beiden Plugins.

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 kann auch Python-Codes in seinem Snippet ausführen, sodass es einige coole Tricks ausführen kann. Dies ist einer meiner Lieblingsausschnitte, der ein Kästchen um einen Text zeichnet (von Wie ich in Mathematik-Vorlesungen mit LaTeX und Vim | Gilles Castel Notizen machen kann )

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

Mit diesem Snippet kann ich so etwas ausgeben:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.