25

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

有什么办法可以compgen用来做到这一点吗?如果没有,还有其他方法可以让我以编程方式获取完成列表吗?

[编辑:澄清一下,我不是想为 bash提供补全——我的应用程序是一个 GUI 命令启动器。我只是想在我自己的应用程序中使用 bash 的现有完成。]

4

4 回答 4

15

我真的不知道它是如何工作的,但是很棒的窗口管理器使用以下 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

输出:“日志”

于 2010-09-03T22:52:46.950 回答
2

检查/etc/bash_completion.d/目录。这是不同的命令完成脚本所在的位置。

于 2010-08-22T16:19:57.883 回答
1

相当老的问题,但与此同时,我已经实现了一个脚本来处理这个问题,以重用 ZSH 的完成

于 2020-12-16T00:53:04.760 回答
-1

这是 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

于 2010-08-30T08:08:07.123 回答