Saya bermain dengan skrip yang, antara lain, daftar pilihan-daftar. Seperti dalam:
1) Item 1 # (disorot) 2) Butir 2 3) Item 3 # (dipilih) 4) Item 4
- Ketika pengguna menekan
down-arrow
item berikutnya disorot - Saat pengguna menekan
up-arrow
item sebelumnya disorot - dll.
- Ketika
tab
item pengguna tekan dipilih - Ketika pengguna menekan
shift+tab
semua item dipilih / tidak dipilih - Ketika pengguna menekan
ctrl+a
semua item dipilih - ...
Ini berfungsi dengan baik pada penggunaan saat ini, yang merupakan penggunaan pribadi saya di mana input difilter oleh pengaturan saya sendiri.
Pertanyaannya adalah bagaimana membuat ini dapat diandalkan di berbagai terminal.
Saya menggunakan solusi yang agak peretasan untuk membaca 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
Dan seterusnya.
Seperti disebutkan, pertanyaannya adalah bagaimana membuat ini dapat diandalkan di berbagai terminal: yaitu urutan byte apa yang menentukan kunci tertentu. Apakah itu layak di bash?
Satu pemikiran adalah menggunakan salah satu dan tput
atau infocmp
memfilter berdasarkan hasil yang diberikan oleh hal itu. Namun saya dalam kesulitan karena keduanya tput
dan infocmp
berbeda dari apa yang sebenarnya saya baca ketika benar-benar menekan tombol. Sama berlaku misalnya menggunakan C over 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)';
}
Sekuens hasil dibaca seperti yang didefinisikan misalnya linux
, tetapi tidak xterm
, yang ditetapkan oleh TERM
.
Misal panah kiri:
tput
/infocmp
:\x1 O D
read
:\x1 [ D
Apa yang saya lewatkan?
zsh
memiliki dukungan kutukan bawaan (dalam modul zsh / kutukan) di samping kueri terminfo dasar dengan array echoti
bawaan dan $terminfo
asosiatifnya.
dialog
varian, atau gunakan bahasa denganncurses
dukungan yang layak (perl atau python misalnya, jika Anda ingin tetap menggunakan bahasa "scripting").