
Sería muy útil tener una forma fácil de usar para obtener una descripción general de los atajos de teclado definidos actualmente. En otras palabras, dadas las /etc/inputrc
líneas
"\e[A": history-search-backward
"\e[11~": backward-word
y ~/.inputrc
lineas
"\e[A": kill-word
"\e\eOD": backward-word
No debería ser necesario revisar ambos archivos para descubrir que \e[A
se ha anulado, que hay dos atajos alternativos para backward-word
, eso \e\eOD
significa... lo que sea que signifique, y eso kill-word
en realidad significa eliminar hasta el final del archivo actual (o siguiente) palabra. La solución ideal imprimiría algo como
Delete until next word boundary: Meta-A
Go to the previous word boundary: F1; Ctrl-Left
Search history backwards: Meta-Up
(Esperemos que alguien con una mejor comprensión de las secuencias de escape pueda solucionar los atajos).
¿Existe algún programa de Linux para imprimir esto?
Supongo que un programa de este tipo podría depender del sistema operativo, del kernel o incluso del teclado, por lo que tal vez necesitaría una configuración extensa (un programa que sondee al usuario showkey
o xev
presione varias teclas para establecer qué secuencias de escape se envían realmente, por ejemplo ), pero sería un precio aceptable para comprender finalmente cómo utilizar los atajos de terminal de manera eficiente.
Respuesta1
La respuesta corta es no, estoy bastante seguro de que no existe tal programa.
En principio, podrías construir uno; Tendría que mirar la configuración de readline y el emulador de terminal (el kernel y el hardware no están involucrados).
bind -P | grep 'can be found'
en Bash enumera las combinaciones de teclas.
abort can be found on "\C-g", "\C-x\C-g", "\e\C-g".
accept-line can be found on "\C-j", "\C-m".
Para tener un nombre más descriptivo para el comando, necesitará analizar la documentación de bash o readline.
La correspondencia entre secuencias de teclas y claves la determina el terminal (normalmente, el emulador de terminal). A menudo no está disponible fácilmente y, cuando lo está, el método para obtenerlo es totalmente específico del terminal.
Puede acercarse en Emacs: comience emacs -q -nw
en una terminal y presione Ctrl+ (el comando) H, luego la secuencia de teclas ( es ). Esto le muestra la tecla de función reconstruida, si la hay, y qué hace la tecla en Emacs. Los enlaces predeterminados de Readline están fuertemente inspirados en Emacs, por lo que a menudo la función en Emacs es similar a la función en readline, pero no siempre. Ejemplo:Cdescribe-key-briefly
\e
Escape
Ctrl+H C ESC [ A
<up> runs the command previous-line
Respuesta2
Tuve el mismo problema al no poder digerir las distintas páginas de resultados del bind
comando integrado de Bash, especialmente cuando se me dio la -p
opción.
Por lo tanto, se me ocurrieron las siguientes dos funciones que definí en mi .bashrc
archivo:
alias def=function
alias val="declare -r"
alias var=declare
alias final="readonly -f"
def keyfunctions {
if (( "$#" )); then
var a
OPTIND=1
getopts ":auI:E:" a
else
var a=E
OPTIND=1
OPTARG='self-insert$|digit-argument$|do-lowercase-version$'
fi
case "$a" in
a)
bind -p |\
sort |\
pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
;;
I)
bind -p |\
grep -E "$OPTARG" |\
sort |\
pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
;;
E)
bind -p |\
grep -Ev '(^$)|^#|'"$OPTARG" |\
sort |\
pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
;;
u|*)
echo >&2 "$FUNCNAME: Usage: $FUNCNAME [-a|-i <eregex>|-e <eregex>]"
echo >&2 "$FUNCNAME: Invoking $FUNCNAME without arguments assumes -E'self-insert$|digit-argument$|do-lowercase-version$'."
val -i b="$((OPTIND-1))"
if [[ "$OPTARG" == : ]]; then
echo >&2 "$FUNCNAME: Error: Invalid argument \"$OPTARG\" at position $b."
elif [[ "$OPTARG" == ? ]]; then
echo >&2 "$FUNCNAME: Error: Invalid option \"$OPTARG\" at position $b."
fi
;;
esac
}
final keyfunctions
def keymacros {
bind -s |\
sort |\
pr -l1 -W"$COLUMNS" -"$(($COLUMNS/40))"
}
final keyfunctions
Simplemente ejecute las dos definiciones anteriores y decida si le gusta la salida ordenada ( sort
) y tabulada ( pr -t
). El width
número de columnas es fijo, el número de columnas se relaciona con la proporción de $(($COLUMNS/$width))
.