我正在尝试构建一个bash完成例程,它将建议命令行标志和合适的标志值。例如,在下面的 fstcompose 命令中,我希望竞争例程首先建议 compose_filter = 标志,然后根据[alt_sequence,auto,match,sequence]建议可能的值
fstcompose --compose_filter=
对于没有一组关联值的任何标志,我希望比赛回归到建议路径或文件的默认模式。
我面临的一个问题是将=等号作为单个标记处理,并设置为prev COMP_WORD。有没有一种技术可以在前一个=字符之前检测整个标志?或者是否有更好的方法来实现具有可枚举值的此类型标记完成?以下是我正在使用的完成例程的示例。
_fstcompose()
{
local cur prev opts filters pprev
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--compose_filter= --connect"
filters="alt_sequence auto match sequence"
if [[ ${cur} == -* ]] ; then
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${prev} == "--compose_filter=" ]] ; then
COMPREPLY=($(compgen -W "${filters}" -- ${cur}))
return 0
fi
_filedir
}
complete -o nospace -F _fstcompose fstcompose
答案 0 :(得分:2)
您的第一个return 0
会阻止评估第二个if
。尝试使用从最具体到最不具体的订单case
语句,或至少按顺序订购if
语句。
由于“{”包含在$COMP_WORDBREAKS
中,${prev}
为“--compose_filter”而不包含“=”。
如果您从$COMP_WORDBREAKS
删除“=”,则--compose_filter
仍然是${cur}
而不是${prev}
。这样做而不保留和恢复其价值将打破其他完成。
我不确定可能存在哪些其他问题。
您可以使用重定向到另一个终端的echo
语句来加强您的功能,以帮助调试。例如:
echo "cur: $cur, prev: $prev" > /dev/pts/2
答案 1 :(得分:0)
这会帮助我认为的一些人。 下面的代码应该可以工作(动态写)
have fstcompose &&{
function elementExists(){
local i isRunning result
i=0
isRunning=1
result=0
#~ for i in ${opts_with_equal[@]}; do
while [ "$isRunning" -eq 1 ]; do
if [ "$i" -ge "${#opts_with_equal[@]}" ]; then
isRunning=0
elif [ "${opts_with_equal[$i]}" == "$1" ]; then
result=1
isRunning=0
fi
((i++))
done
echo $result
}
function _fstcompose(){
local prev cur opts opts_with_equal isEqualOptions
COMPREPLY=()
_get_comp_words_by_ref -n : cur prev
opts="--compose_filter --connect"
opts_with_equal=(--compose_filter)
case ${cur} in
'--compose_filter'*)
prev="${cur%%=*}="
cur=${cur#*=}
COMPREPLY=( ${prev}$(compgen -W "alt_sequence auto match sequence" -- "${cur}") )
return 0
;;
esac
if [[ "${cur}" != -* ]]; then
_filedir
else
isEqualOptions=$(elementExists "${cur}")
if [ "${isEqualOptions:-0}" -eq 1 ]; then
COMPREPLY=( $(compgen -W "${opts}" -S '=' -- "${cur}") )
else
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
fi
fi
}
complete -o nospace -F _fstcompose fstcompose
}
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
注意:opts_with_equal它是一个数组,在这个例子中它只包含一个参数。放入使用'='
的每个参数