Se eu entendi corretamente, você pode usar
'<
e
'>
O problema é que eles vão para o início / fim da área visual anterior , não a atual.
Então, você poderia fazer algo assim:
:vmap __ <Esc>'>aEND<Esc>'<iSTART<Esc>l
Na minha versão do Vim, depois de usar essa sequência, a última área visual fica um pouco instável (re-selecionando-a com gv
seleciona uma área que não está certa).
Para se movimentar na área visual atual , um usuário pode usar interativamente o
(e talvez O
se estiver usando uma área de bloco), mas eles não são determinísticos se você quiser usá-los em um mapa.
Então, escrevi a função abaixo para criar uma versão determinística de o
(definida como _^
e _$
below). O comando _*
do exemplo os usa para fazer um "agrupamento" semelhante ao acima de __
, mas também falsifica a manutenção da área visual selecionada, selecionando novamente uma área ( 1v
) depois de fazer o agrupamento:
:function! MoveToVisualAreaExtrema(wantEnd) range
: normal gv
: let l:mode = mode()
: " only character (v) and line mode (V) work with this implementation
: if !(l:mode == 'v' || l:mode == 'V')
: throw 'must be in character- or line-visual mode'
: endif
: " get original posision
: let l:iLn = line('.')
: let l:iCl = col('.')
: " move to other end of visual selection
: normal o
: " get current position
: let l:cLn = line('.')
: let l:cCl = col('.')
: let l:atEnd = (l:cLn > l:iLn) || (l:cLn == l:iLn) && (l:cCl > l:iCl)
: if a:wantEnd != l:atEnd
: normal o
: endif
: if l:mode == 'V'
: execute 'normal ' . (a:wantEnd ? '$' : '0')
: endif
:endfunction
:vmap _^ :call MoveToVisualAreaExtrema(0)<CR>
:vmap _$ :call MoveToVisualAreaExtrema(1)<CR>
:" Example: wrap ";print q();" around the visual region
:vmap _* _$<Esc>a);<Esc>gv_^<Esc>i;print q(<Esc>l1v