Cofnij <CR> w trybie wstawiania

21

Czasami w trybie wstawiania <CR>trafiam przez pomyłkę i muszę kilkakrotnie uderzyć w backspace (zależy od wcięcia), aby wrócić tam, gdzie byłem.

na przykład

<div>
  <p> This is some text []</p>
</div>

Kursor jest []i uderzyłem <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Teraz muszę dwukrotnie nacisnąć klawisz Backspace, aby wrócić do poprzedniej linii (ta sprawa nie jest taka zła, ale nie ma dużo wcięć).

Czy znasz lepszy sposób?

nobe4
źródło
1
ctrl+wdwa razy wydaje się działać i być całkiem łatwym
reergymerej

Odpowiedzi:

10

Co powiesz na:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>wykona polecenie trybu normalnego ( :left 0), które usunie wszystkie wcięcia, spowoduje to również umieszczenie kursora na początku wiersza. <BS>wróci do ostatniej linii.

To jest trochę jak „wstecz J”.

Niestety mapowanie Shift + Enter lub Ctrl + Enter nie wydaje się możliwe, więc wybrałem <C-\>jako „blisko wejścia”.

Martin Tournoij
źródło
„W pobliżu wejścia” zależy od klawiatury: brytyjskie mają `` obok lewej zmiany :-)
TripeHound
2
Dlaczego nie użyć <C-u>zamiast <C-o>:left 0<CR>?
jamessan
@jamessan Działa to jako „wstecz J”: więc foo<CR>bar<C-\>zostawię cię z foobar. IMHO to bardziej przydatne, ale YMMV.
Martin Tournoij,
Racja, ale mówię, że <C-u>(tj. I_CTRL-U ) powinien być taki sam jak <C-o>:left 0<CR>.
jamessan
1
@jamessan Cóż, to zależy od pozycji kursora. Pisanie foo<CR>bar<C-u>pozostawi Ci znak foo<CR>(+ wszelkie automatyczne wcięcia dodane przez Vima). <C-o>:left 0<CR>zawsze będzie zachowywać się tak samo, niezależnie od pozycji kursora.
Martin Tournoij,
21

Mam to w sobie vimrc, druga część jest istotna:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

Co to robi: za każdym razem, gdy naciskasz Enterw trybie wstawiania, „przerywa także sekwencję cofania, rozpoczyna nową zmianę” (patrz h: i_CTRL-G_u). Oznacza to, że jeśli trafisz Enterprzez pomyłkę, to może teraz cofnąć zmiany bez usuwania poprzednich wstawione linie, albo z ESC u a, lub Ctrl-o u, jak zaproponowano Statox. Zasadniczo każdą linię można cofnąć osobno.

źródło

EDYCJA / AKTUALIZACJA: Jeśli zdarzy ci się używać emulacji Vima w Emacs, czyli trybie zła , możesz użyć tego pakietu dla podobnego efektu.

VanLaser
źródło
Teraz jestem ciekawy pierwszej części i tego, jak <c-y>odnosi się do wyskakującego menu.
8bittree
2
Zobacz tę odpowiedź: vi.stackexchange.com/a/3844/1800 . Ctrl-yw trybie wstawiania dokończy bieżące zaznaczanie wyskakujących okienek, a powyższe mapowanie pozwoli Enterrównież dokończyć.
VanLaser
Niezła sztuczka. Jednakże, prawdopodobnie zastąpić ostatnią część "<c-g>u<cr>"przez &paste ? "<cr>" : "<c-g>u<cr>", w przeciwnym razie następnym razem wkleić przez pomyłkę 200 linijek kodu HTML będziesz miał dużo zabawy odkręcenie go. :)
lcd047,
2
... i wyjaśnienie: kiedy pastejest włączony, mapowania trybu wstawiania są wyłączone (zgodnie z pomocą Vima)
VanLaser
1
Bardziej podoba mi się to rozwiązanie, ponieważ inne rozwiązania oparte na Backspace, Ctrl-W i Ctrl-U mogą nie działać w zależności od ustawienia tej backspaceopcji.
doubleDown,
4

Tak to robię Ctrl-wBackspace.

Ctrl-waby usunąć ostatnie słowo (zapomniałem, czy jest to standardowy vim, czy nie), a ponieważ są to tylko spacje, zabierze mnie z powrotem na początek wiersza. Następnie Backspacezabierze mnie z powrotem do poprzedniej linii, w której byłem.

Juan Enrique Muñoz Zolotoochin
źródło
Sweet, nie wiedziałem o Ctrl-wużyciu w trybie wstawiania. Ale Carpetsmoker ♦ jest jeszcze szybszy. Zatem domyślne wiązanie Ctrl- \ nie wydaje się takie przydatne.
nobe4
1
Ctrl + W jest "standard Vim" ;-) Zob :help i_CTRL-W. I dwukrotne naciśnięcie wydaje się też załatwić sprawę?
Martin Tournoij,
1
Właśnie widziałem na stronie pomocy, która <C-u>może być bardziej przydatna, ponieważ usuwa wszystkie znaki z nowej linii
nobe4
1

Moje wyjście z tego jest (z trybu wstawiania) UpCtrl-oJDel. Być może nie jest to najskuteczniejsza kombinacja, ale robię to bez konieczności myślenia o tym.

lcd047
źródło
Zobacz także: Jak łączyć linie bez tworzenia spacji? .
Martin Tournoij,