TL; DR
O Bash tem uma funcionalidade semelhante à zsh
do bindkey
meio bind
, mas não possui vários vi
modos como zsh
. Depois que set -o vi
você pode fazer:
bind '"jk":vi-movement-mode'
que é o equivalente zsh
abindkey -M <all vi modes> jk vi-movement-mode
As vi-movement-mode
funções são originárias inputrc
(veja /etc/inputrc
uma lista delas).
Texto completo
Como Stephen Harris aponta em seu comentário:
.bashrc
é chamado por bash
sempre (e principalmente não por outras conchas).
.bash_profile
é chamado apenas em shells de login (e novamente, somente no bash).
Várias distros vêm com um .bash_profile
esqueleto com a seguinte aparência:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Qual é um bom conteúdo, .bash_profile
pois você pode simplesmente esquecer que ele existe.
Agora, para mapear jka Escna sessão shell, que não é realmente possível. Quando você faz:
inoremap jk <esc>
No Vim, depois que você digita j, o Vim sabe que precisa esperar um pouco para ver se você digita a kseguir e deve chamar o mapeamento (ou que você digita outra chave e o mapeamento não deve ser acionado). Como um adendo, isso é controlado pelo :set timeoutlen=<miliseconds>
Vim (consulte :h timeoutlen
).
Vários shell ou X11 não têm esse controle de tempo limite e não permitem mapeamentos de caracteres múltiplos. Somente o mapeamento de uma única chave é permitido (mas consulte as notas de suporte abaixo.).
set -o vi
Não lê .vimrc
, apenas imita algumas combinações de teclas vi
(nem mesmo vim
) que podem ser usadas no shell. O mesmo pode ser dito sobre -o emacs
, ele não vem com todo o poder de emacs
.
suporte zsh
zsh
realmente suporta o tempo limite do mapa. E você pode usar o seguinte para mapear jk
para <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Isso precisará ir para ~/.zshrc
não ~/.bashrc
)
No entanto, eu aconselho contra isso. Eu uso vim
e na zsh
maioria das vezes. Eu tenho inoremap jk <esc>
no meu vimrc
e eu tentei usar a bindkey
combinação acima. zsh
aguarda muito tempo para imprimir j
ao usá-lo, e isso me incomodou muito.
suporte do bash
bash
suporta readline
bind
. Acredito que bash
possa ser compilado sem, readilne
portanto, pode haver alguns sistemas raros que possuem o bash que não suportam bind
(fique atento). Para mapear jk
a <esc>
em bash
que você precisa fazer:
set -o vi
bind '"jk":"\e"'
(sim, é necessário um duplo nível de citação)
Novamente, isso torna a digitação j
bastante irritante. Mas de alguma forma menos irritante do que a zsh
solução na minha máquina (provavelmente o tempo limite padrão é mais curto).
Solução alternativa (para shells não bash e não zsh)
O motivo para remapear a Esctecla é que ela fica bem distante do teclado, e digitar leva tempo. Um truque que pode ser emprestado dos emacs
caras é remapear, CapsLockjá que é uma chave inútil. emacs
caras remapear para Ctrlmas vamos remapear para Esc.
Vamos usar xev -event keyboard
para verificar o código-chave 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
E para verificar a função 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
Muito bom, CapsLocké o keycode 66 e Esca função é chamada "Escape". Agora podemos fazer:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
O acima deve ser feito nesta ordem. Agora, toda vez que você pressiona CapsLock, funciona como uma Escchave.
A parte complicada é onde definir isso. Um arquivo ~/.Xmodmap
com o conteúdo:
remove lock = Caps_Lock
keycode 66 = Escape
Deve ser respeitado pela maioria das distros (na verdade, gerenciadores de exibição, mas estou dizendo distros por simplicidade), mas vi aqueles que não respeitam vários ~/X*
arquivos. Para tais distros, você pode tentar algo como:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
No seu .bashrc
.
(Em teoria, isso seria melhor colocado, ~/.xinitrc
mas se um gerente de exibição não o respeitar .Xmodmap
, definitivamente não o respeitará ~/.xnintrc
.)
Nota extra: Isso só remapeia CapsLocka Escem uma sessão X11, portanto, o mapa só irá funcionar em emuladores de terminal. O real tty
não verá o mapa.
Referências e leitura extra:
jk
? Essa tecla é especial no seu teclado?