Vim: vai para o começo ou fim da área visual

3

Eu quero fazer alguns mapeamentos complicados que envolvem a área visual atualmente selecionada com algum código. Para fazer isso, preciso ter certeza de que estou no começo da área visual atual. Existe alguma tecla de atalho para isso no modo visual?

    
por Bogdan Gusiev 26.02.2010 / 22:02

2 respostas

4

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
    
por 27.02.2010 / 01:25
0

Capital H ("Casa") levará você ao início e "L" ("Última") até o final.

Um pouco de comportamento que pode causar problemas é que eles colocam o cursor no primeiro caractere não-branco da linha, então digite "0" para ir para o início absoluto da linha.

    
por 27.02.2010 / 00:20