Was ist der Unterschied zwischen den Mapping-Befehlen remap, noremap, nnoremap und vnoremap in Vim?

1113

Was ist der Unterschied zwischen den remap, noremap, nnoremapund vnoremapMapping - Befehlen in Vim?

Chetan
quelle
1
Achtung vnoremapund vmaparbeiten Sie im visuellen UND Auswahlmodus. Verwenden Sie xmapund, um eine Zuordnung nur im visuellen Modus zu erhalten xnoremap.
Benoit

Antworten:

1626

remapist eine Option , mit der Zuordnungen rekursiv funktionieren. Standardmäßig ist es aktiviert und ich würde empfehlen, es so zu belassen. Der Rest sind Zuordnungsbefehle , die unten beschrieben werden:

:mapund :noremapsind rekursive und nicht rekursive Versionen der verschiedenen Zuordnungsbefehle. Das heißt, wenn Sie Folgendes tun:

:map j gg
:map Q j
:noremap W j

jwird zugeordnet gg. Qwird auch zugeordnet gg, da jfür die rekursive Zuordnung erweitert wird. Wwird zugeordnet j(und nicht gg), da jes für die nicht rekursive Zuordnung nicht erweitert wird.

Denken Sie jetzt daran, dass Vim ein modaler Editor ist . Es hat einen normalen Modus, einen visuellen Modus und andere Modi.

Für jeden dieser Zuordnungssätze gibt es eine Zuordnung , die im normalen, visuellen, Auswahl- und Bedienermodus ( :mapund :noremap) funktioniert, eine im normalen Modus ( :nmapund :nnoremap), eine im visuellen Modus ( :vmapund :vnoremap) usw.

Weitere Anleitungen hierzu finden Sie unter:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
DrAl
quelle
8
Danke für deine Antwort! Wann wird rekursiv verwendet und wann wird nicht rekursiv verwendet?
Chetan
14
@Chetan: Es kommt darauf an, was Sie erreichen wollen. Ich neige dazu, nicht rekursiv häufiger zu verwenden, aber wenn Sie ein relativ kompliziertes Mapping mit nicht rekursiv definiert haben und was für ein anderes Mapping alles macht, was das erste Mapping und mehr macht, kann es einfacher sein, ein rekursives Mapping zu verwenden, das das enthält Original, anstatt das gesamte nicht rekursive erneut zu tippen (insbesondere, wenn Sie dann das Original anpassen müssen).
DrAl
10
Ich hatte angenommen noremap, ein Gegenteil von zu sein map. Ich meine etwas, das eine Zuordnung entfernt. Danke für die Antwort. Es hat mich geklärt
Pavan Manjunath
4
Es ist für die meisten Anwendungsfälle nicht so wichtig, aber es sollte beachtet werden, dass :mapusw. nicht in allen Modi funktioniert , genau, nur in allen gängigen (insbesondere im normalen Modus, im visuellen Modus, im Auswahlmodus und) Operator-Pending-Modus). Wenn Sie möchten, dass ein Mapping im Einfüge-, Befehlszeilen- oder Lang-Arg-Modus funktioniert , müssen Sie es verwenden :map!usw. (Quelle: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows
3
@whytheq noremap = nicht rekursives Mapping
Dan Bechard
281

Ich denke, die Vim-Dokumentation hätte die Bedeutung der Benennung dieser Befehle erklären sollen. Nur zu sagen, was sie tun, hilft Ihnen nicht, sich an die Namen zu erinnern.

mapist die "Wurzel" aller rekursiven Zuordnungsbefehle. Die Stammform gilt für die Modi "Normal", "Visual + Select" und "Operator Pending". (Ich verwende den Begriff "Wurzel" wie in der Linguistik .)

noremapist die "Wurzel" aller nicht rekursiven Zuordnungsbefehle. Die Stammform gilt für dieselben Modi wie map. (Stellen Sie sich das norePräfix als "nicht rekursiv" vor.)

(Beachten Sie, dass es auch !solche Modi gibt map!, die für das Einfügen und die Befehlszeile gelten.)

Weiter unten erfahren Sie, was "rekursiv" in diesem Zusammenhang bedeutet.

Wenn Sie einen Modusbuchstaben voranstellen, nz. B. die Modi ändern, in denen das Mapping funktioniert. Sie können eine Teilmenge der Liste der anwendbaren Modi auswählen (z. B. nur "visuell") oder andere Modi auswählen, mapdie nicht zutreffen (z. B. "Einfügen").

Die Verwendung help map-modeszeigt Ihnen einige Tabellen, in denen erläutert wird, wie Sie steuern, für welche Modi das Mapping gilt.

Modusbuchstaben:

  • n: nur normal
  • v: visuell und auswählen
  • o: Operator ausstehend
  • x: nur visuell
  • s: nur auswählen
  • i: einfügen
  • c: Befehlszeile
  • l: Einfügen, Befehlszeile, Regexp-Suche (und andere. Gemeinsam als "Lang-Arg" -Pseudomodus bezeichnet)

" Rekursiv " bedeutet, dass die Zuordnung zu einem Ergebnis erweitert wird, das Ergebnis dann zu einem anderen Ergebnis erweitert wird und so weiter.

Die Erweiterung wird beendet, wenn eine der folgenden Bedingungen erfüllt ist:

  1. Das Ergebnis wird nicht mehr auf etwas anderes abgebildet.
  2. Es wurde eine nicht rekursive Zuordnung angewendet (dh die "Noremap" (oder eine ihrer Karten) ist die endgültige Erweiterung).

Zu diesem Zeitpunkt wird Vims Standard- "Bedeutung" des Endergebnisses angewendet / ausgeführt.

" Nicht rekursiv " bedeutet, dass das Mapping nur einmal erweitert wird und dieses Ergebnis angewendet / ausgeführt wird.

Beispiel:

 nmap K H
 nnoremap H G
 nnoremap G gg

Die oben genannten Ursachen führen Kzu einer Erweiterung zu H, dann Hzu einer Erweiterung Gund einem Stopp. Es stoppt wegen der nnoremap, die sich ausdehnt und sofort stoppt. Die Bedeutung von Gwird ausgeführt (dh "Zur letzten Zeile springen"). In einer Erweiterungskette wird höchstens eine nicht rekursive Zuordnung angewendet (dies wäre die letzte Erweiterung).

Die Zuordnung von Gzu gggilt nur, wenn Sie drücken G, nicht jedoch, wenn Sie drücken K. Diese Zuordnung wirkt sich nicht auf das Drücken aus, Kunabhängig davon, ob sie Grekursiv zugeordnet wurde oder nicht, da Zeile 2 bewirkt, dass die Erweiterung Kgestoppt wird, sodass Zeile 3 nicht verwendet wird.

Kelvin
quelle
4
Eine Sache: mapGilt nur für normale, visuelle, ausgewählte und vom Bediener ausstehende Modi, nicht für alle Modi.
Brian McCutchon
1
sollte Antwort akzeptiert werden.
Tycholiz
Dies ist eine viel bessere Antwort als die akzeptierte.
MilMike
19

Ein Unterschied ist, dass:

  • :map tut nvo== normal + (visuell + auswählen) + Operator ausstehend
  • :map!tut ic == + Befehlszeilenmodus einfügen

wie in den help map-modesTabellen angegeben.

Also: mapwird nicht allen Modi zugeordnet .

Um allen Modi zuzuordnen, benötigen Sie beide :mapund :map!.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
5
Vorsichtig !! command modeist ein anderer historischer Name für normal modenämlich. Kapitel 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). Die Abkürzung 'c' steht für 'Kommandozeile'. Mit anderen Worten, standardmäßig: Ordnet lhs map! lhs rhs rekursiv rhs für die Modi Einfügen + Befehlszeile zu . Dies gilt nur, wenn die remapStandardoption set noremap[!]in ~ / .vimrc explizit deaktiviert ist . In diesem Fall wäre die Zuordnung nicht rekursiv (nicht ratsam).
Cbhihe