我正在尝试编写一个小命令启动器应用程序,并希望在我自己的完成系统中使用bash的选项卡完成。我已经能够使用compgen -abck
获得一般命令的完成列表
但是,我还希望获得特定命令的完成:例如,输入git p
应该显示git命令的完成。
我有什么方法可以使用compgen
来做这件事吗?如果没有,有没有其他方法可以通过编程方式获得完成列表?
[编辑:澄清一点,我不是要提供完成bash - 我的应用程序是一个GUI命令启动器。我只想在我自己的应用程序中使用bash的现有完成。]
答案 0 :(得分:12)
我真的不知道它是如何工作的,但awesome window manager使用以下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
输出:“log”
答案 1 :(得分:4)
看看Debian Administration An introduction to bash completion - 它很容易理解 - 顺便说一下,它还有一个part two。
答案 2 :(得分:2)
签入/etc/bash_completion.d/
目录。这是不同的命令完成脚本所在的位置。
答案 3 :(得分:1)
这是一个古老的问题,但与此同时,我已经implemented a script负责处理此问题,以重新使用ZSH完成
答案 4 :(得分:0)
这是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并输入paramN时,当你输入“foo command1 p”+ tab
时,你将获得commandN您可以从命令帮助计算完成列表。
MY2C
答案 5 :(得分:0)
我在一段时间后修改了这个脚本,这让你非常准确Man-page Bash Completion我知道其他人在解析--help
选项输出时做了类似的事情。