Lepsze zachowanie kliknięcia myszą dzięki wirtualnej edycji gVim

1

Lubię korzystać z funkcji virtualedit = all Vima, ale lubię też możliwość klikania za końcem linii i kierowania kursora bezpośrednio na koniec linii (zamiast do dokładnej pozycji, którą kliknąłem). Czy istnieje wtyczka lub coś, co może sprawić, że położenie kursora Vima po kliknięciu myszą będzie działało bardziej inteligentnie? Najlepiej byłoby, gdyby wykonał jedną z następujących czynności:

  • Ignoruj ​​preferencje virtualedit po kliknięciu myszą: Jeśli kliknięcie nastąpiło po ostatnim znaku w linii, Vim umieści kursor na końcu linii, niezależnie od tego, czy virtualedit jest włączony.
  • Zachowanie zależne od trybu kliknięcia myszą: W trybie normalnym kliknięcie myszką po zakończeniu linii powoduje przeskok kursora do ostatniego znaku; w trybie wstawiania kursor jest umieszczony pod myszą.
  • Zachowanie w stylu MS-Word (preferabale): Kursor przeskakuje do końca linii jednym kliknięciem lub do pozycji virtualedit po dwukrotnym kliknięciu

Wiem, że mogłem po prostu przejść z virtualedit-all do virtualedit-block, ale wolę virtualedit = wszystko do wszystkiego oprócz zachowania kliknięcia myszą. (W rzeczywistości lubię nawet ustawiać kursor na środku znaku tabulacji za pomocą kliknięcia myszą, więc tak naprawdę jest to po prostu zachowanie klikania po ostatnim znaku w linii).

PS Proszę, żadnych komentarzy ani odpowiedzi sugerujących, że po prostu uczę się nie używać myszy. Używanie myszy jest jednym z powodów, dla których przestawiłem się z Vima na gVim, ponieważ szczerze mówiąc, czasami jest to niezwykle wygodne, nawet jeśli twoją podstawową metodą poruszania się w pliku jest tylko klawiatura.

EDYCJA: Dodano pomysł zależny od trybu.

Kyle Strand
źródło

Odpowiedzi:

1

Kliknięcia myszą są możliwe do zmapowania, tak jak naciśnięcia klawiszy w Vimie. Możesz więc ponownie przypisać kliknięcie myszy, aby ustawić virtualedit, jak chcesz, a następnie kliknij myszką, a następnie ustaw go z powrotem.

Tryb wstawiania jest bardziej skomplikowany, niż próbuję w tej chwili, ale tryb normalny jest łatwy. Coś takiego powinno działać, chociaż byłoby jeszcze lepiej zapisywać i przywracać virtualedit, niż ustawiać to wprost:

nnoremap <silent> <LeftMouse> :set virtualedit=<CR><LeftMouse>:set virtualedit=all<CR>

Możliwe jest również ponowne mapowanie podwójnego kliknięcia w podobny sposób, używając <2-LeftMouse>zamiast <LeftMouse>. Niektóre eksperymenty wykazały, że może nie być potrzebne. Ale ponieważ dwukrotne kliknięcie domyślnie wprowadza cię w tryb wyboru wizualnego, możesz chcieć mapowania takiego jak:

nnoremap <silent> <2-LeftMouse> <LeftMouse>

Jednak tak naprawdę nie mogłem tego uruchomić. Nie mogłem wymyślić, jak go utrzymać, aby nie wchodził w tryb wizualny, nawet przy takim mapowaniu i kilku podobnych zastosowanych.


EDYCJA (przez OP; chcę opublikować tutaj moje „ostateczne” rozwiązanie, aby inni mogli je zobaczyć, ale nie chcę zamieszczać osobnej odpowiedzi, ponieważ tak naprawdę potrzebowałem tej odpowiedzi):

Oto, co skończyło się na moim .vimrc:

function! TempNonVirtual()
    let g:oldvirtualedit=&virtualedit
    set virtualedit=
endfunction
function! RestoreVirtual()
    let &virtualedit=g:oldvirtualedit
endfunction
set virtualedit=all
nnoremap <silent> <LeftMouse> :call TempNonVirtual()<CR><LeftMouse>:call RestoreVirtual()<CR> 

Chciałbym połączyć te dwie funkcje w jedną wywoływaną funkcję NonVirtualClicklub coś, co zapisałoby stare ustawienie virtualedit, wykonało kliknięcie, a następnie przywróciło ustawienie, ale <LeftMouse>nie jest poleceniem, więc nie działa wewnątrz funkcji . (Sugestie dotyczące obejścia tego problemu byłyby mile widziane ...)

Ben
źródło
Dodałem też następujące mapowanie, które nie wydają się działać dla mnie nnoremap <silent> <2-LeftMouse> <LeftMouse>i. Z jakiegoś powodu „podwójne kliknięcie, aby przejść do trybu wstawiania” wydaje mi się logiczne. Idealnie chciałbym to zrobić tylko wtedy, gdy kursor znajdzie się poza końcem linii i zachowaj standardowe zachowanie w przeciwnym razie, co powinno być dość łatwe w użyciu col('$')i getpos, ale na razie pozostawię to bez zmian . Dzięki jeszcze raz!
Kyle Strand
Właściwie to mapowanie wydaje się ... niespójne. Czasami umieszcza mnie w trybie WIZYTY WIZUALNEJ, czasem umieszcza mnie w trybie WIZYTY i podkreśla dużą część linii ...
Kyle Strand