Je joue avec un script qui, entre autres, liste une liste de sélection. Un péché:
1) Point 1 # (en surbrillance) 2) Point 2 3) Article 3 # (sélectionné) 4) Point 4
- Lorsque l'utilisateur appuie sur
down-arrowles éléments suivants est mis en surbrillance - Lorsque l'utilisateur appuie sur
up-arrowles éléments précédents est mis en surbrillance - etc.
- Lorsque l'utilisateur appuie sur l'
tabélément est sélectionné - Lorsque l'utilisateur appuie sur
shift+tabtous les éléments sont sélectionnés / désélectionnés - Lorsque l'utilisateur appuie sur
ctrl+atous les éléments sont sélectionnés - ...
Cela fonctionne très bien à partir de l'utilisation actuelle, qui est mon utilisation personnelle où l'entrée est filtrée par ma propre configuration.
La question est de savoir comment rendre cela fiable sur différents terminaux.
J'utilise une solution un peu hackée pour lire l'entrée:
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
Etc.
Comme mentionné, la question est de savoir comment rendre cela fiable sur différents terminaux: c'est-à-dire quelles séquences d'octets définissent une clé spécifique. Est-ce même faisable en bash?
Une idée était d'utiliser soit tputou infocmpet de filtrer par le résultat donné par cela. Je suis cependant dans un hic là-bas car les deux tputet infocmpdiffèrent de ce que je lis réellement lorsque j'appuie sur les touches. Il en va de même par exemple en utilisant C sur 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)';
}
Les séquences de rendement se lisent comme défini par exemple linux, mais pas xterm, ce qui est défini par TERM.
Par exemple, flèche vers la gauche:
tput/infocmp:\x1 O Dread:\x1 [ D
Qu'est-ce que je rate?
zshprise en charge des curses intégrées (dans le module zsh / curses) en plus des requêtes terminfo de base avec son echotitableau intégré et $terminfoassociatif.

dialogvariantes, ou utilisez un langage avec unncursessupport décent (perl ou python par exemple, si vous voulez vous en tenir aux langages de "scripting").