Verhindern Sie in vim, dass sich das Caret zurückbewegt, wenn ich den Bearbeitungsmodus verlasse?

9

Wenn ich in vim den Bearbeitungsmodus betrete und verlasse, ohne etwas zu tun, endet das Caret ein Zeichen links. Und wenn ich den Append-Modus betrete und verlasse, bewegt sich das Caret vorwärts und dann rückwärts.

Gibt es eine Möglichkeit, vim so zu konfigurieren, dass das Caret in diesen Fällen in Ruhe gelassen wird?

Idealerweise möchte ich nur immer in den Anhänge-Modus wechseln, ohne das Caret zu bewegen, wenn ich in den Modus eintrete oder ihn verlasse.

(Derzeit verwende ich normalerweise den Einfügemodus, da dies meine Caret-Position bei der Eingabe nicht durcheinander bringt. Das heißt, es sei denn, ich muss an das Ende der Zeile anhängen. In diesem Fall schwöre ich bei vim, dass ich mich so archaisch verhalte Drücken Sie die Esc-Taste und rufen Sie den Append-Modus auf.)

RomanSt
quelle
1
Die Antworten auf diese Frage sind gut. Ich möchte nur darauf hinweisen, dass, wenn sie in ihren Annahmen, dass Sie i verwenden, um in den Bearbeitungsmodus zu wechseln, korrekt sind, dies die Ursache für die Rückwärtsbewegung ist. Wenn Sie 'a' (nicht A) verwenden, funktioniert es wie erwartet.
Johnny
@ Johnny Ich glaube nicht, dass es wird. Ich bin normalerweise im "normalen" Modus und bewege mich in der Datei und so weiter. Wenn ich eine Bearbeitung vornehmen muss, positioniere ich zuerst das Caret, drücke dann "a" und stelle dann fest, dass ich es falsch positioniert habe, weil es sich nach rechts bewegt. Da ich 99% meiner Bearbeitungszeit in modernen Editoren verbringe, besteht keine Chance, dass ich mich jemals daran erinnern werde, ein Zeichen links zu positionieren, bevor ich "a" drücke. Deshalb habe ich auf ein Makro oder so gehofft.
RomanSt
Es ist eine Frage der Gewohnheiten. Es ist zwar nervig, aber nur in den ersten Jahren. Sie werden schließlich zu drücken lernen ioder aohne darüber nachdenkt, und kann sogar sein s, S, ci", usw. statt der begrenzt iund a.
Luc Hermitte
1
Ich verstehe deine Frustration aber. Versuchen Sie stattdessen darüber nachzudenken, was Sie tun. Fragen Sie sich, ob es einen besseren Weg gibt (als Vim als regulären Texteditor zu verwenden). Ich habe bei Vim festgestellt, dass es immer einen besseren Weg gibt, den Vim-Weg, Dinge zu tun. Wir können helfen, aber wir müssen wissen, was Sie tun, wenn Sie auf Probleme stoßen. Gehen Sie zum Beispiel in den Bearbeitungsmodus, wenn Sie etwas löschen möchten? Nicht, es gibt 'x' zum Löschen von Zeichen. Willst du einen Charakter ersetzen, dann gibt es 'r'. Denken Sie nur daran, was Sie erreichen möchten.
Johnny
@ Johnny Ich verstehe, wovon du sprichst, aber es erfordert zu viel Umlernen, um für mich einen Sinn zu ergeben. Ich verbringe 99% meiner Bearbeitungszeit in Visual Studio und ich liebe es. Ich weiß nur, dass ich das nicht neu lernen werde, also macht es keinen Sinn, Zeit zu verschwenden.
RomanSt

Antworten:

9

Diese Frage wird häufig von neuen vi / Vim-Benutzern gestellt. Die Antwort lautet, dass sich der Cursor im normalen Modus immer auf einem Zeichen befindet, während sich der Einfügemodus im Einfügemodus immer zwischen zwei Zeichen befindet (denken Sie daran, das Ende) -of-line ist ein Zeichen). Sie können dies auch in Konsole Vim nicht wirklich sehen, aber in der GUI werden Sie feststellen, dass der Cursor beim Aufrufen des Einfügemodus zu einem Balken zwischen zwei Zeichen wird, anstatt im normalen Modus einen Block über einem Zeichen.

Was Sie also sehen, ist nicht unbedingt der Cursor, der ein Zeichen zurückbewegt, wenn Sie den Einfügemodus verlassen, sondern lediglich ein Zeichen. Die einzig sichere Bewegungsrichtung ist nach links (oder hinten). Sie haben also mehrere Möglichkeiten, in den Einfügemodus zu wechseln:

  • "a" wechselt mit dem Cursor "zwischen" dem Zeichen, auf dem sich der Cursor befand, und dem nächsten Zeichen rechts in den Einfügemodus.
  • "i" wechselt mit dem Cursor "zwischen" dem Zeichen, auf dem sich der Cursor befand, und dem vorherigen Zeichen links in den Einfügemodus.

Einige Leute haben Anstrengungen unternommen, um diese "Bewegung" zu unterdrücken, die sie nicht mögen, aber sie stört unweigerlich Plugins und andere Vim-Skripte, die sie in Zukunft ausführen möchten.

Mein Vorschlag ist, sich daran zu gewöhnen, die Befehle "a" und "i" (und "A" und "I") unter den entsprechenden Umständen zu verwenden.

Die Befehle "o" und "O" sind ebenfalls nützlich zum Lernen. Sehen:

:help a
:help i
:help A
:help I
:help o
:help O

Bearbeiten: Wenn Sie immer noch entschlossen sind, dieses Verhalten zu ändern, versuchen Sie diesen Tipp: Verhindern Sie, dass der Cursor um ein Zeichen nach links bewegt wird

Heptit
quelle
1
Ich verstehe, was Sie sagen, aber "i" / "Esc" / "i" / "Esc" verursacht die tatsächliche Gesamtnettobewegung des Carets. Ich denke wirklich, dass VIM einfach nichts für mich ist.
RomanSt
2
@romkyns: Ich denke, was Sie tun sollten, ist astatt zu verwenden i.
Bis auf weiteres angehalten.
1
@ Tennis stimmte zu, "a" ist ein bisschen besser, weil es dem Caret erlaubt, vor dem ersten Zeichen und nach dem letzten Zeichen in einer Zeile zu stehen - was "i" willkürlich verbietet. Aber das habe ich versucht; Was passiert ist, dass ich das Caret immer verlegt habe, bevor ich "a" drücke - also muss ich das Caret sofort um eine Position nach links bewegen. Jedes Mal. Es wurde anstrengend und ich wechselte zu "i".
RomanSt
@Heptite Könnten Sie mich vielleicht auf eine solche fehlerhafte Implementierung von etwas hinweisen, das die Bewegung unterdrückt? Die Chancen, dass ich in Zukunft Plugins oder andere Skripte verwenden möchte, sind im Wesentlichen Null.
RomanSt
1
@romkyns, es funktioniert (nicht) in beide Richtungen. Durch das Neuzuordnen <esc>wird zwar verhindert, dass die meisten Plugins <esc>ordnungsgemäß funktionieren, aber es wird Sie auch weiterhin nerven, wenn Sie andere Standardfunktionen verwenden, die auf die gleiche Weise in den normalen Modus zurückkehren <esc>. Das Lernen, den richtigen Schlüssel im laufenden Betrieb zu verwenden, ist die Lösung, die auf lange Sicht skaliert / funktioniert.
Luc Hermitte
1

Ich denke, mit Karat meinst du deinen Cursor und wenn du "i" verwendest, wird dies direkt dort einfügen, wo sich dein Cursor befindet. "A" (was ich glaube, dass du suchst) bewegt den Cursor ein Zeichen nach rechts. Außerdem geht Shift-i (I) zum Anfang der Linie und Shift-a (A) geht bis zum Ende der Linie.

Wenn ich Ihre Frage falsch verstanden habe, entschuldige ich mich.

Dan M.
quelle
1

Da das Neuzuordnen <ESC>als "riskant" eingestuft wird, kombiniere ich es einfach mit einem der Ansätze " Vermeiden Sie die Escape-Taste" und habe Folgendes in meinem .vimrc:

 inoremap ii <ESC>l

Hinweis: Stellen Sie sicher, dass am Ende der Zeile keine Leerzeichen stehen.

Einfach, aber vollständig zertifiziert als "funktioniert gut für mich", da ich genau das sonst von Hand eingeben müsste.

Unabhängig davon, ob ich das Caret-Verhalten verwende aoder iimmer noch bewege und es mich verdammt oft nervt, ist das nächste, was ich eingeben möchte, d$das Löschen bis zum Ende einer Zeile usw.

Atome
quelle
Erstaunlich einfache Lösung. Am besten bin ich rübergekommen.
Tyler Collier
1

Hier ist meine Lösung:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

Es ist lustig. Dieselbe Frage besteht auf allen drei Websites: SO, SU, Unix + Linux.

Steven Lu
quelle
Ich finde es nicht lustig :) Zum Glück habe ich einen Editor gefunden, der mich nicht verrückt macht (Diakonos), also ist dies kein Problem mehr. Trotzdem für diejenigen, die vim mögen.
RomanSt