Ich kehre zu Vim zurück, nachdem ich Emacs einige Jahre lang benutzt habe. Ich versuche, Vim zu verärgern, indem ich Tutorials lese und anschaue und sie tatsächlich täglich benutze.
Beim Bearbeiten von Text finde ich die Emacs-Befehle von Alt-F, Alt-B, Strg-a, Strg-e, Alt-D und Alt-Rücktaste sehr nützlich und intuitiv und ermöglicht schnelle und einfache lokale Änderungen während der Arbeit mit Text (Wörter / Code).
Wie kann Vim ähnliche Funktionen implementieren? Es ist nicht optimal, in den NORMAL
Modus zurückzukehren, um eine einzelne Bewegung auszuführen, nur um in den INSERT
Modus zurückzukehren.
Beispiel 1: Wenn ich mich im INSERT
Modus zum Einfügen eines (
am Anfang eines Ausdrucks befinde, wie soll ich zum Ende des Ausdrucks oder zur Zeile gehen, um das entsprechende )
in Vim einzufügen ?
Beispiel 2: Wenn Sie Text bearbeiten, möchten Sie häufig ein Wort vorwärts oder rückwärts löschen, während Sie einen Satz oder Code schreiben oder bearbeiten. Es wäre ungewöhnlich, einen perfekt geformten Satz / Code im Kopf zu haben, der bereit ist, "einmalig" im Voraus zu tippen. Oft ändert sich ein Satz, wenn man mit dem Text arbeitet. Die Einschränkungen des INSERT
Modus erschweren mir diese Art der Bearbeitung in Vim. Ich fühle mich nicht in der Lage, den Text im Einfügemodus effektiv zu bearbeiten, und muss immer wieder in den NORMAL
Modus wechseln, um einfache Bewegungen auszuführen oder Wörter zu löschen.
PS: Alt-F und -B bewegen den Cursor ein Wort vorwärts oder rückwärts. Strg-a und -e bewegen den Cursor an den Anfang oder das Ende der Zeile. Alt-F löscht das Wort unter dem Cursor. Alt-Rücktaste löscht das Wort vor dem Cursor.
quelle
vim
Bearbeiten verbringen Sie die meiste Zeit im normalen Modus, nicht im Einfügemodus.Antworten:
1
Sie können diese oder bessere (pinky) Befehlszuordnungen sehr schnell erreichen. Ich empfehle diese Lösung nicht, aber als Beispiel, wenn Sie den Cursor an den Zeilenanfang bewegen möchten,
<C-a>
können Sie die folgende Zeile ausführen, nachdem Sie:
aus dem normalen Modus gedrückt haben (oder die Zeile zu Ihrem vimrc hinzufügen).oder wenn Zeilenanfang das erste nicht leere Zeichen der Zeile bedeutet
Seltsamerweise habe ich diese Zuordnungen gerade in dem Puffer getestet, in dem ich diese Antwort schreibe, und ich war für einen Moment verwirrt, weil sie nicht funktionierten. Dann wurde mir klar, dass ich vergessen hatte, in den Einfügemodus zu wechseln. Es scheint Ihnen ein Problem zu sein, den Einfügemodus zu verlassen, um Befehle im normalen Modus auszuführen. Möglicherweise stellen Sie nach einer Weile der Verwendung von Vim fest, dass es umgekehrt ist - dass Sie im normalen Modus verweilen, während Sie nachdenken, und nur für bestimmte Gelegenheiten Ausflüge in den Einfügemodus unternehmen. Vim ist wahrscheinlich nur (oder meistens) lernenswert, wenn Sie feststellen, dass Sie mehr bearbeiten als Text schreiben .
Ein Teil einer Antwort auf Ihre Frage zum schnellen Ausführen von Befehlen im Normalmodus aus dem Einfügemodus lautet
<C-o>
: Sie können den Einfügemodus vorübergehend verlassen, um einen Befehl im Normalmodus auszuführen, und dann erneut eingeben. Lesen Sie darüber unter:help i_Ctrl-o
. Dies ist nützlich für einmalige Annehmlichkeiten. Eine nachhaltigere Route besteht wahrscheinlich darin, den normalen Modus als Standard für die Navigation und Bearbeitung zu verwenden und nur dann in den Einfügemodus zu wechseln, wenn Sie tatsächlich neue Zeichen von Hand in den Puffer einfügen möchten.2
Ihre Beispiele sind sehr allgemein gehalten, daher ist es schwierig, spezifische Antworten zu geben. Ich werde ein konkretes Beispiel zusammenstellen, in der Hoffnung, dass es zu etwas passt oder auf etwas übersetzbar ist, dem Sie begegnen. Für Ihre Nummer 1 hängt es davon ab, woher Sie wissen, wohin die schließende Klammer gehen soll. Nehmen wir an, ich habe eine Zeile wie
Dies soll eine Zeile von VimL sein, der Skriptsprache von vim, und sie (oder so ähnlich) kommt in einer Vim-Syntaxdatei vor, mit der ich derzeit nicht einverstanden bin. Angenommen, ich möchte den rechten Teil dieses Ausdrucks in einen Funktionsaufruf ändern, möglicherweise weil die Funktion Standardeinstellungen bereitstellt, wenn dem Wörterbuch
s:cchar
noch kein Wert für den"atx"
Schlüssel zugewiesen wurde . Mit meinem Cursor (im normalen Modus) auf das erste Zeichen 'l' könnte ich tippenKurz gesagt, das sagt
f=
- vorwärts zu '=' (Ich hätte sagen könnenfs
, aber ich würde wahrscheinlich nicht lange genug innehalten, um zu sehen, dass das 's', das ich erreichen möchte, das erste s in der Zeile ist, also würde ich mich für den Charakter entscheiden, der ist offensichtlich einzigartig und weiter von dort)w
- nächstes Wort, jetzt befindet sich mein Cursor auf dem 's' von 's: cchar'cf[
- Wechseln Sie zu '['an diesem Punkt sieht die Linie aus wie
Wo
|
ist der Cursor und ich bin im Einfügemodus. IchMyFunction(
tippe dann und verlasse den Einfügemodus (<Esc>
).$
- Bewegen Sie den Cursor zum Zeilenende. Ich hätte esE
für das Ende des großen Wortes oderf]
für das Weiterleiten an ']' oder eine andere Bewegung verwenden können,$
kam mir aber zuerst in den Sinn.r)
- Zeichen unter dem Cursor durch ein ')' ersetzenJetzt habe ich den Zuweisungsausdruck von der Zuweisung aus einem skriptlokalen Wörterbuch zur Verwendung des Rückgabewerts einer Funktion geändert und dabei Klammern eingefügt. Ich weiß nicht, wie Ihr spezielles Bedürfnis nach Klammern aussieht, vielleicht ist es sehr unterschiedlich. In diesem Fall wird es eine andere Befehlsfolge geben, um dies zu erreichen. Wenn ich innehalten würde, um länger über mein erfundenes Beispiel nachzudenken, könnte ich auch effizientere Wege finden, um dies zu erreichen, aber wer hat Zeit zum Innehalten und Nachdenken.
(Probieren Sie es aus, kopieren Sie den Text und den Befehl (sorry, yank-put) in einen Puffer und bewegen Sie den Cursor auf das erste Zeichen 'f' des Befehlstreffers
y$
. Jetzt befindet sich der Befehl in Ihrem unbenannten Register. Gehen Sie zum Anfang der ersten Zeile und drücken Sie, um a) den Befehlszeilenmodus aufzurufen:normal <C-r>"
, b) einen Befehl im normalen Modus über die Befehlszeile auszuführen und c ) das unbenannte Register wie gewohnt in die Befehlszeile einzufügen ( atchoo put) Modusbefehl ausgeführt werden. Das einzige, was Sie im Befehl ändern müssen, ist, die falsche<Esc>
Zeichenserie (weil Sie atchoo aus Ihrem Browser kopiert haben ) durch den tatsächlichen Escape-Schlüsselcode zu ersetzen. Löschen Sie ihn also und drücken Sie<C-v>
und dann Ihre Esc-Taste. Es wird irgendwie so aussehen^[
. Drücken Sie nun die Eingabetaste, um den Befehl auszuführen. Oder ... geben Sie einfach die Tastenfolge ein, um die Befehle zu testen. Ich wollte Ihnen nur zeigen, dass Sie auch vom cmdline-Modus aus mit dem normalen Modus interagieren können, und<C-v>
, und<C-r>
und all den anderen Herrlichkeiten des Wunderlandes. Siehe auch:help Cmdline-mode
.)3
Zum Löschen eines Wortes rückwärts können Sie die Standardzuordnung verwenden
<C-w>
(siehe:help i_Ctrl-w
). Ich weiß nicht, ob es eine Standardzuordnung gibt, um ein Wort vorwärts zu löschen, aber ich nehme an, Sie könnten eine mit erstellenWiederum verlassen
<C-o>
Sie den Einfügemodus für einen einmaligen Befehl unddw
"löschen" über die "Wort" -Bewegung. Siehe:help d
,:help w
. Wenn es sich bei den von Ihnen gelöschten Vorwärtswörtern nicht um tatsächliche Wörter handelt, sondern um Namen von class.function #, können Sie diese verwendenW
(siehe:help W
). Wenn Sie bereits überwiegend im normalen Modus sind Sie brauchen nicht diese Zuordnungen, nur tundw
,db
oder Freunde.Einige Hilfekapitel zum näheren Betrachten
:help <C-o>
:help Insert
:help f
und die folgenden Abschnitte (F
,t
,T
,;
und,
):help word-motions
quelle
So beantworten Sie Ihre Frage zu lokalen Änderungen: Wenn Sie sich im Einfügemodus befinden und drücken, führen
ctrl-O
Sie den nächsten Befehl im Einfügemodus aus. Dies kann nützlich sein, wenn Sie die Leitung abwischen möchten. Es gibt einige andere Befehle im Einfügemodus für kleine Dinge, wie das Einfügen aus dem Register und das automatische Vervollständigen von Wörtern. Sie können alle mit lesen:h ins-special-keys
.Oft gibt es eine bessere Möglichkeit, Dinge im normalen Modus zu erledigen. Angenommen, Sie möchten einen Ausdruck in Klammern setzen. Einige Dinge , die Sie tun können , sind
i(<end>)
,i(<esc>A)
,c$()<esc>P
. * Meine Lieblingssache beinhaltet eine mit dem „notwendigen“ vim plugins, vim-Surround . Mit Vim-Surround ist es einfachys$)
. Das Tolle an all diesen Dingen ist, dass Sie, sobald Sie wissen, wie man es in einer Situation macht, es in allen ähnlichen Situationen machen können. Was ist, wenn es keine drei Klammern am Ende der Zeile sind, sondern nur drei Wörter? Sie könnenc3w()<esc>P
oder verwendenys3w)
. Was ist mit der ganzen Linie?cc()<esc>P
oderyss)
.Eine Sache, die viel hilft, ist,
inoremap jk <esc>
zu Ihrem vimrc hinzuzufügen. Anschließend können Sie den Einfügemodus durch Drücken von jk verlassen. Dadurch entfällt der größte Teil des Overheads beim Verlassen des Einfügemodus, sodass Siejk<sequenceofcommands>i
Befehle ausführen können, ohne die Eingabe zu unterbrechen.quelle
:h ins-special-keys
Überprüfen Sie außerdem , ob:h ins-special-special
weitere Zuordnungen vorhanden sind.Die entsprechenden Befehle im Normalbetrieb sind
w
,b
,^
,$
,dw
,db
. Beachten Sie die Logik:dw
Löscht, was abgedeckt wird,w
unddb
löscht, was abgedeckt istb
. Mit welchem Befehl würden Sie löschen, was abgedeckt ist^
? Oder um es zu reißen?Diese sprachliche Logik ist der springende Punkt bei der modalen Bearbeitung. Es kann einige Zeit dauern, bis Sie sich daran gewöhnt haben, aber es gibt keine Kehrtwende.
Die entsprechenden Befehle im Insert - Modus sind:
<C-Right>
,<C-Left>
,<Home>
,<End>
,<C-w>
und ... nichts , aber Sie können eine einfache Zuordnung erstellen:inoremap <C-something> <C-o>dw
.Tatsächlich. Der richtige Ansatz besteht darin, in den Einfügemodus zu wechseln, um so wenig Text wie möglich einzufügen, und so bald wie möglich in den normalen Modus zurückzukehren.
Wie in jedem Texteditor, jeder IDE oder jedem Textverarbeitungsprogramm oder
<textarea>
:Auch hier dient der Einfügemodus zum Einfügen von Text. "Manipulieren von Text" und Bewegen sollen im normalen Modus erfolgen.
Bitte stellen Sie genauere Fragen.
quelle
End
oder Pfeiltasten) imINSERT
Modus ist in Ordnung.Nun, man kann sagen, dass der Vim-Weg darin besteht, nicht im INSERT-Modus zu bleiben. Der aufschlussreiche Moment in Vim kommt, wenn Sie erkennen, dass Sie nicht im INSERT-Modus bleiben müssen. Es gibt viele Möglichkeiten, Text einzufügen, und alle beginnen im NORMAL-Modus.
Davon abgesehen bin ich selbst kein echter Mensch und habe die Schlüssel für die Arbeit neu zugeordnet (à la Windows):
quelle