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-arrowvoci successive viene evidenziato - Quando l'utente preme
up-arrowle voci precedenti è evidenziato - eccetera.
- Quando l'utente preme l'
tabelemento è selezionato - Quando l'utente preme
shift+tabtutte le voci sono selezionate / deselezionate - Quando l'utente preme
ctrl+atutte 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 tputo infocmpe filtrare in base al risultato dato da quello. Sono comunque in difficoltà in quanto entrambi tpute infocmpdifferiscono 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 Dread:\x1 [ D
Cosa mi sto perdendo?
zshha il supporto curses integrato (nel modulo zsh / curses) oltre alle query terminfo di base con il suo array echotiincorporato e $terminfoassociativo.

dialogvarianti o utilizzare una lingua con unncursessupporto decente (perl o python, ad esempio, se si desidera attenersi alle lingue di "scripting").