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.
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:
Das Ergebnis wird nicht mehr auf etwas anderes abgebildet.
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.
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 rhsrekursiv 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).
vnoremap
undvmap
arbeiten Sie im visuellen UND Auswahlmodus. Verwenden Siexmap
und, um eine Zuordnung nur im visuellen Modus zu erhaltenxnoremap
.Antworten:
remap
ist 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::map
und:noremap
sind rekursive und nicht rekursive Versionen der verschiedenen Zuordnungsbefehle. Das heißt, wenn Sie Folgendes tun:j
wird zugeordnetgg
.Q
wird auch zugeordnetgg
, daj
für die rekursive Zuordnung erweitert wird.W
wird zugeordnetj
(und nichtgg
), daj
es 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 (
:map
und:noremap
) funktioniert, eine im normalen Modus (:nmap
und:nnoremap
), eine im visuellen Modus (:vmap
und:vnoremap
) usw.Weitere Anleitungen hierzu finden Sie unter:
quelle
noremap
, ein Gegenteil von zu seinmap
. Ich meine etwas, das eine Zuordnung entfernt. Danke für die Antwort. Es hat mich geklärt:map
usw. 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 )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.
map
ist 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 .)noremap
ist die "Wurzel" aller nicht rekursiven Zuordnungsbefehle. Die Stammform gilt für dieselben Modi wiemap
. (Stellen Sie sich dasnore
Präfix als "nicht rekursiv" vor.)(Beachten Sie, dass es auch
!
solche Modi gibtmap!
, 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,
n
z. 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,map
die nicht zutreffen (z. B. "Einfügen").Die Verwendung
help map-modes
zeigt Ihnen einige Tabellen, in denen erläutert wird, wie Sie steuern, für welche Modi das Mapping gilt.Modusbuchstaben:
n
: nur normalv
: visuell und auswähleno
: Operator ausstehendx
: nur visuells
: nur auswähleni
: einfügenc
: Befehlszeilel
: 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:
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:
Die oben genannten Ursachen führen
K
zu einer Erweiterung zuH
, dannH
zu einer ErweiterungG
und einem Stopp. Es stoppt wegen dernnoremap
, die sich ausdehnt und sofort stoppt. Die Bedeutung vonG
wird 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
G
zugg
gilt nur, wenn Sie drückenG
, nicht jedoch, wenn Sie drückenK
. Diese Zuordnung wirkt sich nicht auf das Drücken aus,K
unabhängig davon, ob sieG
rekursiv zugeordnet wurde oder nicht, da Zeile 2 bewirkt, dass die ErweiterungK
gestoppt wird, sodass Zeile 3 nicht verwendet wird.quelle
map
Gilt nur für normale, visuelle, ausgewählte und vom Bediener ausstehende Modi, nicht für alle Modi.Ein Unterschied ist, dass:
:map
tutnvo
== normal + (visuell + auswählen) + Operator ausstehend:map!
tutic
== + Befehlszeilenmodus einfügenwie in den
help map-modes
Tabellen angegeben.Also:
map
wird nicht allen Modi zugeordnet .Um allen Modi zuzuordnen, benötigen Sie beide
:map
und:map!
.quelle
command mode
ist ein anderer historischer Name fürnormal mode
nä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 lhsmap! lhs rhs
rekursiv rhs für die Modi Einfügen + Befehlszeile zu . Dies gilt nur, wenn dieremap
Standardoptionset noremap[!]
in ~ / .vimrc explizit deaktiviert ist . In diesem Fall wäre die Zuordnung nicht rekursiv (nicht ratsam).