2013-08-31 9 views
34

Ich habe kürzlich ein vim-Plugin mit etwas namens <Plug> gefunden. Zum Beispiel gibt es einen Befehl den ich ausführen möchte.Führen Sie <Plug> Befehle in vim

Ich habe alles wie :<Plug>abc_def und ähnliches versucht. Nichts hat geklappt. Und :help <Plug> gab keine Informationen.

Ich konnte es jedoch ausführen, indem Sie eine Zuordnung :map x <Plug>(unite_redraw) erstellen. Dann kann ich es durch Drücken von x ausführen.

Gibt es nun eine Möglichkeit, :<Plug>abc_def auszuführen, ohne ein Dummy-Mapping zu erstellen, nur um es auszuführen? Das eigentliche Plugin, das ich verwende, ist Unite.

Antwort

44

<Plug> Zuordnungen sind gemeint zu kartieren und über die Karte aufgerufen werden. Eine <Plug> Karte ist ein Gerät, um dem Benutzer eine saubere Schnittstelle von Plugin-Aktionen zur Verfügung zu stellen.


Beispiel: Statt Mapping einige Schlüssel zu einem gewissen Plugin-Funktion in der Fest Code des Plug-Ins, wie "Karte zz der Aktion 'Zentrum Cursor ästhetisch'",

nnoremap <expr> zz 'zz'.float2nr(winheight(0)*0.1).'<C-E>' 

es ist besser, um nur ein benannt <Plug> Zuordnung, die der Benutzer dann neu zuordnen kann, ohne die "Aktion" kopieren und einfügen.

nnoremap <expr> <Plug>NiceCenterCursor 'zz'.float2nr(winheight(0)*0.1).'<C-E>' 
nmap zz <Plug>NiceCenterCursor 

Dies ist dann einfach zu überschreiben, wiederverwenden, Plug-in durch den Benutzer.


<Plug> Zuordnungen sind nur in den Modi sie definiert wurden. Um ein <Plug> Mapping auszuführen, das für den normalen Modus definiert ist, können Sie wie bei jedem normalen Befehl vorgehen: Verwenden Sie :normal (ohne das Ausrufezeichen).

:execute "normal \<Plug>NiceCenterCursor" 

Seit <Plug> tatsächlich eine besondere Magie Schlüssel darstellt, müssen wir :normal zusammen verwenden, um mit :execute und die <Plug> zu entkommen.

Der <Plug> Mechanismus ist in der Tiefe bei :h 41.11 beschrieben. Siehe auch this article about this topic by a Vim master.

+4

Oh, also ist es wichtig, dass das 'nmap'' nmap' ist und nicht 'nnoremap', weil es' NiceCenterCursor' als nur ein anderes Mapping darstellt. Richtig? – Tarrasch

+4

@Tarrasch Genau, die rechte Seite der Karte muss neu zugeordnet werden, damit dies funktioniert. Das Gleiche gilt für ': normal': Es ist wichtig, das (Neuzuordnen)': normal' zu verwenden, nicht das nicht-remapping ': normal!'. – glts