Ich spiele mit einem Skript, das unter anderem eine Auswahlliste auflistet. Wie in:
1) Punkt 1 # (hervorgehoben) 2) Punkt 2 3) Punkt 3 # (ausgewählt) 4) Punkt 4
- Wenn der Benutzer die
down-arrow
nächsten Elemente drückt , wird dies hervorgehoben - Wenn der Benutzer auf
up-arrow
vorherige Elemente drückt , wird dies hervorgehoben - usw.
- Wenn Benutzer drücken
tab
Element ausgewählt ist - Wenn der Benutzer drückt, werden
shift+tab
alle Elemente ausgewählt / abgewählt - Wenn der Benutzer drückt, werden
ctrl+a
alle Elemente ausgewählt - ...
Dies funktioniert ab dem aktuellen Gebrauch einwandfrei. Dies ist mein persönlicher Gebrauch, bei dem Eingaben durch mein eigenes Setup gefiltert werden.
Die Frage ist, wie dies über verschiedene Terminals hinweg zuverlässig gemacht werden kann.
Ich benutze eine etwas hackige Lösung, um Eingaben zu lesen:
while read -rsn1 k # Read one key (first byte in key press)
do
case "$k" in
[[:graph:]])
# Normal input handling
;;
$'\x09') # TAB
# Routine for selecting current item
;;
$'\x7f') # Back-Space
# Routine for back-space
;;
$'\x01') # Ctrl+A
# Routine for ctrl+a
;;
...
$'\x1b') # ESC
read -rsn1 k
[ "$k" == "" ] && return # Esc-Key
[ "$k" == "[" ] && read -rsn1 k
[ "$k" == "O" ] && read -rsn1 k
case "$k" in
A) # Up
# Routine for handling arrow-up-key
;;
B) # Down
# Routine for handling arrow-down-key
;;
...
esac
read -rsn4 -t .1 # Try to flush out other sequences ...
esac
done
Und so weiter.
Wie bereits erwähnt, stellt sich die Frage, wie dies über verschiedene Terminals hinweg zuverlässig gemacht werden kann: dh welche Byte-Sequenzen einen bestimmten Schlüssel definieren. Ist es überhaupt in Bash machbar?
Ein Gedanke war, entweder tput
oder infocmp
und nach dem Ergebnis zu filtern. Ich bin jedoch in einem Haken als beides tput
und infocmp
unterscheide mich von dem, was ich tatsächlich lese, wenn ich tatsächlich Tasten drücke . Gleiches gilt zum Beispiel für C over Bash.
for t in $(find /lib/terminfo -type f -printf "%f\n"); {
printf "%s\n" "$t:";
infocmp -L1 $t | grep -E 'key_(left|right|up|down|home|end)';
}
Ertragssequenzen werden wie zum Beispiel definiert gelesen linux
, aber nicht xterm
, was durch festgelegt wird TERM
.
ZB Pfeil links:
tput
/infocmp
:\x1 O D
read
::\x1 [ D
Was vermisse ich?
zsh
die integrierte Curses-Unterstützung (im zsh / curses-Modul) zusätzlich zur grundlegenden Terminfo-Abfrage mit dem echoti
integrierten und $terminfo
assoziativen Array unterstützt wird.
dialog
Varianten oder eine Sprache mit angemessenerncurses
Unterstützung (Perl oder Python, wenn Sie sich an "Skriptsprachen" halten möchten).