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

Is it possible to display some help message when showing autocomplete candidates?

一些命令有很多-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#

在我看来这不是个好主意。

但如果你真的想要它,你可以这样做: 请注意,这段代码有点粗糙,除非我知道你的用例,否则我无法提供准确的答案。但是,它应该足以给你一个大概的想法。

原文:

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。

我曾经做过类似的事情,将一些 curl 的单字符选项(比如 -x)映射到 GNU 风格 --long-options.

这是它的工作原理:

[STEP 101] # cat curl
function _compgen_curl()
{
    local cmd= cur= pre=
    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 是否可以处理完成结果中的空格,但至少你可以使用 _-。:-)

ble.sh 除了许多其他功能外,还提供了这一点。