Vim - Modo Visual - Melhorar a Seleção de Palavras

0

Senhores / senhoras,

Eu não entendo porque o vim está exibindo o seguinte comportamento quando eu disparo o atalho abaixo no modo visual (.vimrc):

vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
     "empty
endfunction

OVimvaiparaaprimeiracolunadalinhaacimadalinhaondeeuatirooatalhoemostraoseguinte": '<,' > chama Test ()" na barra de status. Mas isso só acontece quando eu chamo uma função, quando eu uso um comando como "$" (veja *) o comportamento é o esperado.

(*)

vmap<C-LEFT>$

MeuobjetivoéfazercomqueoVimconsiderea"aba" como uma palavra quando eu uso a combinação "Ctrl + Left", porque quando o primeiro caractere da linha é uma "aba" Vim seleciona a primeira palavra na linha superior .

Esteéocomportamentodesejado:

Se você tiver alguma solução alternativa ou solução alternativa, eu também ficaria grato.

Obrigado!

    
por Eduardo Lucio 04.03.2014 / 03:19

3 respostas

1

O vmap se aplica quando o vim está no modo Visual ou Select. Você não disse qual texto foi selecionado quando acionou o mapa.

O comportamento surpreendente pode ser resultado do

:'<,'>

faixa que é automaticamente fornecida quando você alterna do modo Visual para o modo Ex usando : . Além disso, a maneira como as funções definidas pelo usuário manipulam intervalos por padrão.

Dito isto, esperaria que o cursor terminasse na última linha da seleção Visual. Não consigo reproduzir o comportamento que você descreve.

:help :call
:help '<
:help v_:
    
por 04.03.2014 / 04:51
1

Isso ocorre porque o :call é invocado com o intervalo visual automaticamente adicionado '<,'> . :help :call explica:

When a range is given and the function doesn't handle it itself, the function is executed for each line in the range, with the cursor in the first column of that line. The cursor is left at the last line (possibly moved by the last function call).

Então, você precisa limpar o intervalo

vmap <script> <C-LEFT> :<C-u>call Test()<CR>

ou faça a função lidar com isso:

function! Test() range
    
por 04.03.2014 / 09:12
0

Eu "resolvi" esse problema usando a seguinte abordagem:

" Note: "Normal" movement with "Ctrl+Right"! By Questor
nmap <silent> <C-Right> e
imap <silent> <C-Right> <C-o>e<Right>
vmap <silent> <C-Right> e

" Note: "Normal" movement with "Ctrl+Left"! By Questor
nmap <silent> <C-Left> b
imap <silent> <C-Left> <C-o>b
vmap <silent> <C-Left> b

Note, no entanto, que não uso uma função. Se uma função fosse usada, eu precisaria proceder como Ingo Karkat explica em sua resposta (usando : <C-u> ).

Com essa abordagem simples, eu "conserto" o comportamento indesejado do Vim explicado acima.

Veja um exemplo de uso no link

[] 's

    
por 19.06.2014 / 20:26