Im Gegensatz zu dem, was Sie erwarten könnten, gelten noremap
und map
nicht für alle Modi.Basierend auf der sehr nützliche Zusammenfassung von :help map-listing
, hier ist eine Liste der Zeichen, die (oder nachgestellten im Fall von !
) zu map
vorangestellt werden kann, noremap
, unmap
und mapclear
, zusammen mit den Modi, die sie gelten für:
- (keine) - normal, Visuelle, Select und Operator angemeldete
n
- Normale
v
- Visuelle und wählen
x
- Visuelle
s
- Wählen
o
- Operator angemeldete
!
- Einfügen und Befehlszeilen
i
- Insert
c
- Befehlszeilen
l
- ": lmap" Zuordnungen für Insert , Befehlszeile und Lang-Arg
So ein noremap
Mapping wird im Einfüge- oder Befehlszeilenmodus keine Wirkung haben und funktioniert möglicherweise auch im Visual-, Select- oder Operator-anstehend-Modus nicht wie beabsichtigt.
Mappings können jedoch angepasst werden, um in verschiedenen Modi zu arbeiten, einfach durch Ändern des Modus und zurück im Mapping. Zum Beispiel noremap
Zuordnungen, die Befehlszeile-Befehle erteilen, sondern nur Arbeit im Normal-Modus auch in den anderen Modi angepasst kann wie in diesem Beispiel gezeigt, zu arbeiten:
noremap <C-Tab> :<C-U>set list!<CR>
inoremap <C-Tab> <C-O>:set list!<CR>
cnoremap <C-Tab> <C-C>:set list!<CR>:<Up>
noremap
gilt für den Normal, Visuell, Select, und Vom Bediener ausgehende Modi, für die :<C-U>
den Befehlszeilenmodus eingibt, löscht dann die aktuelle Zeile, falls Vim einen Bereich einfügt; inoremap
gilt für den Einfügemodus, bei dem <C-O>:
vorübergehend in den Normalmodus wechselt und dann in den Befehlszeilenmodus wechselt; und cnoremap
gilt für den Befehlszeilenmodus, bei dem <C-C>:
den Befehlszeilenmodus verlässt und wieder eingibt, um die Zeile zu löschen, aber im Gegensatz zu <C-U>
, behalten Sie es im Befehlsverlauf, sodass :<Up>
es zurückbringen kann.
Diese drei Mappings decken alle sechs Modi ab. (Anscheinend ist "Lang-Arg" kein Modus.) Es gibt einige Fälle, in denen es nicht funktioniert, aber es gibt auch Fälle, in denen es funktioniert, wenn ich gedacht hätte, dass es nicht funktionieren würde, und ich nicht verstehe nicht warum. Außerdem verlieren die meisten Modi kleine Dinge wie Selektionen und ausstehende Operatoren, auch wenn der zugeordnete Befehl diese Dinge sonst nicht verlieren würde. Im Einfügemodus zum Beispiel sehe ich nicht, warum das Beispiel, das ich angegeben habe, die aktuelle Änderung in separate Änderungen im Rückgängig/Wiederherstellen-Verlauf aufbrechen müsste (versuchen Sie, i123<C-O><Esc>456<Esc>u
einzugeben). Um ehrlich zu sein, benutze ich Schlüssel-Mappings, um Befehle auf diese Weise auszuführen. Das scheint mir ein bisschen wie ein Hack zu sein, aber ich kenne keinen anderen Weg.
Es ist nicht sofort klar, dass Ihr Block Zitat "warum gibt es keine all-inclusive Modal Map, anstatt sowohl Karte und Karte!" Zitiert einen Teil von [Nils Kommentar] (http://stackoverflow.com/questions/12953183 # comment17559832_12953259) auf Paul Ruanes Antwort. –
Also anscheinend soll ich diese Antwort kommentieren, anstatt sie zu reparieren. Das Zitat aus dem Kommentar von nil wird nicht korrekt gelesen, obwohl der ursprüngliche Satz von nil grammatikalisch korrekt ist. '' und '' sind keine Präferenzen; Sie müssen nicht am Start sein. 'nmap' ist nicht das rekursive Äquivalent zu' noremap', also könnte es verbessert werden, indem 'nmap' in' map' geändert wird oder '' map' vs. '* noremap' gesagt wird. Ich habe diese Probleme in einer Bearbeitung behoben, aber sie wurde abgelehnt. Ich schein immer abgemeldet zu werden, entweder zu wenig zu editieren oder zu viel zu schneiden; Ich kann nicht mit den Moderatoren gewinnen. SE ist zu * bürokratisch. –