vim mehrere spezifische Zuordnungen

373
omnesia

Was ist der beste Weg, um mehrere Modi für eine Karte in vim anzugeben?


Ich weiß, dass nmap x ybeim Empfang von x y ausgelöst wird normal mode,

imap x ylöst beim Empfang von x y aus insert modeund so weiter.

Angenommen, ich möchte diese beiden Modi ausdrücklich. Dann kann ich nicht verwenden map x y.

Wenn Sie nur zwei Zeilen schreiben, wird viel Unordnung erzeugt, wenn Sie mehrere Mappings ausführen.

0

1 Antwort auf die Frage

0
DJMcMayhem

Von :h mapmode-n:

Es gibt sechs Zuordnungen

  • Für den Normalmodus: Wenn Sie Befehle eingeben.
  • Für den visuellen Modus: Wenn Sie Befehle eingeben, während der visuelle Bereich hervorgehoben ist.
  • Für den Auswahlmodus: Wie der visuelle Modus, aber die Eingabe von Text ersetzt die Auswahl.
  • Für anstehenden Operator-Modus: Wenn ein Operator ansteht (nach "d", "y", "c" usw.). Siehe unten: | omap-info |.
  • Für den Einfügemodus. Diese werden auch im Ersetzungsmodus verwendet.
  • Für den Befehlszeilenmodus: Bei Eingabe eines Befehls ":" oder "/".

Es gibt viele verschiedene Möglichkeiten, ein Mapping zu erstellen. Wenn Sie :h mapsehen, für welche Modi die verschiedenen Befehle Modi zur Verfügung stellen:

:map |mapmode-nvo| *:map* :nm[ap] |mapmode-n| *:nm* *:nmap* :vm[ap] |mapmode-v| *:vm* *:vmap* :xm[ap] |mapmode-x| *:xm* *:xmap* :smap |mapmode-s| *:smap* :om[ap] |mapmode-o| *:om* *:omap* :map! |mapmode-ic| *:map!* :im[ap] |mapmode-i| *:im* *:imap* :lm[ap] |mapmode-l| *:lm* *:lmap* :cm[ap] |mapmode-c| *:cm* *:cmap* 

Wie Sie sehen, :mapsagt das mapmode-nvo, was für den normalen, visuellen und für den Bediener anstehenden Modus steht. Das ist der Grund, map x yder im Normalmodus nicht funktioniert. Wenn Sie diese Liste durchsehen, können Sie sehen, wie es keine von ihnen gibt mapmode-in. Es gibt also keine Möglichkeit, dies zu tun. Sie müssen also nmap x yund tun imap x y. Oder wenn Sie möchten, dass es für jeden Modus gilt map x y, und map! x y.

Wenn Sie nur zwei Zeilen schreiben, wird viel Unordnung erzeugt, wenn Sie mehrere Mappings ausführen.

Wenn Sie wirklich viele Zuordnungen durchführen, können Sie Folgendes tun:

function! DoubleMap(x, y) exec "nmap ".x." ".y exec "imap ".x." ".y endfunction 

Dann

imap x y nmap x y imap foo bar nmap foo bar imap blah spam nmap blah spam 

Wird

call DoubleMap('x', 'y') call DoubleMap('foo', 'bar') call DoubleMap('blah', 'spam') 

Dies ist jedoch ein Problem, wenn Ihr Mapping Anführungszeichen oder nicht druckbare Zeichen enthält.

Vielen Dank für diese ausführliche Antwort. Schade, dass es für diese Kombination keinen Mapmode gibt. Anscheinend muss ich an dieser Stelle allgemein mehr über Vimscript lernen. Die Verwendung einer Funktion scheint eine gute Option für einfache Bindungen zu sein. omnesia vor 6 Jahren 0
@omnesia Froh, ich könnte helfen! :) Übrigens gibt es auch eine [vi & vim-Site] (https://vi.stackexchange.com), die generell besser für vim-spezifische Fragen geeignet ist. DJMcMayhem vor 6 Jahren 0