2012-10-18 12 views
5

Betrachten Sie den unbinding der PfeiltastenVim: Warum funktioniert Noremap nicht im Einfügemodus?

noremap <Left> <NOP> 
noremap <Right> <NOP> 
noremap <Up> <NOP> 
noremap <Down> <NOP> 

Dies funktioniert im normalen Modus, aber es funktioniert nicht Arbeit im Einfügemodus: man kann immer noch mit den Pfeiltasten navigieren. Als Gegenmaßnahme muss man

inoremap <Left> <NOP> 
inoremap <Right> <NOP> 
inoremap <Up> <NOP> 
inoremap <Down> <NOP> 

umfassen Aber das ist wirklich nicht Sinn für mich, da ich annehme map und noremap in allen Modi arbeiten sollte, während das Voranstellen n/v/x/s/o/i/l/c die Zuordnung gibt innerhalb dieses spezifischen Modus nur zu arbeiten . Gibt es einen Grund dafür?

Antwort

4

warum gibt es keine All-inclusive-modal Karte, anstatt die Ausgabe sowohl Karte und Karte!

, das einfach zu erklären: Modus-Mappings In Einsatz nicht Vim schaltet nicht automatisch in dem normalen Modus (Sie können im Einfügemodus bleiben, obwohl Textübersetzungen typischerweise über :iabb, nicht über :imap getan werden), so Die Menge der anwendbaren Befehle ist völlig anders. Zum Beispiel scrollt Ctrl-U im normalen Modus nach oben, löscht aber im Einfügemodus die eingegebenen Zeichen in der Zeile!

Präfixe wie <C-O> wechseln vorübergehend vom Einfügemodus in den Normalmodus. Eigentlich man oft hat auch einen anderen Präfix für Kommandozeilen-Modus zu definieren, auch, wie dieses Beispiel zeigte:

noremap <C-Tab> :<C-U>tabnext<CR> 
inoremap <C-Tab> <C-O>:tabnext<CR> 
cnoremap <C-Tab> <C-C>:tabnext<CR> 

Also, wenn Zuordnungen definieren, immer zu berücksichtigen, in welchem ​​Modus sie benötigt werden und ob sie brauchen Remapping (:nmap vs :noremap, bevorzugen letztere).

+0

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. –

+0

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. –

1
:help map-overview 

map (und noremap) sind für normale, visuelle, select- und operator-pending-Modi.

+0

Ah! Danke macht sicherlich Sinn. [Ich habe meine Frage auf der Antwort basiert hier basiert, aber ich werde es bearbeiten] (http://stackoverflow.com/questions/3776117/vim-what-ist-the-difference-between-the-remap-noremap- nnoremap-und-vnoremap-ma) also niemand sonst bekommt die falsche Idee, wie ich es tat. Gibt es einen Grund, warum es keine all-inclusive Modal Map gibt, anstatt sowohl map als auch map! –

+0

@nil: Der Grund ist wahrscheinlich, dass Ihr Beispiel der Deaktivierung der Funktionalität einer der wenigen Fälle ist, in denen die gleiche Zuordnung in allen Modi denselben Effekt hat. –

+0

Ich lese von "map-overview" bis zum Ende des Unterabschnitts, der ein wenig schwierig war, durch, nur um zu finden, dass der nächste Unterabschnitt, der * 1.4 LISTING MAPPINGS * (': help map-listing') ist, bietet tatsächlich einen weitaus besseren Überblick als 'map-overview'! –

0

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.

Verwandte Themen