显示自动完成候选人时是否可以显示一些帮助信息?
Is it possible to display some help message when showing autocomplete candidates?
一些命令有很多-x
(x
可以是任何英文字母)选项,有时很难记住它们的所有含义。我可以使用 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-option
s.
这是它的工作原理:
[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 除了许多其他功能外,还提供了这一点。
一些命令有很多-x
(x
可以是任何英文字母)选项,有时很难记住它们的所有含义。我可以使用 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-option
s.
这是它的工作原理:
[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 除了许多其他功能外,还提供了这一点。