Was sind die Unterschiede zwischen den Befehlen map, noremap, abbrev und noreabbrev?

19

Diese Befehle wandeln einen Satz von Tastenanschlägen auf irgendeine Weise in einen anderen um, aber ich bin etwas unsicher, welcher für eine bestimmte Situation am besten geeignet ist. Darüber hinaus gibt es auch die !Varianten. Im Moment ist meine Verwendung ziemlich willkürlich. Könnte ich also wissen, welche Fallstricke mit den einzelnen verbunden sind? Insbesondere Hinweise zu den verschiedenen Modusversionen könnten hilfreich sein, da ich von Peter Rincker in einem Kommentar erfahren habe, dass cmapsich so ziemlich überall in der Zeile erweitern lässt und nicht nur, wenn ich :Befehle verwende. Welche Vorsichtsmaßnahmen kann ich gegen mögliche Fallstricke treffen?

muru
quelle
Der nächste Teil ist ein bisschen meta: Welches Formular sollten wir verwenden, um auf dieser Site zu antworten? - Soll ich das auf Meta stellen oder der Frage hinzufügen?
muru
Ich würde sagen, es kommt darauf an. Ich würde immer die Noremap-Version verwenden, wenn ich eine Zuordnung demonstriere. Auf diese Weise gewöhnen sich die Benutzer an, die nicht rekursiven Zuordnungen gegenüber den rekursiven Versionen zu verwenden. Es sei denn, es gibt einen Grund, eine Karte speziell zu verwenden, z. B. in einem <Plug> -Mapping.
Akshay

Antworten:

21

Erstens, mapund noremapähnlich ist, dass jeder erstellen Zuordnungen für normal, visuelle, wählt und Bediener - Modi anhängig gleichzeitig . Vim beschreibt dies in :help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

Wenn Sie die Zuordnung gemäß der obigen Hilfe auf einen bestimmten Modus beschränken möchten, müssen Sie Folgendes voranstellen:

'n' (für normal), 'v' (für visuell und Auswahl), 'c' (für Befehl), 'x' (für visuellen Modus), 's' (für Auswahl), 'o' (für Operator anstehend ).

Zum Beispiel,

nmap n nzz

erstellt ein rekursives Mapping von n.

Jetzt noremapist nur eine nicht-rekursive Version von map.

Was ist also nicht-rekursives Mapping? Auch darauf hat Vim die Antwort :help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

Ein Beispiel hierfür ist die Zuordnung der folgenden:

:imap j k

:imap k j

Vim ersetzt jetzt j mit k und k mit j unendlich oft und zeigt Ihnen daher einen Fehler, dass Sie ein rekursives Mapping erstellt haben.

Aus diesem Grund wird im Allgemeinen empfohlen, dass Sie fast immer (außer bei <Plug>Zuordnungen oder Ähnlichem) nicht-rekursive Zuordnungen verwenden. Dies verhindert, dass Vim hängen bleibt, wenn Sie versehentlich rekursive Zuordnungen erstellen. Die nicht rekursive Zuordnung ist daher eine sicherere Möglichkeit, Befehle in Vim zuzuordnen.

Mit den obigen Informationen können wir sehen, dass :noreabbreves sich nur um eine nicht rekursive Version des :abbrevBefehls handelt.

Sie können :abbrevnur in den Modi Einfügen, Ersetzen und Befehl verwenden. :abbrevwird zum Erstellen von Abkürzungen verwendet (Abkürzungen, die Vim erweitern kann). Die kurze Erweiterung besteht darin, :map/ :noremapzu verwenden, um Zuordnungen zu erstellen, :abbrev/ :noreabbrevAbkürzungen zu erstellen, oder wann immer Sie möchten, dass Vim Ihre Eingabe erweitert.

akshay
quelle
1
Das Vermeiden von Hängen ist nicht der einzige Grund, die noreFormen des Befehls map zu verwenden. Ein weiterer (und meiner Meinung nach wichtigerer) Grund für ihre Verwendung ist, dass sie Ihre Zuordnungen zuverlässig / vorhersehbar machen. Wenn Sie die einfache Form verwenden und die rhseinen Schlüssel enthält, der zufällig einem anderen Element zugeordnet ist, kann Ihre Zuordnung ein völlig anderes Verhalten aufweisen als beabsichtigt.
Rich