Wie drucke ich Tastaturkürzel in menschenlesbarer Form aus?

Wie drucke ich Tastaturkürzel in menschenlesbarer Form aus?

Es wäre sehr nützlich, eine benutzerfreundliche Möglichkeit zu haben, einen Überblick über die aktuell definierten Tastaturkürzel zu erhalten. Mit anderen Worten, angesichts der /etc/inputrcZeilen

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

und ~/.inputrcLinien

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

es sollte nicht notwendig sein, beide Dateien durchzugehen, um herauszufinden, dass \e[Aüberschrieben wurde, dass es zwei alternative Abkürzungen für gibt backward-word, dass \e\eODbedeutet ... was auch immer es bedeutet, und dass das kill-wordeigentlich bedeutet, bis zum Ende des aktuellen (oder nächsten) Wortes zu löschen. Die ideale Lösung würde etwas wie Folgendes ausgeben:

Delete until next word boundary: Meta-A
Go to the previous word boundary: F1; Ctrl-Left
Search history backwards: Meta-Up

(Hoffentlich kann jemand mit besseren Kenntnissen der Escape-Sequenzen die Tastenkombinationen reparieren.)

Gibt es ein Linux-Programm, um dies auszudrucken?

Ich vermute, dass ein solches Programm vom Betriebssystem, Kernel oder sogar der Tastatur abhängig sein könnte und daher möglicherweise eine umfangreiche Konfiguration erfordern würde (beispielsweise ein Programm, das den Benutzer per Abfrage auffordert, showkeyverschiedene xevTasten zu drücken, um festzustellen, welche Escape-Sequenzen wirklich gesendet werden). Dies wäre jedoch ein akzeptabler Preis, um endlich zu verstehen, wie Terminalverknüpfungen effizient verwendet werden können.

Antwort1

Die kurze Antwort lautet: Nein, ich bin ziemlich sicher, dass es kein solches Programm gibt.

Sie könnten im Prinzip einen bauen; er müsste sich die Readline-Konfiguration und den Terminalemulator ansehen (Kernel und Hardware sind nicht beteiligt).

bind -P | grep 'can be found'in Bash listet die Tastenkombinationen auf.

abort can be found on "\C-g", "\C-x\C-g", "\e\C-g".
accept-line can be found on "\C-j", "\C-m".

Um einen aussagekräftigeren Namen für den Befehl zu erhalten, müssen Sie die Bash- oder Readline-Dokumentation analysieren.

Die Entsprechung zwischen Tastenfolgen und Tasten wird vom Terminal (normalerweise dem Terminalemulator) bestimmt. Sie ist oft nicht ohne weiteres verfügbar, und wenn sie verfügbar ist, ist die Methode, sie zu erhalten, völlig terminalspezifisch.

In Emacs können Sie dem nahe kommen: Starten Sie emacs -q -nwin einem Terminal und drücken Sie Ctrl+ H, C(den describe-key-brieflyBefehl) und dann die Tastenfolge ( \eist Escape). Dies zeigt Ihnen die rekonstruierte Funktionstaste, falls vorhanden, und was die Taste in Emacs bewirkt. Die Standardbindungen von Readline sind stark von Emacs inspiriert, daher ist die Funktion in Emacs oft der Funktion in Readline ähnlich, aber nicht immer. Beispiel:

Ctrl+H C ESC [ A
<up> runs the command previous-line

Antwort2

bindIch hatte genau das gleiche Problem und konnte die mehreren Seiten Ausgabe des in Bash integrierten Befehls nicht verarbeiten , insbesondere wenn die -pOption dazu angeboten wurde.

Daher habe ich mir die folgenden zwei Funktionen ausgedacht, die ich in meiner .bashrcDatei definiert habe:

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

Führen Sie einfach die beiden obigen Definitionen aus und entscheiden Sie, ob Ihnen die sortierte ( sort) und tabellarische ( pr -t) Ausgabe gefällt. Die widthAnzahl der Spalten ist festgelegt, die Anzahl der Spalten bezieht sich auf das Verhältnis von $(($COLUMNS/$width)).

verwandte Informationen