Andere Möglichkeiten, den Einfügemodus zu verlassen, außer Escape

74

Der Hauptgrund, warum ich Vim gegenüber Emacs mag, ist, dass meine Handbewegung von der Startreihe sehr gering ist (selbst als Programmierer). Das einzige Mal, dass ich dies tue, ist das Verlassen des Einfügemodus durch Drücken von Escape.

Ich habe kürzlich erfahren, dass ich mit Strg + C auch den Einfügemodus verlassen kann. Dies ist jedoch keine wirkliche Verbesserung.

Wie kann ich den Einfügemodus beenden, ohne dass meine Hände die Startreihe verlassen und ohne dass sich das, was ich tippen kann, massiv auswirkt? Hinweis: Ich verwende hauptsächlich Vanille-Vim mit einem Dvorak-Tastaturlayout, würde aber auch gerne Lösungen für ein QWERTY-Layout hören.

durron597
quelle
1
Sie können überall eine beliebige Tastenkombination zuordnen und sonst nichts tun. Meinst Du das?
yo‘
3
Erlernen der Tastenkombination Strg + c THX!
Philippe Gachoud
Wie wäre es, die Feststelltaste als Esc zuzuordnen?
Kolob Canyon
@PhillippeGachaud: Verwenden Sie Ctrl-C nicht als Ersatz für Esc. Strg-C ist nicht dasselbe wie Escape, es ist ein erzwungenes Escape und kann sich unter bestimmten Umständen anders verhalten .
Lie Ryan

Antworten:

60

Eine häufige Bindung, die Sie sehen werden, ist jj , da sie für QWERTZ-Layouts gut geeignet ist, wenn Sie die Startzeilenpositionierung verwenden.

inoremap jj <ESC>

Wenn jjSie in diesem Fall ein Literal eingeben möchten , sollten Sie zwischen der Eingabe des zweiten Zeichens (standardmäßig) 1 Sekunde warten. (siehe :help 'timeout'für Details)

Es gibt auch c-owelche, die Sie aus der Einfügung herausnehmen, einen normalen Befehl ausführen lassen und Sie dann direkt wieder in die Einfügung zurückbringen.

http://vim.wikia.com/wiki/Avoid_the_escape_key

jared
quelle
1
In Dvorak jist der cSchlüssel. Das wäre also nicht schlecht (zum Tippen cc). Ich könnte auch binden hh(qwerty jkey = dvorak h), was mich nur booten würde, wenn ich tippe shhhhhhhoder so.
Durron597
7
cc ist eine häufigere Kombination aus zwei Buchstaben, zumindest in englischer Sprache. Das ist vielleicht nicht die beste Wahl
Nick J Adams
4
Wie wäre es mit Nachahmung jk? Finden Sie zwei Schlüssel, die in Dvorak nebeneinander liegen, aber in Ihrer bevorzugten Sprache keine gebräuchlichen Kombinationen darstellen. tnist zum Beispiel das Positionsäquivalent von jk.
David Lord
1
Ich mag es irgendwie, den normalen Modus zu haben jk/ zu kjverlassen, sogar in Dvorak. Sie sind die Tasten "c" und "v" auf einer QWERTZ-Tastatur, daher sind sie für meinen linken Zeiger und meinen Mittelfinger einfach.
Alxndr
2
Ich denke, wir können es noch besser machen - iistattdessen verwenden. Ja, Sie müssen Ihre Finger von der Startreihe wegbewegen, aber es ist immer noch bequem. Und noch entscheidender ist, dass Sie zwischen den Modi wechseln können, ohne Ihren Finger zu bewegen.
Sridhar Sarnobat
38

Neben den eingebauten Alternativen <C-[>und <C-c>den <Esc>von anderen genannten Schlüsseln besteht eine weitere beliebte Lösung darin, die Zuordnung <CapsLock>als zusätzliches Escape vorzunehmen . Dies gilt sowohl für eine QWERTY- als auch für eine DVORAK-Tastatur.

Auf diese Weise können Sie mit dem linken kleinen Finger ganz einfach die Esc-Taste drücken, ohne die Hände aus der HomeRow zu entfernen (in CapsLock befand sich übrigens zu dem Zeitpunkt, als vi erfunden wurde, Escape auf den Tastaturen).

Remapping kann erfolgen:

  • unter Windows mit dem Dienstprogramm AutoHotKey ;
  • auf Mac mit dem Dienstprogramm KeyRemap4MacBook und anderen;
  • unter Linux variiert je nach Desktop-Umgebung. Zum Beispiel unter Linux ist Mint / Cinnamon nur eine Frage der Auswahl der richtigen Option unter Menü-> Tastatur-> Tastaturlayout-> Feststelltaste. Alternativ, aber weniger einfach, kann es mit dem Programm xmodmap auf Xorg-Ebene neu zugeordnet werden und die folgende .XmodmapDatei ausführen :

    clear Lock
    keycode 0x42 = Escape
    

    Das System kann so eingerichtet werden, dass es bei jeder Anmeldung automatisch ausgeführt wird, indem die folgenden Shell-Skriptzeilen (vorausgesetzt, Sie .Xmodmapbefinden sich in Ihrem Ausgangsverzeichnis ~) strategisch in der Kette der automatisch eingegebenen Anmeldedateien platziert werden:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    Dies ist jedoch schwierig, da die tatsächlich bezogenen Dateien je nach verwendeter (Desktop-) Umgebung variieren. Als Beispiel habe ich xmodmap als Eintrag in den Cinnamon "Startup Applications" (Startup Applications) aufgerufen (wodurch ich mehr als die Standardanpassung für die Neuzuordnung von GUI-Schlüsseln durchführen kann).

Einige Leute gehen sogar noch weiter und programmieren die Feststelltaste so, dass sie sich verhält:

  • als CtrlTaste durch Drücken und Halten,
  • als EscTaste durch Drücken und schnelles Loslassen.

Dies kann unter Windows und Mac erfolgen, indem das entsprechende Remap-Dienstprogramm richtig eingestellt / programmiert wird (speziell für AutoHotkey-Hinweise finden Sie hier und für KeyRemap4MacBook-Check hier ). Unter Linux mit dem Programm xcape .

Giovanni Maggiorani
quelle
2
Stimme voll zu. Die Verwendung der Strg-Taste in der Startzeile verbessert die Benutzerfreundlichkeit erheblich (Scrollen durch Abschlüsse mit Strg + n, Scrollen durch die Datei mit Strg + f / Strg + b, Escapieren mit Strg +] usw.). Alle diese Tastenkombinationen sind einfacher durchzuführen auf diese Weise.
John O'M.
1
Über das Drücken der CtrlTaste (in der normalen Position), ohne den kleinen Finger zu drehen: Sie können sie mit der äußeren Handfläche drücken, wie es hier gut beschrieben ist (ich fand diesen netten cleveren Trick im Netz, Zeit, es zu geben zurück :) und ein dickes Lob an wer es erfunden hat)
Giovanni Maggiorani
FWIW KeyRemap4MacBook wurde in Karabiner umbenannt: pqrs.org/osx/karabiner/index.html.de
alxndr
Ich habe diese Lösung ausprobiert, aber festgestellt, dass ich beim Drücken der Umschalttaste versehentlich die Feststelltaste gedrückt habe, was ärgerlich war. Ihre Laufleistung kann also variieren, je nachdem, wie wendig Ihr linker kleiner Finger ist. :)
Godsmith
2
Wenn Sie Ctrlzu Alt( Cmd) und umgekehrt neu zuordnen , dann <C-[> scheint wirklich. Pinky ist schwach, Daumen ist stark. Auf QWERTY muss man dafür nicht einmal die Startreihe verlassen, auf Dvorak ist es nicht so gut, aber akzeptabel.
Nash Bridges
28

Die Zuordnungen, die ich verwende, sind:

inoremap jk <esc>
inoremap kj <esc>

Auf diese Weise können Sie einfach jund kgleichzeitig drücken, ohne sich Gedanken darüber machen zu müssen, welchen Sie zuerst drücken.

Türknauf
quelle
70
Aber ich schreibe ein Buch über das Spielen von Edsgar Dijkstra beim Blackjack in Reykjavik! ;)
Durron597
Beide sind schrecklich, wenn Sie Niederländisch schreiben wollen.
Hielke Walinga
12

<C-[>und <C-c>sind zwei native Alternativen zu <Esc>.

Siehe :help i_<esc>und :help i_ctrl-cwas den Unterschied zwischen <C-c>und erklärt <Esc>.

romainl
quelle
Auch dies sind keine Verbesserungen, da Strg genauso weit von der Ausgangszeile entfernt ist wie Escape.
Durron597
4
@ durron597 Auf einer QWERTZ-Tastatur befindet sich die Strg-Taste möglicherweise genau so weit von der Startzeile entfernt, hat jedoch einen wichtigen Unterschied: Sie befindet sich unterhalb der Startzeile. Sie müssen nur Ihren Finger bewegen, um darauf zu drücken, während Sie mit Esc Ihre ganze Hand etwas drehen müssen. Auch die <C-[>hat eine schöne Symmetrie (beide kleinen Finger bewegen sich in entgegengesetzte Richtungen).
wchargin
6
Beachten Sie, dass dies <C-c> nicht genau dasselbe ist wie<Esc> .
wchargin
2
Einverstanden. Gewohnheitsmäßiger Gebrauch <C-c>kann Plugins und Autocmds auf subtile Weise beschädigen.
David Lord
Auf meinem Computer funktioniert <C - [>, aber die Registrierung dauert eine halbe Sekunde länger als <Cc>
Alexander Mills
4

Sie können Karte Caps Lockzu Control ohne externes Programm :

  • Unter Mac OS X gehen Sie zu Systemeinstellungen> Tastatur -> Modifizierertasten
  • Führen Sie unter Linux Folgendes aus:setxkbmap -option caps:ctrl_modifier
  • In Windows bearbeiten Sie Ihre Registrierung.

Dadurch Controlwird die Startzeile aufgerufen, und es ist einfacher, alle von Control geänderten Striche zu drücken , einschließlich Ctrl-[und Ctrl-Cdie beide den Einfügemodus in Vim beenden.

Alternativ schlägt Giovanni am Ende seiner Antwort vor, eine Karte Caps Lockzu erstellen, die beide Funktionen ausführt Control und Escape von der Länge der Druckmaschine abhängt. Hierzu muss jedoch zusätzliche Software installiert werden.

Ctrl-[ist die bevorzugte Alternative , da es immer so funktioniert Escape.

Ein deutlicher Unterschied mit Ctrl-C, dass , wenn bearbeitet verlassen blockartig visuellen Modus , Ctrl-Cwerden die Änderungen halten Sie in der aktuellen Zeile gemacht, aber die Änderungen nicht wiederholen über die anderen Zeilen in dem Block, die der Punkt dieses Modus ist.

Es wird auch nicht nach Abkürzungen gesucht oder das InsertLeave-Ereignis ausgelöst. Sehen:help i_CTRL-C

joeytwiddle
quelle
4

Ich würde vorschlagen, mein Plugin vim-easyescape zu verwenden .

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

Das Problem bei einer einfachen Zuordnungssequenz inoremap jj <ESC>ist, dass Vim bei jeder Eingabe joder kim Einfügemodus angehalten wird (es wartet auf den nächsten Schlüssel, um zu bestimmen, ob die Zuordnung angewendet werden soll). Die Pause führt zu einer visuellen Ablenkung, die Sie möglicherweise bemerken oder nicht bemerken. vim-easyescape hat kein solches Problem und unterstützt benutzerdefiniertes Timeout.

Yichao Zhou
quelle
3

In den Terminals vi und Vim kann alt+ single-normal-mode-keyin den meisten Terminals schnell bearbeitet werden.

Dies funktioniert, weil die meisten Terminals den Alt-Modifikator als Escape-Zeichen senden. Wenn Sie beispielsweise alt+kden Terminalemulator eingeben, werden zwei Zeichen an das laufende Programm gesendet: esc, k. Vi und Vim interpretieren dies so, wie Sie es erwarten würden. Er verlässt den Einfügemodus (aufgrund des Escape-Befehls) und führt den Normalmodus-Befehl aus (im Beispiel, indem er den Cursor eine Zeile nach oben bewegt).

Dies kann eine bequeme Möglichkeit sein, den Einfügemodus zu beenden, wenn Ihre Tastatur die Alt-Taste neben der Leertaste hat (so dass Sie mit dem Daumen drücken können und Ihre Finger in der Startzeile bleiben), solange Sie einen Terminal-Emulator verwenden mit diesem Verhalten und nichts dagegen, einen normalen Modus Befehl auszuführen.

ewatt
quelle
2
Können Sie näher erläutern, was ist single-normal-mode-key? Du meinst Flucht?
Kenorb
Ein einziger Tastendruck, den Sie im normalen Modus verwenden würden, kann im Einfügemodus mit der Alt-Taste verwendet werden. zB Alt + x, um ein Zeichen zu löschen.
Ewatt
2
Ich verstehe diese Antwort auch nicht ganz. Alt + x scheint tatsächlich etwas anderes zu machen als Alt im normalen Modus? Und einige andere Schlüssel scheinen nicht zu funktionieren? Aber vielleicht verwende ich es falsch ..? Vielleicht könntest du deine Antwort ein wenig erweitern, um zu erklären, wie es funktioniert, und einen Link zu einigen Vim-Dokumenten zu erstellen, wäre auch gut :-) Danke! :-)
Martin Tournoij
Das hängt tatsächlich von Ihrer Terminalkonfiguration ab und ist im Allgemeinen nicht so eingestellt, wie Sie vermuten.
Christian Brabandt
1
Ich stimmte dem zu, überprüfte dann den Verlauf und stellte fest, dass ein Moderator ihn aus irgendeinem Grund bearbeitet hatte, um 99% des Textes aus dem Nichts hinzuzufügen, anstatt nur einen Kommentar zu hinterlassen, wie es von uns anderen erwartet wird. Also musste ich meine Stimme umkehren. Sicherlich geht das, was hier passiert ist, über den Rahmen vernünftiger Bearbeitungen hinaus? Ich habe weniger störende Änderungen abgelehnt bekommen. Der neue Inhalt ist zwar großartig, gehört aber nicht in diese Antwort. Es hätte sein eigenes sein sollen.
Underscore_d
3

FWIW verwende ich:

:map! ;l ^[
:vmap ;l ^[

Es fühlt sich an wie Return. Ich verwende es auch ;als Führungslinie für andere Zuordnungen im Einfügemodus.

Das einzige Mal, dass ich ';' + Buchstabe ist beim Code-Golfen; Ich hatte sonst keine Konflikte.

Antonius
quelle
Vielleicht ist es besser, es zu mappen, um zu entkommen, als es auf ^ [richtig? :)
Alexander Mills
2

Ich benutze Ctrl+ 3seit einiger Zeit, finde es einfacher zu tippen als die meisten Alternativen und scheint gut zu funktionieren (zumindest unter Linux). Meine Caps Lockist zugeordnet Ctrl, daher ist es sehr bequem, sie einzugeben.

Ich habe versucht, Ctrl+ cfür einige Zeit zu verwenden, aber ich hatte einige Probleme damit, an die ich mich nicht genau erinnern kann, aber ich habe nicht genau dasselbe Verhalten Escwie jetzt mit Ctrl+ erhalten 3.

elias
quelle
2
Was genau soll Strg-3 tun?
Christian Brabandt
Ich weiß nicht, wie es funktioniert, aber es funktioniert wie Escin Vanille Vim. Ich fand es empirisch, indem ich Kombinationen ausprobierte. Ich weiß nicht, wie die Interna funktionieren.
Elias
1
Dies ist keine vi Sache, funktioniert auch auf der Shell. Sehr nützlich, wenn Sie vi - Modus auf der Shell aktiviert mit bindkey -v
golfadas
1

Wenn Sie über eine US-englische Tastatur verfügen, entspricht das Drücken von Ctrl- dem [Drücken von Esc. Dies bietet eine einfache Möglichkeit, den Einfügemodus zu verlassen. Alternativ können Sie Ctrl- verwenden c.

Wenn Sie sich im einfachen Modus ( -y) befinden, müssen Sie Ctrl- l(Strg-L) drücken , um den Einfügemodus zu beenden.

Es gibt auch Ctrl+ , odie nur temporären Ausgang Insert - Modus nur einen Befehl auszuführen und zurück den Eingabemodus (siehe: :help i_CTRL-O)

Oder Ctrl+ r, aber es ist nur für Inhalt des Registers oder Ausdruck einfügen, zB Ctrl+ r, =5*5(siehe: :help i_CTRL-R, :help c_CTRL-Rund Stackoverflow Post ).

Lesen Sie mehr unter: Vermeiden Sie die Escape-Taste bei vim wikia

Kenorb
quelle
3
FYI: Dient Ctrl+rzum Einfügen von Registern (einschließlich des Ausdrucks =reg). Wenn Sie vorübergehend einen einmaligen Befehl ausführen möchten, verwenden Sie Ctrl+o.
Sukima,
1

Ich habe mich <A-e>für die Flucht entschieden:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

Edit: Hab gerade herausgefunden, von <C-\><C\n>welchem ​​anderen Modus du in den normalen Modus kommst. Es hat auch ein besseres Gesamtverhalten. Die Zuordnungen werden:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>
J. Doe
quelle
0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

Zum Beenden ordne ich die Registerkarte neu zu. Ich denke, in der Vergangenheit war dort der Esc-Schlüssel, also habe ich ihn verwendet und nie zurückgeschaut. Ich muss in einem Dokument kaum einen Tabulator einfügen, und wenn ich das tue, drücke ich einfach Umschalt + Tabulator. Ich habe die ursprüngliche Tab-Bindung noch nie verpasst.

Wumbo
quelle
Der Absatz über Vim und Emacs ist völlig unnötig ...
D. Ben Knoble