it-swarm.com.de

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

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

1019
Chetan

remap ist eine Option , mit der Zuordnungen rekursiv funktionieren. Standardmäßig ist es eingeschaltet und ich würde empfehlen, dass Sie es so belassen. Der Rest sind Zuordnungsbefehle , die im Folgenden beschrieben werden:

:map und :noremap sind rekursiv und nicht rekursiv Versionen der verschiedenen Zuordnungsbefehle. Das heißt, wenn Sie Folgendes tun:

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

j wird gg zugeordnet. Q wird auch gg zugeordnet, da j für die rekursive Zuordnung erweitert wird. W wird j zugeordnet (und nicht gg), da j für die nicht-rekursive Zuordnung nicht erweitert wird.

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

Für jede dieser Zuordnungsgruppen gibt es ein Zuordnung , das im normalen, visuellen, Auswahl- und Bedienermodus (:map und :noremap) funktioniert (:nmap und :nnoremap), eine im visuellen Modus (:vmap und :vnoremap) und so weiter.

Weitere Anleitungen hierzu finden Sie unter:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
1479
DrAl

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

map ist die "Wurzel" aller rekursiven Zuordnungsbefehle. Die Stammform gilt für die Modi "Normal", "Visuell + Auswählen" und "Operator anstehend". (Ich verwende den Begriff "root" wie in Linguistik .)

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

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

Nachfolgend erfahren Sie, was "rekursiv" in diesem Zusammenhang bedeutet.

Wenn Sie einen Modusbuchstaben wie n voranstellen, ändern Sie die Modi, in denen das Mapping ausgeführt wird. Sie können einen Teil der Liste der anwendbaren Modi auswählen (z. B. nur "visuell") oder andere Modi auswählen, die map nicht ausführen würden gelten für (zB "Einfügen").

Mit help map-modes werden einige Tabellen angezeigt, in denen erläutert wird, auf welche Modi die Zuordnung angewendet wird.

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 "Lang-Arg" -Pseudo-Modus genannt)

" Rekursiv " bedeutet, dass die Zuordnung zu einem Ergebnis erweitert wird, dann wird das Ergebnis zu einem anderen Ergebnis erweitert 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 (d. h. die "Noremap" (oder eine ihrer Ausprägungen) ist die endgültige Erweiterung).

Zu diesem Zeitpunkt wird Vims Standardbedeutung des Endergebnisses angewendet/ausgeführt.

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

Beispiel:

 nmap K H
 nnoremap H G
 nnoremap G gg

Das Obige bewirkt, dass K auf H erweitert wird, dann H auf G erweitert wird und angehalten wird. Es stoppt wegen der nnoremap, die sich ausdehnt und sofort stoppt. Die Bedeutung von G wird ausgeführt (d. H. "Zur letzten Zeile springen"). Höchstens eine nicht-rekursive Zuordnung wird jemals in einer Erweiterungskette angewendet (dies wäre die letzte Erweiterung, die stattfinden würde).

Die Zuordnung von G zu gg gilt nur, wenn Sie G drücken, nicht jedoch, wenn Sie K drücken. Diese Zuordnung wirkt sich nicht auf das Drücken von K aus, unabhängig davon, ob G rekursiv zugeordnet wurde oder nicht, da Zeile 2 die Erweiterung von K veranlasst, anzuhalten, sodass Zeile 3 nicht mehr angezeigt wird benutzt.

240
Kelvin

Achtung, vnoremap und vmap funktionieren im visuellen AND-Select-Modus. Verwenden Sie xmap und xnoremap, um eine Zuordnung nur im visuellen Modus zu erhalten.

77
Benoit

Ein Unterschied ist, dass:

  • :map macht nvo == normal + (visuelle + Auswahl) + Operator ausstehend
  • :map! bewirkt ic == Einfügen + Befehlszeilenmodus

wie in help map-modes Tabellen angegeben.

Also: map wird nicht allen Modi zugeordnet.

Für die Zuordnung zu allen Modi benötigen Sie sowohl :map als auch :map!.