Comment répéter un mappage en maintenant la touche enfoncée

11

J'ai dans mes .vimrcquelques mappages simples pour redimensionner facilement les fenêtres fractionnées:

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

Cela fonctionne très bien mais par exemple, lorsque je veux redimensionner la fenêtre de 10 lignes, je dois appuyer et relâcher Leader+ UP10 fois.

Comment puis-je répéter ce mappage lorsque les touches sont enfoncées? Ce que je veux, c'est quand j'appuie sur Leader+ UPle mappage sera appliqué une fois puis après une courte durée il sera appliqué à nouveau et ainsi de suite pendant que je maintiens les touches.

Remarque: je sais qu'il est possible de préfixer <C-w>+un nombre et je peux le coder en dur dans le mappage ou simplement saisir un nombre avant d'utiliser le mappage, mais ce n'est pas comme ça que je veux le faire.

Note 2: Je sais aussi que la cartographie populaire pour redimensionner les fenêtres est d'utiliser +et les -touches qui sont plus faciles à presser à plusieurs reprises mais je ne veux pas utiliser ces clés pour le faire non plus .

statox
la source

Réponses:

14

Vous pouvez essayer d'entrer dans un ... sous- mode Vim ! Pour votre cas, quelque chose comme ceci:

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>+')

Cela signifie que vous entrez dans le sous-mode avec Leader-Upou Leader-Down(qui agrandira / rétrécira également la fenêtre une fois), puis - vous n'aurez qu'à appuyer sur Upou Downpour agrandir / réduire la fenêtre, jusqu'à ce que vous quittiez le sous-mode.

Voir aussi l'aide, pour les problèmes de timeout, mais pour le désactiver:

"disable submode timeouts:
let g:submode_timeout = 0

... ce qui signifie que vous resterez dans ce sous-mode indéfiniment, jusqu'à ce que vous appuyiez sur une touche autre que Upou Down, ou jusqu'à ce que vous appuyiez Esc.

Aaand, le prochain conseil utile que je recommanderais:

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

... qui vous permet de passer directement à vos prochaines commandes, lorsque vous appuyez sur une touche différente. Par exemple, appuyer sur :quittera le sous-mode et ouvrira la ligne de commande.

VanLaser
la source
J'ai essayé votre solution mais cela ne semble pas fonctionner: lorsque je frappe <kbd> Leader </kbd> + <kbd> UP </kbd> j'ai le message --submode: grow/shrink --et la fenêtre est redimensionnée sur une ligne mais la commande n'est pas ' t répété. Je l'ai essayé avec les 4 combinaisons de g:submode_keep_leaving_keyet g:submode_timeoutà 0 ou 1. Je ne sais pas si j'ai fait quelque chose de mal ou non. J'utilise habituellement vim dans un terminal mais pour l'instant je ne peux tester qu'avec gVim sur Windows mais je ne suis pas sûr que cela change quelque chose.
statox
2
La commande n'est pas répétée automatiquement, vous devez toujours frapper Upou Downvous - même autant de fois que nécessaire (mais sans avoir à appuyer d' Leaderabord)
VanLaser
Oh, je comprends mieux le code maintenant! Cela fonctionne parfaitement merci!
statox
2
Réponse parfaite et plugin incroyable! (Remarque: vous devez installer le plugin vim-submode avant d'ajouter les commandes ci-dessus à votre ~/.vimrc.)
weibeld
1

Avec winresizer , frappez Ctrl- eet redimensionnez!

Vous utiliserez les touches hjkl normales (et peut-être les touches fléchées).

Vous pouvez «accepter» le redimensionnement ou «l'annuler».

Il existe également un mode de déplacement dans lequel vous permutez les fenêtres et un mode de mise au point dans lequel vous changez la fenêtre dans laquelle vous êtes actif.

D. Ben Knoble
la source