J'aime vraiment la vitesse générale de zsh, mais deux choses me dérangent énormément.
- Je dois frapper un moment entre frapper échapper et frapper barre oblique pour accéder à la recherche d'historique (si elle frappe trop rapidement, elle dit
zsh: do you wish to see all 514 possibilities (172 lines)
) - Après être entré en mode insertion en raison de la frappe de
a
ouA
, je ne peux pas revenir en arrière au-delà du point où je suis entré en mode insertion.
Je sais que 2 est comme le vi classique, mais j'aime mieux le style vim.
command-line
zsh
Chas. Owens
la source
la source
i
deux fois pour revenir en mode insertion, je recommanderais fortement cette correction!Réponses:
(1). Pour une raison quelconque, bindkey se comporte bizarrement quand il s'agit de "/":
<esc>
suivi rapidement de/
est interprété comme<esc-/>
. (J'ai observé ce comportement l'autre jour; je ne sais pas exactement ce qui en est la cause.) Je ne sais pas s'il s'agit d'un bogue ou d'une fonctionnalité, et si c'est une fonctionnalité si elle peut être désactivée, mais vous pouvez la contourner assez facilement .Ce combo de touches est probablement lié à
_history-complete-older
, ce qui génère le résultat indésirable - vous pouvez utiliserbindkey -L
pour voir si c'est le cas.Quoi qu'il en soit, si cela ne vous dérange pas de sacrifier la liaison réelle
<esc-/>
(pressée ensemble, comme un accord), vous pouvez la relier à la commande de recherche d'historique vi-mode, de sorte que la frappe<esc>
suivie de/
fait la même chose à n'importe quelle frappe la vitesse. =)Comme cela sera traité comme un accord, cela n'aura pas pour effet de passer d'abord en mode de commande vi, nous devons donc nous assurer que cela se produit en premier. Tout d'abord, vous devez définir une fonction; mettez-le quelque part dans votre
fpath
si vous l'utilisez, ou mettez-le dans votre .zshrc sinon:Le reste va dans votre .zshrc de toute façon:
Ça devrait être bon d'y aller.
(2). Vous pouvez corriger la touche de retour arrière comme suit:
De plus, si vous souhaitez un comportement similaire pour d'autres commandes de style vi:
la source
^[/
pas le cas\e/
, mais ce sont deux façons valables de dire évasion. Le changement fonctionne parfaitement. Maintenant que je joue avec lui plus complètement, il semble que le mode vi de zsh soit nul par rapport à bash (ou du moins n'est pas entièrement configuré par défaut). Un exemple de ceci est le fait qu'il vous place en mode insertion après l'historique de recherche. Je dois revenir en mode commande pour appuyer sur n pour trouver l'élément de recherche suivant..vi-history-search-backward
. Je vais l'écrire et modifier ma réponse - revenez plus tard dans la journée.bindkey | grep <searchterm>
pour l'un des termes, ils sont tous préfixés parvi-
. Dois-je configurer desbindkey
commandes sans préfixevi-
?Je vais seulement répondre à la question (1).
Votre problème est KEYTIMEOUT. Je cite zshzle (1):
Ce 0,4 s est le délai que vous rencontrez après avoir appuyé sur ESC. Le correctif consiste à définir KEYTIMEOUT jusqu'à 0,01 s dans l'un des fichiers de démarrage du shell:
Malheureusement, cela a un effet d'entraînement: d'autres choses commencent à mal se passer…
Premièrement, il y a maintenant un problème en mode de commande vi: Taper ESC fait bloquer le curseur, puis le caractère que vous tapez ensuite est avalé. C'est parce que ESC n'est lié à rien par défaut en mode de commande vi, mais il existe des widgets à plusieurs caractères qui commencent par ESC (touches de curseur!). Ainsi, lorsque vous appuyez sur ÉCHAP, ZLE attend le personnage suivant… puis le consomme.
Le correctif consiste à lier ESC à quelque chose en mode commande, garantissant ainsi que le quelque chose est passé à ZLE après $ KEYTIMEOUT centisecondes. Nous pouvons maintenant conserver les liaisons commençant par ESC en mode commande sans ces effets néfastes. Je lie ESC au personnage de la cloche, que je trouve encore moins intrusif que l'auto-insertion (et ma coque est réduite au silence):
Problème suivant: Il existe par défaut des widgets à deux touches commençant par ^ X en mode d'insertion vi; ceux-ci deviennent inutilisables si $ KEYTIMEOUT est défini à fond. Ce que je fais, c'est délier ^ X en mode d'insertion vi (c'est auto-inséré par défaut); cela permet à ces widgets à deux touches de continuer à fonctionner.
Vous perdez la liaison pour l'auto-insertion, mais vous pouvez bien sûr la lier à autre chose. (Je ne le fais pas, car je n'en ai aucune utilité.)
Le dernier problème (que j'ai trouvé jusqu'à présent): il reste quelques raccourcis clavier par défaut que nous "perdons" en raison de la définition de $ KEYTIMEOUT vers le bas, à savoir: ceux commençant par ESC en mode d'insertion vi qui ne sont pas des touches de curseur. Je les lie personnellement pour commencer par ^ X à la place:
la source