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

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

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

有帮助吗?

解决方案

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

输出:“日志”

其他提示

看看Debian政府 狂欢完成简介 - 这很容易理解 - 顺便说一句,它也有一个 第二部分.

检查 /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 选项输出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top