如何将字符串补全输出到stdout?


15

其中一些git命令有很多选项,在它们中搜索我需要的选项通常会很有用-我只是在寻找控制TAB宽度的选项git-gui,但是大约有200个补全git config。一个显而易见的解决方法是将所有补全复制到编辑器中并搜索它们,但我宁愿这样做

[something] | grep tab

没有man或的info页面compgenhelp compgen甚至没有解释其自身的选项,也没有自动完成的功能compgen(讽刺的是那是怎么回事?)。

PS:compgen -A不起作用。

PPS:这不是一个问题git-gui- 制表符宽度问题解决方案在其他地方。

PPPS:这与自动完成命令无关,仅与命令参数有关


这与如何通过管道传递“ tab complete”的输出非常相似,但那里公认的答案专门用于完成命令,而不是辩论
Michael Mrozek

Answers:


10

您可以使用以下功能,该功能使用与sudo自动完成生成完成列表相同的方式:

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

其中_command_offset是在bash完成(包)的定义。

注意:该功能需要在交互式外壳程序中运行(即,如果它在文件中,则需要提供源文件而不是仅运行该文件。)否则,将不会定义必要的完成规则/功能。

PS。compgen -A仅适用于内置的动作,你应该尝试(但也不管用)是compgen -F(或实际compgen -o bashdefault -o default -o nospace -F _git)。不起作用的原因(以及bash内置命令的doc包括compgen / complete)可以在bash(1)中找到


@ l0b0希望在所有情况下都有效。
yuyichao 2012年

太好了,它有效!我做了一些小调整,现在已经在我的.bash_aliases中了。您可能想要修剪,以便仅保留解决方案,但是毫无疑问,您会获得赏金。我将删除讨论评论,因为它们不再相关。
l0b0 2012年

1
我发现在交互式外壳中使用它可以破坏已经完成的制表符完成。将每个变量都设置为函数局部变量可以解决该问题。(例如local COMP_LINE="$*"
AL Flanagan

@ALFlanagan好点。更新。
yuyichao 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.