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-arrow
các mục tiếp theo được tô sáng - Khi người dùng nhấn
up-arrow
các mục trước được tô sáng - Vân vân.
- Khi người dùng nhấn
tab
mục được chọn - Khi người dùng nhấn
shift+tab
tất cả các mục được chọn / bỏ chọn - Khi người dùng nhấn
ctrl+a
tấ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 tput
hoặc infocmp
lọ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 tput
và infocmp
khá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 D
read
:\x1 [ D
Tôi đang thiếu gì?
zsh
có 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 echoti
dựng sẵn và $terminfo
liên kết.
dialog
biến thể hoặc sử dụng ngôn ngữ cóncurses
sự 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").