以编程方式访问特定命令的bash完成
-
29-09-2019 - |
题
我正在尝试编写一个小型命令启动器应用程序,并希望在我自己的完成系统中使用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”。 - “ 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
输出:“日志”
其他提示
检查 /etc/bash_completion.d/
目录。这是不同命令完成脚本留在的地方。
这里是一个简单但有效的示例:
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时,您将完成命令。
您可以从命令帮助中计算完成列表。
my2c
我不久前就把这个脚本入侵了,这使您非常准确 男子页面完成 我知道其他人通过解析做了类似的事情 --help
选项输出。
不隶属于 StackOverflow