以编程方式访问特定命令的bash完成

Don*_*vey 22 bash shell tab-completion bash-completion

我正在尝试编写一个小型命令启动器应用程序,并希望在我自己的完成系统中使用bash的选项卡完成.我已经能够获得一般命令的完成列表compgen -abck.
但是,我还希望获得特定命令的完成:例如,输入git p应显示git命令的完成.

我有什么方法可以compgen用来做这个吗?如果没有,还有其他方法可以通过编程方式获得完成列表吗?

[编辑:澄清一点,我不是要 bash 提供完成 - 我的应用程序是一个GUI命令启动器.我只想在我自己的应用程序中使用bash的现有完成.

Uli*_*ter 12

我真的不知道它是如何工作的,但是很棒的窗口管理器使用以下Lua代码来访问bash完成的结果:

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. 通过complete -p我们找到complete -o bashdefault -o default -o nospace -F _git git.我们以后会记得"_git".
  2. "git l"的长度为5,因此我们设置COMP_COUNT = 6.我们正在完成"git"的第一个参数,所以COMP_CWORD = 1.

我们一起使用以下脚本:

__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
Run Code Online (Sandbox Code Playgroud)

输出:"log"

  • 嘿太棒了!谢谢你解决这个问题.请注意,为了便于阅读/方便,您可以将`for((..; ..; ..))`语句替换为`for $ in"$ {COMP_REPLY [@]}"`(然后`echo循环中"$ reply".另外:你的例子中的`i`或者我的提议中的`reply`应该被声明为`local`以避免破坏同名的全局变量. (2认同)
  • FYI Bash现在使用动态完成加载,这需要使用`_completion_loader git`来加载git的完成函数`_git`.此外,我无法找到任何对"COMP_COUNT"的引用.正确的var是`COMP_POINT`.注意,`COMP_POINT`未完成脚本直接使用,而是通过在*的/ usr /共享/ bash的完成/ bash_completion常用的辅助函数*间接使用. (2认同)