当我使用类似的程序svn
并在 Gnome 终端中输入时:
svn upd
然后点击Tab自动完成功能:
svn update
我可以在我的自定义 bash 脚本中执行类似操作吗?
答案1
您必须创建一个新文件:
/etc/bash_completion.d/foo
对于静态自动完成(例如--help
/ )添加以下内容:--verbose
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
是一个包含当前命令行中所有单个单词的数组。COMP_CWORD
是包含当前光标位置的单词的索引。COMPREPLY
是一个数组变量,Bash 从中读取可能的补全。
该compgen
命令返回来自 的元素数组--help
,--verbose
并--version
与当前单词 匹配"${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
答案2
这是一个完整的教程。
让我们举一个admin.sh
您希望自动完成功能的脚本示例。
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
注意选项shortlist
。使用此选项调用脚本将打印出该脚本的所有可能选项。
这里是自动完成脚本:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
请注意,complete 的最后一个参数是要添加自动完成功能的脚本的名称。您需要做的就是将自动完成脚本添加到 bashrc 中,如下所示:
source /path/to/your/autocomplete.sh
或将其复制到:
/etc/bash_completion.d
答案3
您可以使用可编程完成。查看/etc/bash_completion
并/etc/bash_completion.d/*
获取一些示例。
答案4
如果您想要的只是一个简单的基于单词的自动完成(因此没有子命令完成或任何其他内容),则该complete
命令有一个-W
选项可以执行正确的操作。
例如,我在.bashrc
自动完成一个名为jupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
现在jupyter <TAB> <TAB>
可以自动完成。
这文档gnu.org 上的帮助很有帮助。
它似乎依赖于IFS
正确设置的变量,但这并没有给我带来任何问题。
要添加文件名完成和默认 BASH 完成,请使用以下-o
选项:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
complete
要在 zsh 中使用它,请在运行命令之前添加以下代码~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi