W vimie, czy zapobiegnie cofnięciu się karetki, gdy opuszczę tryb edycji?

9

W vim, jeśli wejdę i wyjdę z trybu edycji bez robienia czegokolwiek, karetka kończy się jedną postacią po lewej stronie. A jeśli wejdę i wyjdę z trybu dołączania, kursor przesunie się do przodu, a następnie do tyłu.

W takich przypadkach można skonfigurować vima tak, aby zostawił daszek w spokoju?

Idealnie po prostu chcę zawsze wchodzić w tryb dołączania, ale bez przesuwania kursora, gdy wchodzę lub wychodzę z tego trybu.

(Obecnie zazwyczaj używam trybu wstawiania, ponieważ nie psuje mojej pozycji karetki przy wejściu. To znaczy, z wyjątkiem sytuacji, gdy muszę dołączyć się do końca linii, w którym to przypadku przysięgam na vim za zachowanie w tak archaiczny sposób , naciśnij klawisz Esc i przejdź do trybu dołączania).

RomanSt
źródło
1
Odpowiedzi na to pytanie są dobre. Chcę tylko zaznaczyć, że jeśli są poprawne w swoich założeniach, że używasz i, aby przejść do trybu edycji, to właśnie to powoduje cofanie się. Jeśli użyjesz „a” (nie A), będzie działać zgodnie z oczekiwaniami.
Johnny
@ Johnny Nie sądzę, że tak będzie. Zwykle jestem w trybie „normalnym”, poruszam się po pliku i tym podobne. Kiedy muszę dokonać edycji, najpierw umieszczam kursor, a następnie naciskam „a”, a potem stwierdzam, że źle go ustawiłem, ponieważ przesuwa się w prawo. Biorąc pod uwagę, że spędzam 99% czasu na edytowaniu w nowoczesnych edytorach, nie ma szans, żebym kiedykolwiek pamiętał o umieszczeniu jednego znaku w lewo przed naciśnięciem „a”. Właśnie dlatego liczyłem na makro lub coś takiego.
RomanSt
To kwestia nawyków. To naprawdę denerwujące, ale tylko w pierwszych latach. Będziesz w końcu nauczyć się prasie ilub abez o tym myśleć, a może być nawet s, S, ci", itd. Zamiast ograniczać ii a.
Luc Hermitte,
1
Rozumiem twoją frustrację, ale. Zamiast tego spróbuj pomyśleć o tym, co robisz. Zadaj sobie pytanie, czy jest na to lepszy sposób (niż używanie Vima jako zwykłego redaktora tekstu). Zauważyłem, że z Vimem zawsze jest lepszy sposób, Vim robienie rzeczy. Możemy pomóc, ale musimy wiedzieć, co robisz, gdy napotykasz problemy. Czy na przykład przechodzisz do trybu edycji, gdy chcesz coś usunąć? Nie, jest „x” do usuwania znaków. Chcesz zastąpić postać, potem jest „r”. Pomyśl tylko o tym, co chcesz osiągnąć.
Johnny
@ Johnny Rozumiem, o czym mówisz, ale to wymaga zbyt dużej ilości ponownej nauki, aby miało to dla mnie sens. Spędzam 99% czasu edytowania w Visual Studio i uwielbiam to. Wiem tylko, że nie nauczę się tego ponownie, więc nie ma sensu marnować czasu.
RomanSt

Odpowiedzi:

9

To pytanie jest często zadawane przez nowych użytkowników vi / Vim, a odpowiedź jest taka, że ​​w trybie normalnym kursor jest zawsze „na” znaku, ale w trybie wstawiania kursor jest zawsze „między” dwoma znakami (pamiętaj, że koniec -of-line to znak). Tak naprawdę nie widać tego również w konsoli Vima, ale w GUI zauważysz, że kursor staje się paskiem między dwoma znakami po przejściu do trybu wstawiania, zamiast bloku nad znakiem, gdy jesteś w trybie normalnym.

Więc to, co widzisz, niekoniecznie musi przesuwać kursor o jedną postać do tyłu, gdy opuścisz tryb wstawiania, ale po prostu zmienia postać. Jedynym bezpiecznym kierunkiem ruchu jest w lewo (lub w tył). Tak więc masz więcej niż jeden sposób wejścia w tryb wstawiania:

  • „a” wchodzi w tryb wstawiania z kursorem „pomiędzy” znakiem, na którym znajdował się kursor, a następnym znakiem po prawej stronie.
  • „i” wchodzi w tryb wstawiania z kursorem „pomiędzy” znakiem, na którym kursor był, a poprzednim znakiem po lewej stronie.

Niektórzy starali się powstrzymać ten „ruch”, który im się nie podoba, ale nieuchronnie koliduje z wtyczkami i innymi skryptami Vima, które chcą uruchomić w przyszłości.

Moją sugestią jest przyzwyczajenie się do używania poleceń „a” i „i” (oraz „A” i „I”) w odpowiednich okolicznościach.

Przydatne są również polecenia „o” i „O”. Widzieć:

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

Edycja: Jeśli nadal jesteś zdecydowany zmienić to zachowanie, wypróbuj następującą wskazówkę: Unikaj ucieczki przed przesunięciem kursora o jeden znak w lewo

Heptyt
źródło
1
Rozumiem, co mówisz, ale „i” / „Esc” / „i” / „Esc” powoduje rzeczywisty ogólny ruch siatki karetki. Naprawdę uważam, że VIM po prostu nie jest dla mnie.
RomanSt
2
@romkyns: Myślę, że powinieneś zrobić azamiast tego i.
Wstrzymano do odwołania.
1
@Dennis zgodził się, że „a” jest nieco lepsze, ponieważ pozwala na umieszczenie karetki przed pierwszym znakiem i po ostatnim znaku w linii - co „i” arbitralnie zabrania. Ale próbowałem tego; dzieje się tak, że zawsze gubię karetkę przed naciśnięciem „a” - więc muszę natychmiast przesunąć karetkę o jedną pozycję w lewo. Za każdym razem. Zrobiło się to męczące, więc zmieniłem na „i”.
RomanSt
@Heptite Czy mógłbyś mi wskazać na jedną z takich wadliwych implementacji czegoś, co tłumi ruch? Szanse, że w przyszłości będę chciał użyć wtyczek lub innych skryptów, są zasadniczo zerowe.
RomanSt
1
@romkyns, to (nie) działa w obie strony. Ponowne mapowanie <esc>rzeczywiście uniemożliwi <esc>prawidłowe korzystanie z większości wtyczek , ale nadal będzie Cię drażnić, gdy będziesz używać innych standardowych funkcji, które powracają do normalnego trybu w ten sam sposób <esc>. Nauka używania właściwego klucza w locie to rozwiązanie, które skaluje się / działa na dłuższą metę.
Luc Hermitte,
1

Myślę, że przez karat rozumiesz kursor, a jeśli używasz „i”, wstawi to bezpośrednio tam, gdzie jest twój kursor, „a” (które, jak sądzę, szukasz) przesuwa kursor o jeden znak w prawo. Również shift-i (I) przejdzie na początek linii, a shift-a (A) dojdzie do końca linii.

Jeśli źle zrozumiałem twoje pytanie, przepraszam.

Dan M.
źródło
1

Ponieważ ponowne mapowanie <ESC>jest uważane za „ryzykowne”, po prostu łączę się z jednym z podejść do klawisza unikania unikania i mam następujące .vimrc:

 inoremap ii <ESC>l

Uwaga: Upewnij się, że na końcu wiersza nie ma spacji.

Prosty, ale w pełni certyfikowany jako „działa dla mnie dobrze”, ponieważ w przeciwnym razie musiałbym pisać ręcznie.

Niezależnie od tego, czy używam, aczy inadal dostaję zachowanie cofnięcia karetki, i to mnie denerwuje tak często, jak potem, a następnie następną rzeczą, którą chcę wpisać, jest d$usunięcie do końca linii itp.

atomów
źródło
Niezwykle proste rozwiązanie. Najlepsze, na jakie natknąłem się.
Tyler Collier
1

Oto moje rozwiązanie:

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

To jest zabawne. To samo pytanie istnieje na wszystkich trzech stronach: SO, SU, Unix + Linux.

Steven Lu
źródło
Nie wydaje mi się to śmieszne :) Na szczęście znalazłem edytora, który nie doprowadza mnie do szału (diakonos), więc nie jest to już problemem. Mimo to cieszy się uznaniem tych, którzy lubią vima.
RomanSt