我正在使用一个脚本,其中列出了一个选择列表。如:
1)项目1 #(突出显示) 2)项目2 3)项目3#(已选中) 4)项目4
- 当用户按下
down-arrow
下一个项目时,突出显示 - 当用户按下
up-arrow
以前的项目时,突出显示 - 等等
- 当用户按下
tab
项目被选择时 - 当用户按下时,
shift+tab
所有项目都被选择/取消选择 - 当用户按下
ctrl+a
所有项目时 - ...
从目前的使用情况来看,这工作正常,这是我的个人使用,其中输入由我自己的设置过滤。
问题是如何使各种终端之间的可靠性。
我使用一种有点黑的解决方案来读取输入:
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
等等。
如前所述,问题是如何使它在各种终端之间可靠:即,哪些字节序列定义了特定的密钥。在bash中甚至可行吗?
一种想法是使用tput
or,infocmp
然后根据该结果给出过滤。但是,我在这方面遇到了麻烦,tput
并且infocmp
与实际按下按键时实际阅读的内容有所不同。同样,例如在bash上使用C。
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)';
}
屈服序列读取的定义例如linux
,但不是定义xterm
的TERM
。
例如左箭头:
tput
/infocmp
:\x1 O D
read
:\x1 [ D
我想念什么?
zsh
除了基本的terminfo查询及其echoti
内置和$terminfo
关联数组之外,它还具有内置curses支持(在zsh / curses模块中)。
dialog
变体,或使用具有适当ncurses
支持的语言(例如,如果要坚持使用“脚本”语言,则为perl或python)。