TL; DR
Bash a une fonctionnalité similaire à celle de zsh
's bindkey
through' bind
, mais il n'a pas plusieurs vi
modes comme zsh
. Après set -o vi
vous pouvez faire:
bind '"jk":vi-movement-mode'
qui est l'équivalent de zsh
« sbindkey -M <all vi modes> jk vi-movement-mode
Les vi-movement-mode
fonctions viennent de inputrc
(voir /etc/inputrc
pour une liste d'entre elles).
Texte intégral
Comme le souligne Stephen Harris dans son commentaire:
.bashrc
est appelé par bash
toujours (et notamment pas par d'autres coques).
.bash_profile
est uniquement appelé sur les shells de connexion (et encore, bash uniquement).
Plusieurs distributions sont livrées avec un .bash_profile
squelette qui se présente comme suit:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
C'est un bon contenu .bash_profile
car vous pouvez simplement oublier qu'il existe.
Maintenant, à la carte jkà Escla session shell, qui est pas vraiment possible. Quand vous faites:
inoremap jk <esc>
Dans Vim, après avoir jtapé, Vim sait qu'il doit attendre un peu pour voir si vous tapez kensuite et il doit invoquer le mappage (ou que vous tapez une autre clé et le mappage ne doit pas être déclenché). En tant qu'addendum, cela est contrôlé par :set timeoutlen=<miliseconds>
dans Vim (voir :h timeoutlen
).
Plusieurs shell ou X11 n'ont pas un tel contrôle de timeout et ne permettent pas de mappages de caractères multiples. Seul un mappage d'une seule clé est autorisé (mais voir les notes de support ci-dessous.).
set -o vi
Ne lit pas .vimrc
, il imite seulement certaines combinaisons de touches vi
(pas même vim
) qui peuvent être utilisées dans le shell. La même chose peut être dite -o emacs
, elle ne vient pas avec toute la puissance de emacs
.
support zsh
zsh
prend en charge le délai d'expiration de la carte. Et vous pouvez utiliser les éléments suivants pour mapper jk
sur <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Cela devra aller ~/.zshrc
non ~/.bashrc
)
Pourtant, je déconseille cela. J'utilise vim
et la zsh
plupart du temps. J'ai inoremap jk <esc>
dans mon vimrc
et j'ai essayé d'utiliser la bindkey
combinaison ci-dessus. zsh
attend trop longtemps pour imprimer j
lors de son utilisation, ce qui m'a énervé beaucoup.
support bash
bash
prend en charge readline
bind
. Je crois que cela bash
peut être compilé sans readilne
donc il peut y avoir quelques systèmes rares qui ont bash qui ne supportent pas bind
(soyez vigilant). Pour la carte jk
à <esc>
en que bash
vous devez faire:
set -o vi
bind '"jk":"\e"'
(oui c'est un double niveau de citation, c'est nécessaire)
Encore une fois, cela rend la frappe j
assez ennuyeuse. Mais en quelque sorte moins ennuyeux que la zsh
solution sur ma machine (le délai par défaut est probablement plus court).
Solution (pour les shells non bash et non zsh)
La raison du remappage de la Esctouche est qu'elle se trouve assez loin sur le clavier et que la saisie prend du temps. Une astuce qui peut être empruntée aux emacs
gars est de remapper CapsLockcar c'est une clé inutile de toute façon. emacs
les gars le remappent Ctrlmais nous le remapperons Esc.
Utilisons xev -event keyboard
pour vérifier le code clé de CapsLock:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Et pour vérifier la fonction de Esc:
KeyPress event, serial 25, synthetic NO, window 0x1c00001,
root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "
XmbLookupString gives 1 bytes: (1b) "
XFilterEvent returns: False
Très bien, CapsLockc'est le keycode 66 et sa Escfonction s'appelle "Escape". Maintenant, nous pouvons faire:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Ce qui précède doit être fait dans cet ordre. Maintenant, chaque fois que vous appuyez, CapsLockcela fonctionne comme une Escclé.
La partie délicate est de savoir où régler cela. Un fichier ~/.Xmodmap
avec le contenu:
remove lock = Caps_Lock
keycode 66 = Escape
Devrait être respecté par la plupart des distributions (en fait les gestionnaires d'affichage, mais je dis les distributions pour plus de simplicité), mais j'ai vu celles qui ne respectent pas plusieurs ~/X*
fichiers. Pour de telles distributions, vous pouvez essayer quelque chose comme:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
Dans votre .bashrc
.
(En théorie, ce serait mieux placé, ~/.xinitrc
mais si un gestionnaire d'affichage ne respecte pas, .Xmodmap
il ne respectera certainement pas ~/.xnintrc
.)
Note supplémentaire: Ce ne remappe CapsLockà Escune séance X11, par conséquent , la carte ne fonctionnera que dans émulateurs. Les réels tty
ne verront pas la carte.
Références et lectures supplémentaires:
jk
? Est-ce une touche spéciale sur votre clavier?