Tôi đang chơi với một kịch bản, trong số những thứ khác, liệt kê một danh sách lựa chọn. Như trong:
1) Mục 1 # (được tô sáng) 2) Mục 2 3) Mục 3 # (đã chọn) 4) Mục 4
- Khi người dùng nhấn
down-arrowcác mục tiếp theo được tô sáng - Khi người dùng nhấn
up-arrowcác mục trước được tô sáng - Vân vân.
- Khi người dùng nhấn
tabmục được chọn - Khi người dùng nhấn
shift+tabtất cả các mục được chọn / bỏ chọn - Khi người dùng nhấn
ctrl+atất cả các mục được chọn - ...
Điều này hoạt động tốt như sử dụng hiện tại, đó là sử dụng cá nhân của tôi, nơi đầu vào được lọc theo thiết lập của riêng tôi.
Câu hỏi là làm thế nào để làm cho điều này đáng tin cậy trên các thiết bị đầu cuối khác nhau.
Tôi sử dụng một giải pháp hơi hackish để đọc đầu vào:
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
Và như thế.
Như đã đề cập, câu hỏi là làm thế nào để làm cho điều này đáng tin cậy trên các thiết bị đầu cuối khác nhau: tức là chuỗi byte nào xác định một khóa cụ thể. Nó thậm chí còn khả thi trong bash?
Một ý nghĩ là sử dụng hoặc tputhoặc infocmplọc theo kết quả được đưa ra bởi điều đó. Tuy nhiên, tôi gặp khó khăn vì cả hai tputvà infocmpkhác với những gì tôi thực sự đọc khi nhấn phím. Tương tự như vậy, ví dụ sử dụng C trên 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)';
}
Trình tự năng suất đọc như được định nghĩa chẳng hạn linux, nhưng không xterm, đó là những gì được thiết lập bởi TERM.
Ví dụ mũi tên trái:
tput/infocmp:\x1 O Dread:\x1 [ D
Tôi đang thiếu gì?
zshcó hỗ trợ lời nguyền dựng sẵn (trong mô-đun zsh / curses) ngoài truy vấn terminfo cơ bản với mảng echotidựng sẵn và $terminfoliên kết.

dialogbiến thể hoặc sử dụng ngôn ngữ cóncursessự hỗ trợ tốt (ví dụ: perl hoặc python, nếu bạn muốn gắn bó với các ngôn ngữ "scripting").