![Vim - Modo Visual - Melhorar a seleção de palavras](https://rvso.com/image/1399997/Vim%20-%20Modo%20Visual%20-%20Melhorar%20a%20sele%C3%A7%C3%A3o%20de%20palavras.png)
Senhores/senhoras,
Não entendo porque o vim está exibindo o seguinte comportamento quando aciono o atalho abaixo no modo visual (.vimrc):
vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
"empty
endfunction
O Vim vai para a primeira coluna da linha acima da linha onde aciono o atalho e mostra o seguinte ": '<,'> call Test()" na barra de status. Mas isso só acontece quando chamo uma função, quando utilizo um comando como "$" (Veja *) o comportamento é o esperado.
(*)
vmap <C-LEFT> $
Meu objetivo é fazer com que o Vim considere a "tab" como uma palavra quando eu uso a combinação "Ctrl+Left", pois quando o primeiro caractere da linha for uma "tab" o Vim selecione a primeira palavra da linha superior.
Este é o comportamento desejado:
Se você tiver alguma solução alternativa ou solução alternativa, também ficaria grato.
Obrigado!
Responder1
Isso vmap
se aplica quando o vim está no modo Visual ou Selecionar. Você não disse qual texto foi selecionado quando acionou o mapa.
O comportamento surpreendente pode ser resultado do
:'<,'>
intervalo que é fornecido automaticamente quando você alterna do modo Visual para o modo Ex usando :. Além disso, a maneira como as funções definidas pelo usuário lidam com 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_:
Responder2
Isso ocorre porque o :call
é invocado com o intervalo visual adicionado automaticamente '<,'>
. :help :call
explica:
Quando um intervalo é fornecido e a função não o trata sozinha, a função é executada para cada linha do intervalo, com o cursor na primeira coluna dessa linha. O cursor fica na última linha (possivelmente movido pela última chamada de função).
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
Responder3
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
Observe, entretanto, que eu 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 esta abordagem simples eu “conserto” o comportamento indesejado do Vim explicado acima.
Veja um exemplo de uso emhttps://github.com/eduardolucioac/groovim/blob/master/.vimrc
[]