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-arrow
les éléments suivants est mis en surbrillance - Lorsque l'utilisateur appuie sur
up-arrow
les é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+tab
tous les éléments sont sélectionnés / désélectionnés - Lorsque l'utilisateur appuie sur
ctrl+a
tous 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 tput
ou infocmp
et de filtrer par le résultat donné par cela. Je suis cependant dans un hic là-bas car les deux tput
et infocmp
diffè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 D
read
:\x1 [ D
Qu'est-ce que je rate?
zsh
prise en charge des curses intégrées (dans le module zsh / curses) en plus des requêtes terminfo de base avec son echoti
tableau intégré et $terminfo
associatif.
dialog
variantes, ou utilisez un langage avec unncurses
support décent (perl ou python par exemple, si vous voulez vous en tenir aux langages de "scripting").