
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/inputrc
Zeilen
"\e[A": history-search-backward
"\e[11~": backward-word
und ~/.inputrc
Linien
"\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\eOD
bedeutet ... was auch immer es bedeutet, und dass das kill-word
eigentlich 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, showkey
verschiedene xev
Tasten 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 -nw
in einem Terminal und drücken Sie Ctrl+ H, C(den describe-key-briefly
Befehl) und dann die Tastenfolge ( \e
ist 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
bind
Ich hatte genau das gleiche Problem und konnte die mehreren Seiten Ausgabe des in Bash integrierten Befehls nicht verarbeiten , insbesondere wenn die -p
Option dazu angeboten wurde.
Daher habe ich mir die folgenden zwei Funktionen ausgedacht, die ich in meiner .bashrc
Datei 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 width
Anzahl der Spalten ist festgelegt, die Anzahl der Spalten bezieht sich auf das Verhältnis von $(($COLUMNS/$width))
.