有些命令有很多-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#
答案 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。