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-arrow
siguientes elementos se resalta - Cuando el usuario presiona
up-arrow
los elementos anteriores se resalta - etc.
- Cuando el usuario presiona el
tab
elemento está seleccionado - Cuando el usuario presiona
shift+tab
todos los elementos están seleccionados / deseleccionados - Cuando el usuario presiona
ctrl+a
todos 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 tput
o infocmp
y filtrar por el resultado dado por eso. Sin embargo estoy en un obstáculo que hay que tanto tput
y infocmp
difieren 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 D
read
:\x1 [ D
¿Qué me estoy perdiendo?
zsh
tiene soporte para maldiciones incorporadas (en el módulo zsh / curses) además de consultas básicas de terminfo con su matriz echoti
incorporada y $terminfo
asociativa.
dialog
variantes, o use un lenguaje conncurses
soporte decente (perl o python, por ejemplo, si desea seguir con los lenguajes de "scripting").