我正在尝试编写一个小型命令启动器应用程序,并且想在我自己的完成系统中使用 bash 的选项卡完成。我已经能够使用compgen -abck
.
但是,我还想获得特定命令的完成:例如,输入git p
应该显示 git 命令的完成。
有什么办法可以compgen
用来做到这一点吗?如果没有,还有其他方法可以让我以编程方式获取完成列表吗?
[编辑:澄清一下,我不是想为 bash提供补全——我的应用程序是一个 GUI 命令启动器。我只是想在我自己的应用程序中使用 bash 的现有完成。]
我正在尝试编写一个小型命令启动器应用程序,并且想在我自己的完成系统中使用 bash 的选项卡完成。我已经能够使用compgen -abck
.
但是,我还想获得特定命令的完成:例如,输入git p
应该显示 git 命令的完成。
有什么办法可以compgen
用来做到这一点吗?如果没有,还有其他方法可以让我以编程方式获取完成列表吗?
[编辑:澄清一下,我不是想为 bash提供补全——我的应用程序是一个 GUI 命令启动器。我只是想在我自己的应用程序中使用 bash 的现有完成。]
我真的不知道它是如何工作的,但是很棒的窗口管理器使用以下 Lua 代码来访问 bash 完成的结果:
https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119
complete -p
我们找到complete -o bashdefault -o default -o nospace -F _git git
. 我们稍后会记住“_git”。我们一起使用以下脚本:
__print_completions() {
printf '%s\n' "${COMPREPLY[@]}"
}
# load bash-completion functions
source /etc/bash_completion
# load git's completion function
_completion_loader git
COMP_WORDS=(git l)
COMP_LINE='git l'
COMP_POINT=6
COMP_CWORD=1
_git
__print_completions
输出:“日志”
检查/etc/bash_completion.d/
目录。这是不同的命令完成脚本所在的位置。
相当老的问题,但与此同时,我已经实现了一个脚本来处理这个问题,以重用 ZSH 的完成
这是 bash 中的一个简单但有效的示例:
function foo_completion()
{
local currentWord=${COMP_WORDS[COMP_CWORD]}
local completionList=""
case "${COMP_CWORD}" in
"1")
completionList="command1 command2 command3";
;;
"2")
completionList="param1 param2 param3";
;;
esac
COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}
complete -F foo_completion foo
使用这种代码,您将在键入“foo c”+ tab 时完成 commandN,在键入“foo command1 p”+ tab 时完成 paramN
您可以从命令帮助中计算完成列表。
my2c