La librería readline proporciona una interfaz y conjunto de funciones que pueden usar las aplicaciones de linea de comandos que la implementen. Permite a los usuarios interactuar con la linea de comandos de una manera más ágil facilitando borrar palabras enteras, desplazarse palabra a palabra o incluso grabar y ejecutar marcos. Los keymaps que utiliza son los modos de edición de Emacs y vi. Algunos interpretes de comandos que no son Bash, como por ejemplo Zsh, no utilizan readline y por lo tanto lo aquí expuesto no funcionará.
Esta guía se centra en el uso del modo emacs, que es el predeterminado y el que ofrece más posibilidades. Si bien la biblioteca Readline no tiene un conjunto completo de funciones de edición de vi, sí contiene suficiente para permitir la edición simple de la línea de comandos.
Los comandos readline pueden ser asignados a combinaciones de teclas. Estos son los tipos de comandos readline actualmente disponibles.
Documentación: https://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html
Pulsar Ctrl-v en la terminal permite obtener la representación de una o varias teclas posteriormente pulsadas. Esta representación varía de la terminal en uso (konsole, xterm, linux, rxvt,..) y es necesaria conocerla para posteriormente configurar el atajo de teclado mediante el comando (Bash Builtin) bind.
La representación “^[” equivale a la tecla [Esc] o bien a la tecla [Alt]. Por lo tanto [Esc][u] / Alt [u] es el equivalente en formato terminal a “\eu”, que se refiere a “upcase-word” (pone en mayúscula desde el cursor hasta el primer espacio). Pero también muchas combinaciones que utilizan la tecla [Ctrl] usan esa representación.
Si pulsamos Ctrl+v y posteriormente Ctrl+“Cursor derecha”, se obtiene la siguiente salida “^[[1;5C” (puede variar según el emulador de terminal en uso), el cual en formato terminal sería “\e[1;5C”. Ese bindkey es el que permite moverse de palabra en palabra hacia delante pulsando Ctrl+Tecla cursor derecha. Normalmente se encuentra definido en /etc/inputrc de serie.
Visualizar las teclas rápidas disponibles en formato terminal.
bind -p | grep -v '^#\|self-insert\|^$' # Lista los comandos readline disponibles y a qué combinación de teclas está asignado. bind -P
NOTA: Enumerar los comandos activados ejecutando “bind -P”, para un formato más breve y adecuado para un archivo inputrc, bind -p
Conocimientos básicos.
El número de atajos disponibles depende del keymap (vi, emacs, etc), emulador de terminal, interprete de comandos (Bash vs Zsh) y configuración de los ficheros inputrc.
# Probando con las keymaps emacs (predeterminado) y con el emulador de terminal xterm-256color. echo $TERM xterm-256color # Contabilizamos bindkeys disponibles. bind -p | grep -v '^#\|self-insert\|^$' | wc -l 160 # Ahora se prueba con el emulador de terminal "linux" (Típico de las tty) export TERM=linux bash bind -p | grep -v '^#\|self-insert\|^$' | wc -l 162 echo $TERM linux # Terminal en modo Vi. set -o vi bind -p | grep -v '^#\|self-insert\|^$' | wc -l 30
La existencia de un ficheros de usuario .inputrc ($HOME/.inputrc) tiene total preferencia frente al fichero genérico de /etc/inputrc, aunque esté vacío. Por tanto, si se tiene definidas en /etc/inputrc algunas shortcuts que no se encuentran en en $HOME/.inputrc, estas no estarán accesibles.
Conociendo lo anterior, no se recomienda usar un fichero .inputrc de usuario si no se ha copiado previamente el contenido del fichero /etc/inputrc. Si se quieren definir nuevas binkeys se pueden agregar a este mismo fichero o a cualquier bash.baschrc o similar.
Fichero de ejemplo /etc/inputrc.
# do not bell on tab-completion #set bell-style none set meta-flag on set input-meta on set convert-meta off set output-meta on # Auto-completion case-insensitive set completion-ignore-case On $if mode=emacs # for linux console and RH/Debian xterm "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[7~": beginning-of-line "\e[3~": delete-char "\e[2~": quoted-insert "\e[5C": forward-word "\e[5D": backward-word "\e\e[C": forward-word "\e\e[D": backward-word "\e[1;5C": forward-word "\e[1;5D": backward-word # for rxvt "\e[8~": end-of-line # for non RH/Debian xterm, can't hurt for RH/DEbian xterm "\eOH": beginning-of-line "\eOF": end-of-line # for freebsd console "\e[H": beginning-of-line "\e[F": end-of-line $endif
Ejecutar un comando con un bindkey / tecla rápida .
# Ctrl+cursor arriba: Muestra en pantalla el resultado del comando who. (Sin mostrar el comando, en este caso "who"). Se debe usar la opción "-x". bind -x '"\e[1;5A":"who"' # Ctrl+cursor arriba: Muestra en pantalla el resultado del comando who. (Muestra el comando y lo ejecuta). bind '"\e[1;5A":"who\n"' # Ctrl+cursor arriba: Muestra en pantalla el resultado del comando who. (Muestra el comando pero NO lo ejecuta). bind '"\e[1;5A":"who"' NOTA: Puede utilizarse un comando, script o función.
Típicas teclas rápidas / binkeys del modo emacs.
Establecer el modo emacs (predeterminado).
set -o emacs
Control de flujo de datos de comandos ejecutados en la shell.
Ctrl+r Busca según se escribe un comando en el historial. # Hstr: https://github.com/dvorka/hstr (recomendado). # https://es.wikipedia.org/wiki/Protocolo_XON/XOFF Ctrl+s Envía señal para que se dejen de enviar datos por la salida. Ctrl+q Restaura de nuevo el flujo de datos de salida.
Teclas útiles del modo emacs (predeterminado) para las terminales.
Documentación: https://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html
Ctrl+] Busca una letra hacia la derecha. Ctrl+Alt+] Busca una letra hacia la izquierda. Ctrl+x + Ctrl+e Abre el editor por defecto (Variable $EDITOR). Ctrl+_ Deshace lo último escrito en consola (Deshacer / undo). Ctrl+k / Ctrl+u Corta todo lo que se encuentre a la derecha / izquierda del cursor. Ctrl+w / Alt+d Corta por palabra hacia la izquierda / derecha. Ctrl+y Pega lo cortado. Ctrl+a / Ctrl+e Ir al principio o final del comando. Alt+b / Alt+f Se desplaza una palabra a la izquierda / derecha. Cntrl + Cursor izda o dcha Se desplaza una palabra a la izquierda / derecha. Ctrl+xx El cursor se mueve al principio / vuelve a la posición previa. Ctrl+l Limpia la terminal. Ctrl+t Invierte la posición de la letra bajo el cursor y su predecesora, útil para correcciones. Ejemplo posicionando el cursor sobre "ó" (Oftalmlóogo). Alt+u A partir del cursor pone todo en mayúsculas. Alt+l A partir del cursor pone todo en minúsculas. Alt+# Comenta la linea con # y pasa a la siguiente. Muy útil para hacer videotutoriales de consola donde se quiere introducir algún comentario en la shell. # Macros: Permite guardar pilas de comandos para ejecutarlas posteriormente con "Ctrl+x e" Ctrl-x ( Empieza a guardar el macro. Se deben ejecutar los comandos que se quieran. Ctrl-x ) Finaliza y guarda el macro. Ctrl-x e Ejecuta el macro más reciente.
Colocar el cursor cerca de cualquiera de las esquina de una ventana, o bien el marco de arriba o abajo y pulsar Alt + Botón derecho, permite redimensionar aplicaciones. De esta forma nos ahorramos el tener que hacer click exactamente sobre el marco de la ventana para redimensionarla.