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 .bashrcarchivo 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?.bashrcgeneralmente se invoca en cada shell (por ejemplo, si se desvanecevi) pero.bash_profilesolo se invoca en shells de inicio de sesión. Entonces.bashrces el lugar adecuado paraset -o vi. No tengo una respuesta para su segunda pregunta revisada :-(set -o vientra.bashrc, vea ¿Por qué no funciona mi ~ / .bash_profile?Respuestas:
TL; DR
Bash tiene una funcionalidad similar a
zsh'esbindkeya travésbind, pero no tener variosvimodos comozsh. Después deset -o vique puedas hacer:que es el equivalente de
zsh'sbindkey -M <all vi modes> jk vi-movement-modeLas
vi-movement-modefunciones provienen deinputrc(ver/etc/inputrcuna lista de ellas).Texto completo
Como Stephen Harris señala en su comentario:
.bashrces llamado porbashsiempre (y notablemente no por otros shells)..bash_profilesolo se llama en shells de inicio de sesión (y nuevamente, solo bash).Varias distribuciones vienen con un
.bash_profileesqueleto que se ve de la siguiente manera:Que es un buen contenido
.bash_profileya 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
zshen realidad admite el tiempo de espera del mapa. Y se puede utilizar el siguiente para asignarjka<esc>:(Eso tendrá que ir a
~/.zshrcno~/.bashrc)Sin embargo, desaconsejo esto. Yo uso
vimy lazshmayoría de las veces. Tengoinoremap jk <esc>en mivimrce intenté usar labindkeycombinación anterior.zshespera demasiado tiempo para imprimirjcuando lo uso, y eso me molestó mucho.apoyo bash
bashSoportesreadlinebind. Creo quebashse puede compilar sin,readilnepor lo tanto, puede haber algunos sistemas raros que tienen bash que no son compatiblesbind(esté atento). Para asignarjka<esc>en labashque tiene que hacer:(sí, es un doble nivel de cita, es necesario)
Nuevamente, esto hace que escribir sea
jbastante molesto. Pero de alguna manera menos molesto que lazshsolució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
emacschicos es reasignar, CapsLockya que de todos modos es una clave inútil.emacschicos lo reasignan Ctrlpero lo haremos de nuevo Esc.Usemos
xev -event keyboardpara 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
~/.Xmodmapcon 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,
~/.xinitrcpero 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
ttyno verán el mapa.Referencias y lecturas adicionales:
.bashrcvs..bash_profilefuente
jklugar 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.zshy nobash, ¿ no es posible en bash?man bashencontrébindque el trabajo es bastante similar al dezsh'sbindkey. Actualizaré la respuesta. Ahí tienes, estoy usandozshdemasiado.Gracias, por respuestas anteriores, uso esto en mi ~ / .zshrc para accesos directos similares a vi en mi terminal. Espero que ayude a alguien.
fuente