2008-08-18 7 views
27

Ich habe vor kurzem begonnen, Vim als meinen Texteditor zu verwenden und arbeite gerade an meinen eigenen Anpassungen.Wie erstelle ich kurze Snippets in Vim?

Ich nehme an, Tastaturzuordnungen können so ziemlich alles Mögliche, aber vorläufig verwende ich sie als eine Art Snippets-Einrichtung fast ausschließlich.

So zum Beispiel, wenn ich tippe def{TAB} (:imap def{TAB} def():<ESC>3ha), dehnt es sich zu:

def |(): # '|' represents the caret 

Dies funktioniert wie erwartet, aber ich es ärgerlich, wenn Vim für einen vollständigen Befehl wartet, während ich die Eingabe ein Wort, das "def" enthält und nicht daran interessiert ist, es zu erweitern.

  • Gibt es eine Möglichkeit, dies zu vermeiden oder diese Funktion effektiver zu diesem Zweck zu verwenden?
  • Ist eine andere Vim-Funktion besser dafür geeignet?

Nach einem kurzen Blick auf SnippetsEmu nehmen, es sieht aus wie es die beste Option ist und viel einfacher zu gestalten, als ich zuerst dachte.

mit dem vorherigen Beispiel fortzufahren:

:Snippet def <{}>(): 

Einmal definiert, können Sie Ihre Schnipsel, indem Sie def{TAB} erweitern.

+0

Vielleicht wären Makros besser für kurze Schnipsel geeignet? –

Antwort

5

SnippetsEmu ist ein nützliches Snippets-Plugin.

+2

Ihre Link-Only-Antwort sendet mir etwas über CouchDB. Deshalb sind Link-Only-Antworten schrecklich. Zugegebenermaßen haben Sie den Link zumindest so formuliert, dass ich zumindest Google durchsuchen kann. Sie sollten Ihren Link zu dem offiziellen ändern, wie das OP/die Frage hat. – James

4

Wie von MDCore erwähnt, ist SnippetsEmu ein beliebtes Vim-Skript, das genau das und mehr tut. Wenn Sie nur expandieren müssen (ohne das Caret zurück zu verschieben), können Sie den Standardbefehl :ab[breviate] verwenden.

: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. 
6

Wenn SnippetsEmu zu schwer ist oder ehrgeizig für das, was man braucht (es ist für mich), schrieb ich ein Plugin, das Schnipsel basierend auf Dateityp verwaltet. Es hat sogar eine Tabulator-Vervollständigung, wenn das Snippet ausgewählt wird! :)

es hier: snippets.vim

34

Snipmate - wie texmate :) http://www.vim.org/scripts/script.php?script_id=2540

Video: http://vimeo.com/3535418

snippet def 
    """ ${1:docstring} """ 
    def ${2:name}: 
     return ${3:value} 
+0

Freaking super !!!! Großes Skript voyeg3r. Genau das, was ich gesucht habe. – Daniel

+1

sowohl XPTemplate als auch UltiSnips sind eine Verbesserung gegenüber snipMate – user1825480

+1

Snipmate hat eine aktuelle Verzweigung unter https://github.com/garbas/vim-snipmate und verwendet ein Repo von Snippets unter https://github.com/honza/snipmate-snippets – caspyin

5

I UltiSnips gerade installiert haben. Es gibt einen guten Artikel, der erklärt, warum Sie UltiSnips wählen können: Why UltiSnips?

Ich habe keine der anderen Schnipsel-Plugins verwendet; Ich entschied mich dazu, den Sprung mit einer voll ausgestatteten Version zu wagen, die mir entgegenkommen würde, da ich mehr Vim-Fähigkeiten erwerben und mehr anspruchsvolle Dinge tun würde.

+0

Ich habe sowohl Snipmate als auch UltiSnips ausprobiert und ohne Zweifel ist UltiSnips bei weitem besser, weil es einfacher ist, Änderungen vorzunehmen und Snippets zu erstellen. – SergioAraujo

7

Als weiterer Vorschlag (wenn auch etwas anders) in Funktionalität gebaut Vims mit:

:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT> 

Nun, wenn Sie auf jeden Fall durch ein Leerzeichen oder andere Nicht-Wortzeichen gefolgt Typ, wird es auf die gleiche erweitern, was Sie habe ich als Ausgabe von SnippetsEmu angegeben (der Speicherplatz kommt von dem Raum, den Sie eingegeben haben, um die Fertigstellung auszulösen).

Dieser Ansatz leidet nicht unter dem "Lag" -Problem, das Sie bei der Verwendung von: inoremap und eingebautem vim gefunden haben. Weitere Informationen zu dieser Funktion finden Sie unter :help abbrev.

Sie könnten besorgt sein, dass durch Leerzeichen nicht ausgelöst wird, wird es unnötig auslösen, aber im Allgemeinen ist vim ziemlich schlau darüber, wann es ausgelöst werden soll. Das Problem kann zusätzlich durch Aktivieren der Abkürzung nur für bestimmte Dateitypen (zB Python) gemildert werden:

au filetype python :iabbrev ... etc 

Snip [ets] (-Manager | Emu | Kamerad | .vim) ist natürlich auch eine perfekte Lösung , aber es ist schön, sich der Alternativen bewusst zu sein (besonders wenn sie eingebaut sind).