Estoy jugando con un guión que, entre otras cosas, enumera una lista de selección. Como en:
1) Elemento 1 # (resaltado) 2) Artículo 2 3) Elemento 3 # (seleccionado) 4) Artículo 4
- Cuando el usuario presiona los
down-arrowsiguientes elementos se resalta - Cuando el usuario presiona
up-arrowlos elementos anteriores se resalta - etc.
- Cuando el usuario presiona el
tabelemento está seleccionado - Cuando el usuario presiona
shift+tabtodos los elementos están seleccionados / deseleccionados - Cuando el usuario presiona
ctrl+atodos los elementos están seleccionados - ...
Esto funciona bien a partir del uso actual, que es mi uso personal donde mi propia configuración filtra la entrada.
La pregunta es cómo hacer que esto sea confiable en varios terminales.
Yo uso una solución algo hack para leer la entrada:
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
Y así.
Como se mencionó, la pregunta es cómo hacer que esto sea confiable en varios terminales: es decir, qué secuencias de bytes definen una clave específica. ¿Es factible incluso en bash?
Un pensamiento era usar uno tputo infocmpy filtrar por el resultado dado por eso. Sin embargo estoy en un obstáculo que hay que tanto tputy infocmpdifieren de lo que en realidad leo cuando en realidad la pulsación de teclas. Lo mismo ocurre, por ejemplo, con C sobre 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)';
}
Las secuencias de rendimiento se leen como se define, por ejemplo linux, pero no xterm, que es lo que establece TERM.
Por ejemplo, flecha izquierda:
tput/infocmp:\x1 O Dread:\x1 [ D
¿Qué me estoy perdiendo?
zshtiene soporte para maldiciones incorporadas (en el módulo zsh / curses) además de consultas básicas de terminfo con su matriz echotiincorporada y $terminfoasociativa.

dialogvariantes, o use un lenguaje conncursessoporte decente (perl o python, por ejemplo, si desea seguir con los lenguajes de "scripting").