Estoy usando una nueva instalación de ubuntu 16.04, con el shell bash. Hay dos cosas que quiero hacer:
- Configure el modo vi para que pueda tener movimientos similares a vim desde la terminal
- salir del modo de inserción escribiendo
jk
Leí en otra publicación cómo se puede hacer esto zsh
, ¿cómo puedo hacerlo bash
?
tl; dr
poner bind '"jk":vi-movement-mode'
en su .bashrc
archivo después set -o vi
:)
server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'
Consulte la respuesta de @ grochmal para obtener una explicación más detallada.
bash
keyboard-shortcuts
vi
mbigras
fuente
fuente
jk
? ¿Es esa una tecla especial en tu teclado?.bashrc
generalmente se invoca en cada shell (por ejemplo, si se desvanecevi
) pero.bash_profile
solo se invoca en shells de inicio de sesión. Entonces.bashrc
es el lugar adecuado paraset -o vi
. No tengo una respuesta para su segunda pregunta revisada :-(set -o vi
entra.bashrc
, vea ¿Por qué no funciona mi ~ / .bash_profile?Respuestas:
TL; DR
Bash tiene una funcionalidad similar a
zsh
'esbindkey
a travésbind
, pero no tener variosvi
modos comozsh
. Después deset -o vi
que puedas hacer:que es el equivalente de
zsh
'sbindkey -M <all vi modes> jk vi-movement-mode
Las
vi-movement-mode
funciones provienen deinputrc
(ver/etc/inputrc
una lista de ellas).Texto completo
Como Stephen Harris señala en su comentario:
.bashrc
es llamado porbash
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: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:
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).
No lee
.vimrc
, solo imita algunas combinaciones de teclasvi
(ni siquieravim
) que se pueden usar en el shell. Lo mismo se puede decir sobre-o emacs
, no viene con todo el poder deemacs
.soporte zsh
zsh
en realidad admite el tiempo de espera del mapa. Y se puede utilizar el siguiente para asignarjk
a<esc>
:(Eso tendrá que ir a
~/.zshrc
no~/.bashrc
)Sin embargo, desaconsejo esto. Yo uso
vim
y lazsh
mayoría de las veces. Tengoinoremap jk <esc>
en mivimrc
e intenté usar labindkey
combinación anterior.zsh
espera demasiado tiempo para imprimirj
cuando lo uso, y eso me molestó mucho.apoyo bash
bash
Soportesreadline
bind
. Creo quebash
se puede compilar sin,readilne
por lo tanto, puede haber algunos sistemas raros que tienen bash que no son compatiblesbind
(esté atento). Para asignarjk
a<esc>
en labash
que tiene que hacer:(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 lazsh
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:Y para verificar la función de Esc:
Muy bien, CapsLockes el código clave 66 y Escsu función se llama "Escape". Ahora podemos hacer:
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: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: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:
.bashrc
vs..bash_profile
fuente
jk
lugar deCapsLock
? Lo tengo configurado en mi máquina osx; sin embargo, no lo tengo para el resto del fin de semana y no puedo recordar cómo lo hice :)zsh
:bindkey -v; bindkey -s jk \\e
. Pero eso es algo que va a volver y reprimir cuando se necesitajk
, debido a que el temporizador no es configurable y que no tienen<leader>
enzsh
.zsh
y nobash
, ¿ no es posible en bash?man bash
encontrébind
que el trabajo es bastante similar al dezsh
'sbindkey
. Actualizaré la respuesta. Ahí tienes, estoy usandozsh
demasiado.Gracias, por respuestas anteriores, uso esto en mi ~ / .zshrc para accesos directos similares a vi en mi terminal. Espero que ayude a alguien.
fuente