Sto giocando con una sceneggiatura che, tra le altre cose, elenca un elenco di selezione. Come in:
1) Articolo 1 # (evidenziato) 2) Articolo 2 3) Articolo 3 # (selezionato) 4) Articolo 4
- Quando l'utente preme le
down-arrow
voci successive viene evidenziato - Quando l'utente preme
up-arrow
le voci precedenti è evidenziato - eccetera.
- Quando l'utente preme l'
tab
elemento è selezionato - Quando l'utente preme
shift+tab
tutte le voci sono selezionate / deselezionate - Quando l'utente preme
ctrl+a
tutte le voci sono selezionate - ...
Funziona benissimo a partire dall'uso corrente, che è il mio uso personale in cui l'input è filtrato dalla mia configurazione.
La domanda è come renderlo affidabile su vari terminali.
Uso una soluzione in qualche modo hacker per leggere l'input:
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
E così via.
Come accennato, la domanda è come renderlo affidabile su vari terminali: ovvero quali sequenze di byte definiscono una chiave specifica. È fattibile anche in bash?
Un pensiero era usare o tput
o infocmp
e filtrare in base al risultato dato da quello. Sono comunque in difficoltà in quanto entrambi tput
e infocmp
differiscono da ciò che leggo effettivamente premendo i tasti. Lo stesso vale per esempio usando C su 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)';
}
Le sequenze di rendimento vengono lette come definite per esempio linux
, ma non xterm
, che è ciò che è impostato da TERM
.
Ad esempio freccia sinistra:
tput
/infocmp
:\x1 O D
read
:\x1 [ D
Cosa mi sto perdendo?
zsh
ha il supporto curses integrato (nel modulo zsh / curses) oltre alle query terminfo di base con il suo array echoti
incorporato e $terminfo
associativo.
dialog
varianti o utilizzare una lingua con unncurses
supporto decente (perl o python, ad esempio, se si desidera attenersi alle lingue di "scripting").