J'utilise une nouvelle installation d'ubuntu 16.04, avec le shell bash. Il y a deux choses que je veux faire:
- Configurer le mode vi pour que je puisse avoir des mouvements de type vim depuis le terminal
- quitter le mode d'insertion en tapant
jk
J'ai lu dans un autre article comment cela peut être fait zsh
, comment puis-je le faire bash
?
tl; dr
mettre bind '"jk":vi-movement-mode'
dans votre .bashrc
dossier après set -o vi
:)
server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'
veuillez voir la réponse de @ grochmal pour une explication plus détaillée
bash
keyboard-shortcuts
vi
mbigras
la source
la source
jk
? Est-ce une touche spéciale sur votre clavier?.bashrc
est généralement appelé sur chaque shell (par exemple si vous sortez de shellvi
) mais.bash_profile
n'est appelé que sur les shells de connexion. C'est donc.bashrc
le bon endroit pourset -o vi
. Je n'ai pas de réponse pour votre deuxième question révisée :-(set -o vi
entre.bashrc
, voir Pourquoi mon ~ / .bash_profile ne fonctionne pas?Réponses:
TL; DR
Bash a une fonctionnalité similaire à celle de
zsh
'sbindkey
through'bind
, mais il n'a pas plusieursvi
modes commezsh
. Aprèsset -o vi
vous pouvez faire:qui est l'équivalent de
zsh
« sbindkey -M <all vi modes> jk vi-movement-mode
Les
vi-movement-mode
fonctions viennent deinputrc
(voir/etc/inputrc
pour une liste d'entre elles).Texte intégral
Comme le souligne Stephen Harris dans son commentaire:
.bashrc
est appelé parbash
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: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:
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.).
Ne lit pas
.vimrc
, il imite seulement certaines combinaisons de touchesvi
(pas mêmevim
) 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 deemacs
.support zsh
zsh
prend en charge le délai d'expiration de la carte. Et vous pouvez utiliser les éléments suivants pour mapperjk
sur<esc>
:(Cela devra aller
~/.zshrc
non~/.bashrc
)Pourtant, je déconseille cela. J'utilise
vim
et lazsh
plupart du temps. J'aiinoremap jk <esc>
dans monvimrc
et j'ai essayé d'utiliser labindkey
combinaison ci-dessus.zsh
attend trop longtemps pour imprimerj
lors de son utilisation, ce qui m'a énervé beaucoup.support bash
bash
prend en chargereadline
bind
. Je crois que celabash
peut être compilé sansreadilne
donc il peut y avoir quelques systèmes rares qui ont bash qui ne supportent pasbind
(soyez vigilant). Pour la cartejk
à<esc>
en quebash
vous devez faire:(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 lazsh
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:Et pour vérifier la fonction de Esc:
Très bien, CapsLockc'est le keycode 66 et sa Escfonction s'appelle "Escape". Maintenant, nous pouvons faire:
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: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: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:
.bashrc
contre..bash_profile
la source
jk
au lieu deCapsLock
? Je l'ai installé sur ma machine osx; cependant, je ne l'ai pas pour le reste du week-end et je ne me souviens pas comment je l'ai fait :)zsh
:bindkey -v; bindkey -s jk \\e
. Mais c'est quelque chose qui va revenir et vous mordre quand vous avez besoinjk
, car la minuterie n'est pas configurable et vous n'avez pas<leader>
danszsh
.zsh
et nonbash
, n'est-ce pas possible en bash?man bash
j'ai trouvébind
ce travail assez similaire à celuizsh
debindkey
. Je mettrai à jour la réponse. Voilà, j'en utilisezsh
trop.Merci, pour les réponses précédentes, je l'utilise dans mes ~ / .zshrc pour les raccourcis de type vi dans mon terminal. J'espère que ça va aider quelqu'un.
la source