Melhor comportamento do clique do mouse com a edição virtual do gVim

1

Eu gosto de usar o recurso virtualedit = all do Vim, mas também gosto de clicar depois do final de uma linha e fazer com que o cursor vá diretamente para o final da linha (em vez de ir para a posição exata em que cliquei) . Existe um plugin ou algo que pode fazer com que a colocação do cursor do Vim após um clique do mouse aja de maneira mais inteligente? Idealmente, gostaria que fizesse um dos seguintes procedimentos:

  • Ignora a preferência de virtualedit com o clique do mouse: Com um clique do mouse, se o clique ocorreu após o último caractere na linha, o Vim posicionaria o cursor no final da linha, independentemente de o virtualedit estar ativado em.
  • Comportamento do clique do mouse dependente do modo: No modo normal, o clique do mouse após o final da linha faz com que o cursor salte para o último caractere; no modo de inserção, o cursor é posicionado sob o mouse.
  • Comportamento de estilo do MS-Word (preferabale): O cursor pula para o final da linha com um único clique ou para virtualizar a posição ao clicar duas vezes

Eu sei que eu poderia simplesmente mudar de virtualedit-all para virtualedit-block, mas eu prefiro virtualedit = all para tudo, exceto o comportamento do mouse. (Na verdade, até gosto de poder posicionar o cursor no meio de um caractere de tabulação usando um clique do mouse, por isso é apenas o comportamento de clicar depois do último caractere em uma linha.)

P.S. Por favor, sem comentários ou respostas sugerindo que eu apenas me ensine a não usar o mouse. O uso do mouse é uma das razões pelas quais eu mudei do Vim para o gVim, porque, francamente, ele é extremamente conveniente às vezes, mesmo que o seu método principal de movimento em um arquivo seja somente com teclado.

EDIT: Adicionado ideia dependente do modo.

    
por Kyle Strand 07.02.2014 / 20:15

1 resposta

1

Os cliques do mouse são mapeáveis como os pressionamentos de tecla no Vim. Assim, você pode remapear um clique do mouse para definir o virtualedit como desejar, em seguida, fazer o clique do mouse e, em seguida, defini-lo de volta.

O modo de inserção é mais complicado do que eu gostaria de tentar no momento, mas o modo normal é fácil. Algo como isso deve funcionar, embora seja ainda melhor salvar e restaurar o virtualedit em vez de defini-lo explicitamente:

nnoremap <silent> <LeftMouse> :set virtualedit=<CR><LeftMouse>:set virtualedit=all<CR>

Também é possível remapear um clique duplo de maneira semelhante, usando <2-LeftMouse> em vez de <LeftMouse> . Alguma experimentação mostrou que pode não ser necessário. Mas, como o clique duplo por padrão coloca você no modo de seleção visual, talvez você queira um mapeamento como:

nnoremap <silent> <2-LeftMouse> <LeftMouse>

Eu não consegui fazer isso funcionar, no entanto. Eu não consegui descobrir como fazê-lo ficar fora do modo visual, mesmo com esse mapeamento e várias aplicações similares.

EDIT (por OP; quero postar minha solução "final" aqui para que os outros possam ver, mas não quero postar uma resposta separada, já que essa resposta é realmente a que eu precisava):

Veja o que acabei colocando no meu .vimrc :

function! TempNonVirtual()
    let g:oldvirtualedit=&virtualedit
    set virtualedit=
endfunction
function! RestoreVirtual()
    let &virtualedit=g:oldvirtualedit
endfunction
set virtualedit=all
nnoremap <silent> <LeftMouse> :call TempNonVirtual()<CR><LeftMouse>:call RestoreVirtual()<CR> 

Gostaria de combinar essas duas funções em uma única função chamada NonVirtualClick ou algo que salvaria a configuração antiga do virtualedit, faça o clique e depois restaure a configuração, mas <LeftMouse> não é um comando não funciona dentro de uma função. (Sugestões sobre como contornar isso seria bem vindo ...)

    
por 09.02.2014 / 23:42