Como repetir um mapeamento ao manter a tecla pressionada

11

Eu tenho nos meus .vimrcalguns mapeamentos simples para redimensionar janelas divididas facilmente:

noremap <Leader><UP>    <C-w>+
noremap <Leader><DOWN>  <C-w>-

Isso funciona muito bem, mas por exemplo, quando eu quero redimensionar a janela de 10 linhas, tenho que pressionar e soltar Leader+ UP10 vezes.

Como posso repetir esse mapeamento enquanto as teclas são pressionadas? O que eu quero é que quando eu pressionar Leader+, UPo mapeamento será aplicado uma vez; depois de uma curta duração, ele será aplicado novamente e assim por diante enquanto pressiono as teclas.

Nota: Eu sei que é possível prefixar <C-w>+uma contagem e eu poderia codificá-la no mapeamento ou simplesmente inserir uma contagem antes de usar o mapeamento, mas não é assim que eu quero fazer isso.

Nota 2: Eu também sei que um mapeamento popular para redimensionar janelas é usar teclas +e -que são mais fáceis de pressionar várias vezes, mas não quero usar essas teclas para fazer isso também.

statox
fonte

Respostas:

14

Você pode tentar inserir um ... Vim submode ! Para o seu caso, algo como isto:

call submode#enter_with('grow/shrink', 'n', '', '<leader><up>', '<C-w>+')
call submode#enter_with('grow/shrink', 'n', '', '<leader><down>', '<C-w>-')
call submode#map('grow/shrink', 'n', '', '<down>', '<C-w>-')
call submode#map('grow/shrink', 'n', '', '<up>', '<C-w>+')

Isso significa que você insere o submodo com Leader-Upou Leader-Down(que também aumenta / diminui a janela uma vez) e depois - você só precisa pressionar Upou Downaumentar / diminuir a janela, até sair do submodo.

Consulte também a ajuda, para problemas de tempo limite, mas para desativá-la:

"disable submode timeouts:
let g:submode_timeout = 0

... o que significa que você permanecerá nesse submodo indefinidamente, até pressionar uma tecla diferente de Upou Downou até pressionar Esc.

Aaand, a próxima dica útil que eu recomendaria:

" don't consume submode-leaving key
let g:submode_keep_leaving_key = 1

... que permite mover diretamente para os próximos comandos, ao pressionar uma tecla diferente. Por exemplo, pressionar pressionará :o submodo e abrirá a linha de comando.

VanLaser
fonte
Eu tentei sua solução, mas ela não parece funcionar: Quando eu clico em <kbd> Leader </kbd> + <kbd> UP </kbd>, tenho a mensagem --submode: grow/shrink --e a janela é redimensionada por uma linha, mas o comando não é ' t repetido. Eu tentei com as 4 combinações de g:submode_keep_leaving_keye g:submode_timeoutpara 0 ou 1. Não tenho certeza se fiz algo errado ou não. Normalmente, estou usando o vim em um terminal, mas por enquanto só posso testar com o gVim no Windows, mas não tenho certeza se isso muda alguma coisa.
Statox
2
O comando não é repetido automaticamente, você ainda tem que bater Upou Downse tantas vezes quanto necessário (mas sem ter que pressionar Leaderprimeiro)
VanLaser
Oh, eu entendo o código melhor agora! Funciona perfeitamente graças!
Statox
2
Resposta perfeita e plugin incrível! (Nota: você tem que instalar o vim-submodo plug-in antes de adicionar os comandos anteriores à sua ~/.vimrc.)
weibeld
1

Com winresizer , bateu Ctrl- ee redimensionar longe!

Você usará as teclas hjkl regulares (e talvez as teclas de seta).

Você pode "aceitar" o redimensionamento ou "abortar".

Há também um modo de movimento em que você troca as janelas e um modo de foco em que você muda a janela em que está ativo.

D. Ben Knoble
fonte