Mam funkcję, która przesuwa kursor z wbudowaną funkcją cursor()
i działa poprawnie w trybie normalnym.
Dla konkretności przypuszczać, że jest to funkcja:Jak wywołać funkcję, która przesuwa kursor bez opuszczania trybu wizualnego?
function! F()
call cursor(line('.')+1, 1)
endfunction
używany z odwzorowań jak:
nnoremap <buffer> a :call F()<cr>
Teraz chcę ponownie użyć tej funkcji, aby przesunąć kursor w dowolnym trybie wizualnym (wizualnej, linii wizualne i blokowe wizualnie) i bez utraty poprzedniej selekcji.
Na przykład, z początkowym buforem w trybie widzenia (c
oznacza kursor znajduje się na jednej linii, v
oznacza, że linia jest częścią obecnego wyboru wizualnej)
vc 1
2
3
uderzenia a
da:
v 1
vc 2
3
i uderzanie a
ponownie dałaby:
v 1
v 2
vc 3
, więc stary wybór został zachowany.
Chciałbym ponownie użyć F()
tak bardzo, jak to możliwe, ponieważ w mojej aplikacji F()
jest dość duży.
Jaki jest najlepszy sposób na zrobienie tego?
Do tej pory najlepsze co mogłem zrobić, to użyć funkcji Wrapper:
function! VisMove(f)
normal! gv
call function(a:f)()
endfunction
i map jak:
vnoremap <buffer> a :call VisMove('F')<cr>
jednak nie jestem zadowolony, ponieważ w ten sposób:
- Wymaga to umieszczenia irytującej otoki na każdym nowym pliku fgplugin, który piszę.
- Wywołanie funkcji, która przesuwa kursor (lub ma inne arbitralne efekty uboczne) bez opuszczania trybu wizualnego (bieżącego), wydaje się być tak naturalną rzeczą, którą można zrobić. Istnieje nawet już
<expr>
, który prawie to robi, ale resetuje pozycję kursora.
Nie mogę myśleć o innym obejście od szczytu głowy; Myślę, że każda mapa wizualna straciłaby swoją wizualną selekcję. – dsummersl
Muszę oprzeć się pokusie, aby wszystkie polecenia w twoim pytaniu były bardziej czytelne. – romainl
W trybie wizualnym kursor znajduje się na początku lub na końcu zaznaczenia, czy próbujesz rozwinąć/wycofać zaznaczenie do dowolnego punktu? – romainl