Grok Vim Bewegungen und einfache Änderungen

8

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 NORMALModus zurückzukehren, um eine einzelne Bewegung auszuführen, nur um in den INSERTModus zurückzukehren.

Beispiel 1: Wenn ich mich im INSERTModus 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 INSERTModus 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 NORMALModus 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.

SabreWolfy
quelle
1
Der Vim-Weg könnte darin bestehen, ein Plugin wie algorithm.com.au/code/vimacs zu verwenden . : P Können Sie erklären, was diese Befehle in Emacs tun? Eine Liste von Strg / Alt / Meta-foo / bar ist für jeden, der keine Emacs verwendet, ziemlich bedeutungslos. Und Strg-W löscht das Wort vor dem Cursor. Ich habe auch das Gefühl, dass dies etwas zu weit gefasst ist.
Muru
1
Wenn wir den Plugin-Weg gehen, sollten Sie github.com/tpope/vim-rsi
dkns
3
Beim Wechsel von der Programmiersprache "A" nach "B". Es ist am besten, nicht "B" im Stil von "A" zu schreiben, sondern die Standard-Redewendungen von "B" zu lernen (dies ist eine schwierige Lektion für die meisten Entwickler). Gleiches gilt für Redakteure. Versuchen Sie nicht, den Standardworkflow des Editors "A" auf Ihren neuen Editor "B" anzuwenden. Lernen Sie lieber die Redewendungen der direkten Verwendung von "B". Größere Lernkurve, aber auf lange Sicht viel produktiver. Beim vimBearbeiten verbringen Sie die meiste Zeit im normalen Modus, nicht im Einfügemodus.
Martin York

Antworten:

6

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

inoremap <C-a> <C-o>0

oder wenn Zeilenanfang das erste nicht leere Zeichen der Zeile bedeutet

inoremap <C-a> <C-o>^

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

let cchar = s:cchar["atx"]

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:ccharnoch kein Wert für den "atx"Schlüssel zugewiesen wurde . Mit meinem Cursor (im normalen Modus) auf das erste Zeichen 'l' könnte ich tippen

f=wcf[MyFunction(<Esc>$r)

Kurz gesagt, das sagt

  • f=- vorwärts zu '=' (Ich hätte sagen können fs, 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

let cchar = |"atx"]

Wo |ist der Cursor und ich bin im Einfügemodus. Ich MyFunction(tippe dann und verlasse den Einfügemodus ( <Esc>).

  • $- Bewegen Sie den Cursor zum Zeilenende. Ich hätte es Efür das Ende des großen Wortes oder f]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 ')' ersetzen

Jetzt 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 erstellen

inoremap <C-S-w> <C-o>dw

Wiederum verlassen <C-o>Sie den Einfügemodus für einen einmaligen Befehl und dw"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 verwenden W(siehe :help W). Wenn Sie bereits überwiegend im normalen Modus sind Sie brauchen nicht diese Zuordnungen, nur tun dw, dboder Freunde.

Einige Hilfekapitel zum näheren Betrachten

  • :help <C-o>
  • :help Insert
  • :help fund die folgenden Abschnitte ( F, t, T, ;und ,)
  • :help word-motions
jjaderberg
quelle
5
Das Schreiben ist NICHT linear. Jeder, der von Anfang bis Ende Prosa (oder Code) schreiben kann, ohne irgendeine Art von Bearbeitung durchzuführen, ist entweder verrückt oder hat die Kraft eines Gottes. Für den Rest von uns bearbeiten wir mehr als das Schreiben und denken daher, dass Ihr Editor zuerst Bearbeitungsbefehle (NORMAL-Modus) und dann das Schreiben (INSERT-Modus) effizienter ausführt. Und dies ist der wahre Grund, warum Redakteure wie Emacs, MS Word, Notepad usw. in ihrem Ansatz rückwärts sind. Es ist bedauerlich, dass das Konzept ohne Modus existiert, aber es muss einen kleinsten gemeinsamen Nenner geben.
Sukima
12

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

So beantworten Sie Ihre Frage zu lokalen Änderungen: Wenn Sie sich im Einfügemodus befinden und drücken, führen ctrl-OSie 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.

Beispiel 1: Wenn Sie im INSERT-Modus ein (am Anfang eines Ausdrucks, wie soll ich zum Ende des Ausdrucks oder zur Zeile, um das entsprechende einzufügen) in Vim einfügen?

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 einfach ys$). 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önnen c3w()<esc>Poder verwenden ys3w). Was ist mit der ganzen Linie? cc()<esc>Poder yss).

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.

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 Sie jk<sequenceofcommands>iBefehle ausführen können, ohne die Eingabe zu unterbrechen.

Hovercouch
quelle
:h ins-special-keysÜberprüfen Sie außerdem , ob :h ins-special-specialweitere Zuordnungen vorhanden sind.
Lithis
9

Alt-F, Alt-B, Strg-A, Strg-E, Alt-D und Alt-Rücktaste

Die entsprechenden Befehle im Normalbetrieb sind w, b, ^, $, dw, db. Beachten Sie die Logik: dwLöscht, was abgedeckt wird, wund dblöscht, was abgedeckt ist b. 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.

Es ist nicht optimal, in den NORMALModus zurückzukehren, um eine einzelne Bewegung auszuführen, nur um in den INSERTModus zurückzukehren.

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.

Beispiel 1: Wenn ich mich im INSERTModus 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 ?

Wie in jedem Texteditor, jeder IDE oder jedem Textverarbeitungsprogramm oder <textarea>:

<End>)

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 INSERTModus 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 NORMALModus wechseln, um einfache Bewegungen auszuführen oder Wörter zu löschen.

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.

romainl
quelle
Die Verwendung von Bewegungen (z. B. Endoder Pfeiltasten) im INSERTModus ist in Ordnung.
SabreWolfy
4
Natürlich alles, was Ihnen die Arbeit erleichtert.
Romainl
3

Wie kann Vim ähnliche Funktionen implementieren? Die Rückkehr in den NORMAL-Modus, um eine einzelne Bewegung auszuführen, nur um den INSERT-Modus erneut aufzurufen, ist nicht optimal.

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):

nmap <C-BACKSPACE> dbi
nmap <C-DEL> dei
imap <C-BACKSPACE> <ESC>ldbi
imap <C-DEL> <ESC>ldei
Tharibo
quelle