Vim - Modo Visual - Melhorar a seleção de palavras

Vim - Modo Visual - Melhorar a seleção de palavras

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

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

(*)

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.

insira a descrição da imagem aqui

Este é o comportamento desejado:

insira a descrição da imagem aqui

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

Obrigado!

Responder1

Isso vmapse 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 :callexplica:

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

[]

informação relacionada