TL; DR
Bash tiene una funcionalidad similar a zsh
'es bindkey
a través bind
, pero no tener varios vi
modos como zsh
. Después de set -o vi
que puedas hacer:
bind '"jk":vi-movement-mode'
que es el equivalente de zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Las vi-movement-mode
funciones provienen de inputrc
(ver /etc/inputrc
una lista de ellas).
Texto completo
Como Stephen Harris señala en su comentario:
.bashrc
es llamado por bash
siempre (y notablemente no por otros shells).
.bash_profile
solo se llama en shells de inicio de sesión (y nuevamente, solo bash).
Varias distribuciones vienen con un .bash_profile
esqueleto que se ve de la siguiente manera:
# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
Que es un buen contenido .bash_profile
ya que simplemente puedes olvidar que existe.
Ahora, para mapear jk a Escla sesión de shell, que no es realmente posible. Cuando tu lo hagas:
inoremap jk <esc>
En Vim, después de escribir j , Vim sabe que debe esperar un poco para ver si escribe a kcontinuación y debe invocar la asignación (o que escriba otra tecla y la asignación no debe activarse). Como anexo, esto se controla :set timeoutlen=<miliseconds>
en Vim (ver :h timeoutlen
).
Varios shell o X11 no tienen ese control de tiempo de espera y no permiten asignaciones de caracteres múltiples. Solo se permite la asignación de una sola clave (pero consulte las notas de soporte a continuación).
set -o vi
No lee .vimrc
, solo imita algunas combinaciones de teclas vi
(ni siquiera vim
) que se pueden usar en el shell. Lo mismo se puede decir sobre-o emacs
, no viene con todo el poder de emacs
.
soporte zsh
zsh
en realidad admite el tiempo de espera del mapa. Y se puede utilizar el siguiente para asignar jk
a <esc>
:
bindkey -v # instead of set -o vi
bindkey -e jk \\e
(Eso tendrá que ir a ~/.zshrc
no ~/.bashrc
)
Sin embargo, desaconsejo esto. Yo uso vim
y la zsh
mayoría de las veces. Tengo inoremap jk <esc>
en mi vimrc
e intenté usar la bindkey
combinación anterior. zsh
espera demasiado tiempo para imprimir j
cuando lo uso, y eso me molestó mucho.
apoyo bash
bash
Soportes readline
bind
. Creo que bash
se puede compilar sin, readilne
por lo tanto, puede haber algunos sistemas raros que tienen bash que no son compatibles bind
(esté atento). Para asignar jk
a <esc>
en la bash
que tiene que hacer:
set -o vi
bind '"jk":"\e"'
(sí, es un doble nivel de cita, es necesario)
Nuevamente, esto hace que escribir sea j
bastante molesto. Pero de alguna manera menos molesto que la zsh
solución en mi máquina (probablemente el tiempo de espera predeterminado es más corto).
Solución alternativa (para shells que no sean bash y no zsh)
La razón para reasignar la Esctecla es que se encuentra bastante lejos en el teclado, y escribirla lleva tiempo. Un truco que se puede pedir prestado a los emacs
chicos es reasignar, CapsLockya que de todos modos es una clave inútil. emacs
chicos lo reasignan Ctrlpero lo haremos de nuevo Esc.
Usemos xev -event keyboard
para verificar el código clave 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
Y para verificar la función 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
Muy bien, CapsLockes el código clave 66 y Escsu función se llama "Escape". Ahora podemos hacer:
# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"
Lo anterior debe hacerse en este orden. Ahora cada vez que golpeas CapsLockfunciona como una Esctecla.
La parte difícil es dónde configurar esto. Un archivo ~/.Xmodmap
con el contenido:
remove lock = Caps_Lock
keycode 66 = Escape
Debería ser respetada por la mayoría de las distribuciones (en realidad, los administradores de pantallas, pero digo distros por simplicidad), pero vi las que no respetan varios ~/X*
archivos. Para tales distribuciones puedes probar algo como:
if [ "x" != "x$DISPLAY" ]; then
xmodmap -e "remove lock = Caps_Lock"
xmodmap -e "keycode 66 = Escape"
fi
En su .bashrc
.
(En teoría, sería mejor ubicarlo, ~/.xinitrc
pero si un administrador de pantallas no respeta .Xmodmap
, definitivamente no lo respetará ~/.xnintrc
).
Nota adicional: Esto sólo se vuelve a asignar CapsLocka Escuna sesión X11, por lo tanto, el mapa sólo se trabajan en emuladores de terminal. Los reales tty
no verán el mapa.
Referencias y lecturas adicionales:
jk
? ¿Es esa una tecla especial en tu teclado?