¿Cómo imprimir atajos de teclado en formato legible por humanos?

¿Cómo imprimir atajos de teclado en formato legible por humanos?

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/inputrclíneas

"\e[A": history-search-backward
"\e[11~": backward-word

y ~/.inputrclineas

"\e[A": kill-word
"\e\eOD": backward-word

No debería ser necesario revisar ambos archivos para descubrir que \e[Ase ha anulado, que hay dos atajos alternativos para backward-word, eso \e\eODsignifica... lo que sea que signifique, y eso kill-worden 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 showkeyo xevpresione 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 -nwen 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\eEscape

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 bindcomando integrado de Bash, especialmente cuando se me dio la -popción.

Por lo tanto, se me ocurrieron las siguientes dos funciones que definí en mi .bashrcarchivo:

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 widthnúmero de columnas es fijo, el número de columnas se relaciona con la proporción de $(($COLUMNS/$width)).

información relacionada