Dlaczego kursor przesuwa się na początek linii po <Esc>?

12

Zauważyłem podczas edycji wzdłuż linii w pliku .txt w trybie wstawiania, kursor przesunie się na początek linii po zapisie przy użyciu sekwencji klawiszy:

<esc>:w

Chciałbym zmienić to zachowanie tak, aby kursor pozostał w pozycji po: napisz. czy to możliwe? Nie potrzebuję kursora, aby pozostać w trybie wstawiania, chciałbym tylko, aby utrzymał ostatnią pozycję po zapisie.

Używam gVim 7.4 na Windowsie. Mój .vimrc jest bardzo prosty, nie sądzę, aby moje ustawienia zakłócały to zachowanie. Usunąłem również pozyskiwanie mswin.vim i example.vim z mojego .vimrc (w pakiecie z oficjalnym instalatorem systemu Windows vim.org).

Po przeczytaniu poniższych komentarzy ponownie spojrzałem na problem i zdałem sobie sprawę, że kursor przesuwa się tylko w lewo po napisie na liniach, które składają się całkowicie z końcowych białych znaków. Innymi słowy, kursor przesuwa się tylko w lewo po naciśnięciu klawisza esc: w, gdy linia jest wiszącym wcięciem bez innych znaków poza spacjami . .Vimrc obsługuje zachowania wcięć przy następujących ustawieniach:

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

Tak więc nowa linia utworzona poniżej linii wcięcia będzie zawierać 4 końcowe białe spacje jako pierwsze 4 spacje linii (którą chcę zachować). Po wciśnięciu klawisza „esc” kursor przesuwa się w lewą stronę bufora.

Czy istnieje sposób na zachowanie pozycji kursora po naciśnięciu „esc”, aby powrócić do normalnego trybu, na linii złożonej z końcowych białych spacji (jako wcięcie)?

Jim
źródło
3
Nigdy nie zauważyłem takiego zachowania w Vimie na żadnej platformie ... Co się stanie, jeśli uruchomisz gVim w następujący sposób: gvim -u NONE -U NONE(możesz użyć cmd.exe lub zrobić skrót)? Zapobiegnie to ładowaniu plików (g) vimrc.
Martin Tournoij,
1
Czy to twój kompletny plik vimrc? Moim pierwszym podejrzeniem byłoby to, że autocmd w twoim pliku vimrc usuwa końcowe białe znaki. Czy zachowanie zmienia się po uruchomieniu gVim bez pliku vimrc (patrz powyższy komentarz)?
Martin Tournoij,
Powyższe nie jest moim kompletnym .vimrc, są też inne ustawienia. Uruchomienie gVim bez .vimrc (: nazwa skryptu pokazuje nr .vimrc lub .gvimrc) rozwiązuje mój problem. Masz absolutną rację, muszę przejrzeć moją .vimrc lub coś innego, co może być przyczyną.
Jim
Najwyraźniej ta eliminacja białych znaków na nowych liniach jest pożądanym zachowaniem, czytam tutaj , aby utrzymać plik w czystości.
Jim
Chodzi o otwieranie nowych linii ... Nie o pisanie do pliku?
Martin Tournoij,

Odpowiedzi:

11

Przeglądając dokumentację dotyczącą autoindent, można znaleźć odpowiedź na pytanie, dlaczego i jak go obejść. :help 'autoindent':

Skopiuj wcięcie z bieżącego wiersza podczas rozpoczynania nowego wiersza (pisanie <CR> w trybie wstawiania lub podczas używania polecenia „o” lub „O”). Jeśli nic nie wpiszesz w nowym wierszu oprócz <BS>lub, CTRL-Da następnie wpiszesz <Esc>, CTRL-Olub <CR>, wcięcie zostanie ponownie usunięte. Przeniesienie kursora do innej linii ma ten sam efekt, chyba że flaga „I” jest uwzględniona w „opcjach cp”.

Innymi słowy, jeśli chcesz, aby nie zgubił wcięcia, wpisz coś, a następnie wciśnij klawisz Backspace przed uderzeniem Esc, a wiodące miejsce pozostanie.

Alternatywnie, jeśli chcesz powrócić na poziom wcięcia, gdy wrócisz do trybu wstawiania i używasz 'cindent'również, użyj Shift-Szamiast i, co spowoduje wyczyszczenie (już pustej) linii, i zacznij od odpowiedniego poziomu wcięcia. To nie jest tak ogólne rozwiązanie jak powyższe, ale wolę to, gdy piszę kod C, aby moje pliki nie były zapisywane z liniami tylko białych znaków.

John O'M.
źródło
To jest ostateczna odpowiedź na moje pytanie z oryginalnej dokumentacji. Dzięki za podsumowanie i narrację - nie pomyślałbym o tym: h autoindent dla tej informacji. Dziękujemy również @Carpetsmoker za dyskusję prowadzącą do rozwiązania.
Jim
To rozwiązało problem polegający na zmianie mapowania o i O, aby nie wychodzić z trybu wstawiania, ale zachować wcięcie. Można to zrobić, robiąc nnoremap o o <BS><Esc><DEL>innoremap O O <BS><Esc><DEL>
Max Coplan
Dzięki wielkie!
Max Coplan