Bash 每个参数具有多个参数值的自动完成
Bash Autocompletion with multiple argument values per argument
我第一次尝试实现制表符补全 - 它必须在 GIT Bash 中工作,并且它适用于我编写的 python 脚本(使用 argparser
)
该脚本基本上有两个参数 --option_a
和 --option_b
,它们接受单个和多个参数值,例如script --option_a steak
或 script --option_a steak burger pizza
均有效。但是仍然有一组选项可供选择,因此您无法输入任何内容。
我已经完成了大部分:
已经完成的工作
OPTION_A_VALUES="bread pizza steak burger"
OPTION_B_VALUES="apple banana"
_autocomplete () {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
case "$prev" in
"--option_a")
COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )
return 0
;;
"--option_b")
COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
return 0
;;
esac
if [[ ${cur} == -* ]]
then
COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
return 0
fi
}
complete -o nospace -F _autocomplete script
script
是 python 脚本的别名。
-
$ script --option_a bur<TAB>
计算结果为 script --option_a burger
。太好了!
问题
基本上我还需要做的是支持所有可能的参数值的自动完成 - 目前它在完成一个后停止:
-
$ script --option_a burger pi<TAB>
这 not 评估为 script --option_a burger pizza
:( 不好!
当然,在完成 pizza
并输入 --<TAB><TAB>
之后,脚本应该会再次提示 --option_a --option_b
任何有关如何修改我的自动完成脚本以完成这项工作的帮助将不胜感激!
提前致谢。
你可以试试这个
_autocomplete () {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
if [[ ${cur} == -* ]]
then
COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
return 0
fi
case "$prev" in
--option_a|bread|pizza|steak|burger)
COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )
return 0
;;
--option_b|apple|banana)
COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
return 0
;;
esac
}
想法是
如果 cur
以 -
开头,compgen
立即获得 option_a option_b
如果 prev
是 --option_a bread pizza steak burger
之一,它会再次获取值
我第一次尝试实现制表符补全 - 它必须在 GIT Bash 中工作,并且它适用于我编写的 python 脚本(使用 argparser
)
该脚本基本上有两个参数 --option_a
和 --option_b
,它们接受单个和多个参数值,例如script --option_a steak
或 script --option_a steak burger pizza
均有效。但是仍然有一组选项可供选择,因此您无法输入任何内容。
我已经完成了大部分:
已经完成的工作
OPTION_A_VALUES="bread pizza steak burger"
OPTION_B_VALUES="apple banana"
_autocomplete () {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
case "$prev" in
"--option_a")
COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )
return 0
;;
"--option_b")
COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
return 0
;;
esac
if [[ ${cur} == -* ]]
then
COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
return 0
fi
}
complete -o nospace -F _autocomplete script
script
是 python 脚本的别名。
-
计算结果为$ script --option_a bur<TAB>
script --option_a burger
。太好了!
问题
基本上我还需要做的是支持所有可能的参数值的自动完成 - 目前它在完成一个后停止:
-
这 not 评估为$ script --option_a burger pi<TAB>
script --option_a burger pizza
:( 不好!
当然,在完成 pizza
并输入 --<TAB><TAB>
之后,脚本应该会再次提示 --option_a --option_b
任何有关如何修改我的自动完成脚本以完成这项工作的帮助将不胜感激! 提前致谢。
你可以试试这个
_autocomplete () {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
if [[ ${cur} == -* ]]
then
COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
return 0
fi
case "$prev" in
--option_a|bread|pizza|steak|burger)
COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )
return 0
;;
--option_b|apple|banana)
COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
return 0
;;
esac
}
想法是
如果 cur
以 -
开头,compgen
立即获得 option_a option_b
如果 prev
是 --option_a bread pizza steak burger
之一,它会再次获取值