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

时间:2010-08-19 10:41:11

标签: bash shell tab-completion bash-completion

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

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

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

6 个答案:

答案 0 :(得分:12)

我真的不知道它是如何工作的,但awesome window manager使用以下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。
  3. 我们一起使用以下脚本:

    __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选项输出时做了类似的事情。