Warum bewegt sich der Cursor nach <Esc> zum Zeilenanfang?

12

Ich habe festgestellt, dass sich der Cursor beim Bearbeiten entlang einer Zeile in einer TXT-Datei im Einfügemodus nach einem Schreibvorgang mit der Tastenfolge an den Zeilenanfang bewegt:

<esc>:w

Ich möchte dieses Verhalten so ändern, dass der Cursor nach einem: Schreiben in Position bleibt. Ist das möglich? Ich brauche den Cursor nicht, um im Einfügemodus zu bleiben. Ich möchte nur, dass er nach einem Schreibvorgang seine letzte Position beibehält.

Ich verwende gVim 7.4 unter Windows. Meine .vimrc ist sehr einfach, ich glaube nicht, dass eine meiner Einstellungen dieses Verhalten stört. Ich habe auch die Beschaffung von mswin.vim und example.vim aus meiner .vimrc entfernt (im Lieferumfang des offiziellen Windows-Installationsprogramms von vim.org enthalten).

Nachdem ich die folgenden Kommentare gelesen hatte, sah ich mir das Problem noch einmal an und stellte fest, dass der Cursor nach einem Schreiben in Zeilen, die vollständig aus nachgestellten Leerzeichen bestehen, nur ganz nach links gleitet. Mit anderen Worten, der Cursor bewegt sich nur dann nach links, wenn die Zeile ein hängender Einzug ist, in dem außer Leerzeichen keine anderen Zeichen stehen . Die .vimrc verarbeitet Einrückungsverhalten mit den folgenden Einstellungen:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Eine neue Zeile, die unter einer eingerückten Zeile erstellt wird, enthält 4 nachgestellte Leerzeichen als die ersten 4 Leerzeichen der Zeile (die ich beibehalten möchte). Wenn Sie die Esc-Taste drücken, bewegt sich der Cursor ganz links neben den Puffer.

Gibt es eine Möglichkeit, die Cursorposition beim Drücken von 'esc' beizubehalten, um zum normalen Modus zurückzukehren, und zwar auf einer Linie aus nachgestellten Leerzeichen (als Einrückung)?

Jim
quelle
3
Ich habe dieses Verhalten in Vim auf keiner Plattform bemerkt ... Was passiert, wenn Sie gVim wie folgt starten: gvim -u NONE -U NONE(Sie können entweder cmd.exe verwenden oder eine Verknüpfung erstellen )? Dies verhindert das Laden Ihrer (g) vimrc-Dateien.
Martin Tournoij
1
Ist das Ihre komplette vimrc-Datei? Mein erster Verdacht wäre, dass ein Autocmd in Ihrer vimrc-Datei nachgestellte Leerzeichen entfernt. Ändert sich das Verhalten, wenn Sie gVim ohne vimrc-Datei starten (siehe obigen Kommentar)?
Martin Tournoij
Das obige ist nicht meine vollständige .vimrc, es gibt auch andere Einstellungen. Das Ausführen von gVim ohne .vimrc (: scriptnames zeigt keine .vimrc oder .gvimrc an) löst mein Problem. Sie haben absolut Recht, ich muss meine .vimrc oder etwas anderes durchsuchen, das bezogen wird und das dies verursachen könnte.
Jim
Anscheinend ist diese Eliminierung von Leerzeichen in neuen Zeilen ein wünschenswertes Verhalten. Ich lese hier, es soll die Datei frei von Leerzeichen halten.
Jim
Hier geht es darum, neue Zeilen zu öffnen ... Nicht darum, in eine Datei zu schreiben?
Martin Tournoij

Antworten:

11

In der Dokumentation zu autoindent finden Sie eine Antwort darauf, warum und wie Sie das Problem umgehen können. :help 'autoindent'::

Kopieren Sie den Einzug aus der aktuellen Zeile, wenn Sie eine neue Zeile beginnen (Eingabe <CR> im Einfügemodus oder Verwendung des Befehls "o" oder "O"). Wenn Sie nicht alles auf die neue Zeile eingeben außer <BS>oder CTRL-Dund geben Sie dann <Esc>, CTRL-Ooder <CR>wird der Einzug wieder gelöscht. Das Bewegen des Cursors in eine andere Zeile hat den gleichen Effekt, es sei denn, das 'I'-Flag ist in' cpoptions 'enthalten.

Mit anderen Worten, wenn Sie möchten, dass der Einzug nicht verloren geht, geben Sie etwas ein und drücken Sie die Rücktaste, bevor Sie ihn treffen Esc. Das führende Leerzeichen bleibt erhalten.

Wenn Sie alternativ nur wieder auf der Einrückungsstufe sein möchten, wenn Sie in den Einfügemodus zurückkehren und diese ebenfalls verwenden 'cindent', verwenden Sie Shift-Sstattdessen anstelle von i, wodurch die (bereits leere) Zeile gelöscht wird, und beginnen Sie mit der entsprechenden Einrückungsstufe. Dies ist keine so allgemeine Lösung wie die oben beschriebene, aber ich bevorzuge dies, wenn ich C-Code schreibe, damit meine Dateien nicht nur mit Leerzeichen gespeichert werden.

John O'M.
quelle
Dies ist eine endgültige Antwort auf meine Frage aus der Originaldokumentation. Vielen Dank für die Zusammenfassung und Erzählung - ich hätte nicht gedacht, in: h Autoindent für diese Informationen zu suchen. Vielen Dank auch an @Carpetsmoker für die Diskussion, die zu einer Lösung geführt hat.
Jim
Dies löste ein Problem, bei dem ich o und O neu zugeordnet hatte, um den Einfügemodus nicht zu verlassen, sondern die Einrückung beizubehalten. Dies kann durch zu tun getan werden nnoremap o o <BS><Esc><DEL>, undnnoremap O O <BS><Esc><DEL>
Max Coplan
Vielen Dank!
Max Coplan