Dlaczego `ESC` przesuwa kursor z powrotem w vimie?

62

W vimie, kiedy uderzyłem, ESCaby powrócić do trybu poleceń, kursor przesuwa jeden znak w lewo. Nie tego oczekiwałbym, od czasu do czasu od razu uderzyłem, laby wrócić do tego miejsca, być może by usunąć postać.

Czy istnieje powód takiego zachowania? Czy to wygodne w przypadku schematu użytkowania, którego mi brakuje?

Eric Wilson
źródło
1
Do tej pory nawet tego nie zauważyłem ... i używam vima codziennie. Nie mam pojęcia dlaczego, ale interesuje mnie odpowiedź.
Gabe.
5
wracając do trybu wstawiania, możesz nacisnąć „a”, aby dołączyć, zamiast „i”, aby wstawić. Następnie wrócisz do pozycji, w której byłeś przed naciśnięciem klawisza Escape.
penguin359,

Odpowiedzi:

40

W trybie wstawiania kursor znajduje się między znakami lub przed pierwszym lub po ostatnim znaku. W trybie normalnym kursor znajduje się nad znakiem (znaki nowego wiersza nie są w tym celu znakami). Jest to nieco niezwykłe: większość redaktorów zawsze umieszcza kursor między znakami i większość poleceń działa na znak po (nie mówiąc ściśle, pod ) kursorze. Być może wynika to częściowo z faktu, że przed interfejsami graficznymi terminale tekstowe zawsze pokazywały kursor na znaku (podkreślenie lub blok, być może miganie). Ta abstrakcja kończy się niepowodzeniem w trybie wstawiania, ponieważ wymaga to jeszcze jednej pozycji (słupki vs. ogrodzenia).

Przełączanie między trybami wymaga przesunięcia kursora o pół znaku, że tak powiem. W ilewo przesuwa dowodzenia, aby umieścić kursor przed znakiem było po wszystkim. aPolecenie przenosi prawo. Wyjście z trybu wstawiania (przez naciśnięcie Esc) przesuwa kursor w lewo, jeśli to możliwe (jeśli jest na początku linii, zamiast tego przesuwa się w prawo).

Przypuszczam, że takie Esczachowanie ma sens. Często piszesz na końcu linii, a tam Escmożesz tylko iść w lewo. Ogólne zachowanie jest więc najczęstszym zachowaniem.

Pomyśl o znaku pod kursorem jako ostatnim interesującym znaku, a o poleceniu wstawiania jako a. Możesz powtarzać a Escbez przesuwania kursora, z tą różnicą, że zostaniesz uderzony o jedną pozycję w prawo, jeśli zaczniesz na początku niepustej linii.

Gilles
źródło
21

Wizualnie ma to większy sens w gvim:

Podczas edycji kursor znajduje się między znakami:
wprowadź opis zdjęcia tutaj

W trybie normalnym znajduje się na ostatnim znaku:
wprowadź opis zdjęcia tutaj

Więc tak naprawdę nie wraca do postaci, tylko od bycia pomiędzy r i sbycia na r

Martin Ueding
źródło
1
Świetne zdjęcie. Szczerze mówiąc, jestem w obozie, który mówi, że postać mpowinna pozostać podświetlona po powrocie do normalnego trybu ...
Steven Lu
Ups linki obrazkowe są teraz martwe.
Steven Lu
1
linki obrazkowe są teraz martwe.
Steven Lu,
1
Tak, ręczne hostingowanie twoich zdjęć jest zarówno bardziej pracochłonne, jak i mniej niezawodne niż użycie narzędzia w edytorze Markdown na tej stronie.
Steven Lu
1
Czy znów wszystko jest w porządku? To jest „Kursor”, co
wpisali,
15

To zachowanie można edytować zgodnie z odpowiedzią tutaj , ale zatrzymaj się i pomyśl o tym, co się dzieje przez sekundę. Kiedy jesteś w trybie wstawiania, tak naprawdę nie jesteś ponad postacią, ale MIĘDZY nimi. Po wstawieniu czegoś kursor przeskakuje na koniec tego, co wstawiłeś, aby następna wstawiona rzecz była później. Pomyśl teraz, czy po prostu napisałeś list, a potem chciałeś coś z tym zrobić. Wciśnięcie Escspowoduje umieszczenie kursora wyboru bezpośrednio nad ostatnim wstawionym znakiem. Gdyby tego nie zrobił, byłoby to raczej niezręczne.

Sytuacja, o której prawdopodobnie myślisz, to sytuacja, gdy jesteś w trybie wstawiania i poruszasz się tak, jakbyś był w trybie normalnym, a następnie przełączał się. W takim przypadku kursor wydaje się cofać o jeden znak, ale jeśli tak myślisz, oznacza to, że byłeś w trybie wstawiania, a ostatnią rzeczą, którą zrobiłeś, było NIE wstawianie. Może powinieneś spędzać więcej czasu w trybie normalnym?

Caleb
źródło
15
To nie ma dla mnie sensu. Jak wytłumaczysz zachowanie wstecznego powtarzania się ii ESCnaciskania klawiszy?
Warren Young
4
Przejście do trybu wstawiania, nie wstawianie niczego, a następnie pozostawienie go nie jest uczciwym testem. Dlaczego miałbyś być w trybie wstawiania, jeśli czegoś nie wstawiłeś. Jeśli coś wstawisz, powrót do trybu normalnego pozostawia wybrany znak. Bardzo intuicyjny.
Caleb
4
Tu nie chodzi o „sprawiedliwość”, chodzi o moc wyjaśniającą. Jeśli twoja teoria działania nie wyjaśnia wszystkich zachowań, jest to niekompletne lub zachowanie vi jest niespójne. Wolę wierzyć, że vi jest doskonały pod każdym względem, a zatem konsekwentny. :)
Warren Young,
9
@Warren Zachowanie „cofania się”, ipo którym następuje, ESCjest funkcją ii jest całkowicie niezależne ESC; w szczególności, kiedy iuderzasz, prosisz vima o wstawienie znaku, co z definicji oznacza „wstaw znak przed tym, w którym jestem”, w przeciwieństwie do tego, aco oznacza „dodaj znak po tym”.
Kromey
3
Ogólnie rzecz biorąc, po każdej zmianie, kiedy zostawiam tę zmianę, skończę z tą zmianą, a następną rzeczą, którą chciałbym zrobić, prawdopodobnie będzie wprowadzenie innej zmiany. Tak więc, dla mnie, po wyjściu z trybu wstawiania (bez względu na to, jak go wprowadziłem), generalnie wolałbym, aby kursor znajdował się na następnym znaku, więc jestem gotowy na następną zmianę, zamiast być gotowym na zmianę tego, co właśnie włożony
Kyle Strand
6

Wpisz Alt+, Laby powrócić do trybu poleceń.

Nie wymaga żadnych mapowań ani zmian konfiguracji vim. Działa, ponieważ na większości emulatorów terminali Alt+ KEYwysyła znak „ Esca” KEY(na xterm może być konieczne dodanie Xterm*metaSendsEscape: truewiersza do pliku ~ / .Xdefaults). Że zachowanie pozwala nawet „stworzyć” inne kombinacje trybie Insert, które działają od razu po wyjęciu z pudełka - jak Alt+ Sdo Backspace.

Nawiasem mówiąc, umieszczenie kursora nad postacią, którą właśnie napisałeś, może być bardzo niewygodne. Na przykład Escdwnie usunie słowa następującego po właśnie wstawionym tekście.

użytkownik79932
źródło
Tych niedogodności można uniknąć, zawsze wpisując spację w trybie wstawiania przed wyjściem. Następnie kursor opuszczający tryb wstawiania jest umieszczany nad spacją i można wpisać, Esc d eaby usunąć słowo z przodu. Wróciłem do domyślnego zachowania, ponieważ czułem, że zmieniło to inne zachowania już zakodowane w mojej głowie.
mljrg
4

Oto moje rozwiązanie.

To bardziej zwięzła wersja rozwiązania oferowanego na stronie Wikipedii na ten temat .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Steven Lu
źródło
Tutaj również +1 za cytowanie strony wiki, mimo że użytkownik tak naprawdę nie pytał o sposób zmiany tego zachowania.
Kyle Strand
Zauważysz, że jeśli zagłębisz się wystarczająco głęboko w Vimie, wiele wtyczek polega na domyślnym (nieco nieintuicyjnym) zachowaniu, więc jeśli zauważysz, że jakieś rzeczy losowo zjadają lub psują pojedynczy znak, może to być spowodowane. Sam nie używam tej komendy automatycznej; jednak działa dobrze.
Steven Lu,