Saltar al contenido

En el modo bash vi, mapea jk para salir del modo de inserción

Te doy la bienvenida a nuestra página, en este sitio vas a encontrar la resolución que buscas.

Solución:

TL; DR

Bash tiene una funcionalidad similar a zsh‘s bindkey mediante bind, pero no tiene varios vi modos como zsh. Después set -o vi tu puedes hacer:

bind '"jk":vi-movement-mode'

que es el equivalente de zsh‘s bindkey -M jk vi-movement-mode

los vi-movement-mode las funciones provienen de inputrc (ver /etc/inputrc para obtener una lista de ellos).

Texto completo

Como señala Stephen Harris en su comentario:

  • .bashrc es llamado por bash siempre (y notablemente no por otras conchas).

  • .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 tiene el siguiente aspecto:

# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc

Que es un buen contenido para .bash_profile ya que simplemente puedes olvidar que existe.

Ahora, para mapear jk para Esc en la sesión de shell, eso no es realmente posible. Cuando tu lo hagas:

inoremap jk 

En Vim, después de escribir j, Vim sabe que debe esperar un poco para ver si escribe k siguiente y debería invocar el mapeo (o que escriba otro key y el mapeo no debe activarse). Como apéndice, esto está controlado por :set timeoutlen= en Vim (ver :h timeoutlen).

Varios shell o X11 no tienen tal control de tiempo de espera y no permiten múltiples asignaciones de caracteres. Solo un mapeo de un solo key está permitido (pero consulte las notas de soporte a continuación).

set -o vi

No lee .vimrc, solo imita algunos vi (ni siquiera vim) key combinaciones que se pueden utilizar en el caparazón. Lo mismo puede decirse de -o emacs, no viene con todo el poder de emacs.


soporte zsh

zsh en realidad admite el tiempo de espera del mapa. Y puede usar lo siguiente para mapear jk para :

bindkey -v  # instead of set -o vi
bindkey -e jk \e

(Eso tendrá que ir a ~/.zshrc no ~/.bashrc)

Sin embargo, desaconsejo esto. yo suelo vim y zsh la mayor parte del tiempo. yo tengo inoremap jk en mi vimrc e intenté usar el bindkey combinación anterior. zsh espera demasiado para imprimir j al usarlo, y eso me molestó mucho.


apoyo bash

bash apoyos readlinebind. Creo que bash se puede compilar sin readilne por lo tanto, puede haber algunos sistemas raros que tengan bash que no admitan bind (esté atento). Para asignar jk para en bash necesitas hacer:

set -o vi
bind '"jk":"e"'

(sí, eso es un doble nivel de cotización, es necesario)

De nuevo, esto hace que escribir j bastante molesto. Pero de alguna manera menos molesto que el zsh solución en mi máquina (probablemente el tiempo de espera predeterminado es más corto).


Solución alternativa (para shells que no son bash ni zsh)

La razón para reasignar el Esc key es que se encuentra bastante lejos en el teclado, y escribirlo lleva tiempo. Un truco que se puede tomar prestado del emacs chicos es reasignar Bloq Mayús ya que es un inutil key de todas formas. emacs chicos lo reasignan a control pero lo reasignaremos a Esc.

Usemos xev -event keyboard para comprobar el código clave de Bloq Mayús:

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 comprobar 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, Bloq Mayús es el código clave 66 y EscLa función de 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 Bloq Mayús funciona como un Esc key.


La parte complicada es dónde configurar esto. Un archivo ~/.Xmodmap con el contenido:

remove lock = Caps_Lock
keycode 66 = Escape

Debería ser respetado por la mayoría de las distribuciones (en realidad, los administradores de pantalla, pero digo distribuciones por simplicidad), pero vi algunas que no respetan varias ~/X* archivos. Para tales distribuciones, puede probar algo como:

if [ "x" != "x$DISPLAY" ]; then
    xmodmap -e "remove lock = Caps_Lock"
    xmodmap -e "keycode 66 = Escape"
fi

En tus .bashrc.

(En teoría, estaría mejor situado en ~/.xinitrc pero si un administrador de pantallas no respeta .Xmodmap definitivamente no respetará ~/.xnintrc.)

Nota adicional: esto solo reasigna Bloq Mayús para Esc en una sesión X11, por lo tanto, el mapa solo funcionará en emuladores de terminal. Real ttyno verá el mapa.

Referencias y lecturas adicionales:

  • Deshabilitar el bloqueo de mayúsculas
  • Respuesta muy detallada sobre cómo key reasignación en X11 funciona
  • .bashrc vs. .bash_profile

Gracias, por las respuestas anteriores, utilizo esto en mi ~ / .zshrc para accesos directos tipo vi en mi terminal. Espero que ayude a alguien.

bindkey -v
bindkey 'jk' vi-cmd-mode

Comentarios y valoraciones

Si sostienes alguna suspicacia o disposición de arreglar nuestro post eres capaz de escribir una apostilla y con deseo lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *