我正在使用一个脚本,其中列出了一个选择列表。如:
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中甚至可行吗?
一种想法是使用tputor,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)。