显示自动填充候选人时是否可以显示一些帮助信息?

时间:2017-01-05 08:22:57

标签: bash tab-completion bash-completion

有些命令有很多-xx可以是任何英文字母)选项,有时难以记住它们的所有含义。我可以使用bash的compgen -W '-a -b -c'来显示可能的选项,我想知道是否也可以显示一些帮助信息。像这样:

bash# foo -<TAB><TAB>
-a: This is option a    -b: This is option b
-C: This is option c
bash#

2 个答案:

答案 0 :(得分:2)

我做过类似的事情,将curl的一些单个字符选项(如-x)映射到GNU样式--long-option

这是它的工作原理:

[STEP 101] # cat curl
function _compgen_curl()
{
    local cmd=$1 cur=$2 pre=$3
    local -a options=( \
                       '' --connect-timeout \
                       -k --insecure \
                       -m --max-time \
                       -o --output \
                       -O --remote-name \
                       -u --user \
                       -U --proxy-user
                       -x --proxy \
                       -y --speed-time \
                       -Y --speed-limit \
                     )
    local -a options2=()
    local i short long

    for ((i = 0; i < ${#options[@]}; i += 2)); do
        short=${options[i]}
        long=${options[i+1]}
        if [[ -z $short || -z $long ]]; then
            options2+=( $short$long )
        else
            options2+=( $short,$long )
        fi
    done

    if [[ $cur == - ]]; then
        COMPREPLY=( $( compgen -W "${options2[*]}" -- "$cur" ) )
    elif [[ $cur == --* ]]; then
        COMPREPLY=( $( compgen -W "${options[*]}" -- "$cur" ) )
    fi
}

complete -F _compgen_curl -o bashdefault -o default curl

[STEP 102] # . ./curl
[STEP 103] # curl -<TAB><TAB>
--connect-timeout  -o,--output        -u,--user          -y,--speed-time
-k,--insecure      -O,--remote-name   -x,--proxy
-m,--max-time      -U,--proxy-user    -Y,--speed-limit
[STEP 103] # curl -

不完全是您的要求,但您可以根据自己的目的更新。

(我不确定bash是否可以处理完成结果中的空格,但至少可以使用_-。: - )

答案 1 :(得分:1)

IMO这是一个坏主意。

但如果你真的想要它,你可以这样做: 请注意,此代码有点粗糙,除非我知道您的用例,否则我无法提供确切的答案。但是,给你一个总体思路应该足够了。

原件:

complete -o nospace -F _default_completion my_command

新:

_custom_completion(){
    local cur;
    _get_comp_words_by_ref cur;
    _default_completion
    if [ ${#COMPREPLY[@]} == 1 ]; then return; fi
    local _compreply=()
    local reply_entry
    local description
    for reply_entry in ${COMPREPLY[@]}; do
        description=$(generate_description_from_option "$reply_entry")
        description=$(printf "%${COLUMNS}s" "$reply_entry : $description" )
        _compreply+=$description
    done
    COMPREPLY=(${_compreply[@]})
} && complete -o nospace -F _custom_completion my_command

有了这个,bash应该每行显示一个选项,前面有描述。当然,您需要自己编写generate_description_from_option。