Bash命令行选项卡完成冒号字符

时间:2014-08-18 12:09:16

标签: bash shell command-line

当参数中没有特殊字符时,我已成功为自定义命令实现了bash完成,并使用了compgen机制:

    current=${COMP_WORDS[COMP_CWORD]}
    all=$(_get_all_items)
    COMPREPLY=( $(compgen -W "$all" -- $current) )
    ...
    complete -F _prog_compl prog

我使用相同的方法来完成以冒号字符开头的项目::first:second,...但它无法显示/自动填充它们。我尝试用反斜杠逃避冒号,这也没用。 我应该如何在完成时逃避冒号?

这些项目以冒号开头,我们说::first:second。如果我写下了预测,并从这样的冒号开始:

$ progname :<Tab here after colon>

我看到没有完成但是有两个冒号(“::”) - 其中一个自动添加到我输入的行中。如果我将冒号转换为普通角色(让我们说'b'),我会完全按照我的要求完成:bfirstbsecond ...

需要注意的是,当我按下tab时,它会在我之前插入的冒号旁边放置另一个“:”,它变成“::”。

$ bash --version
GNU bash, version 4.1.10(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

另外,我在shell中做了一些实验,产生了:

$ compgen -W ":aaaa5 :gb2 :cd3" -- ":"
:aaaa5
:gb2
:cd3

然而奇怪的是,在我输入命令行后,将另一个“:”添加到我的唯一“:”并使其成为“::”。

$ complete
complete -F _alp_compl alp.sh
complete -o nospace -F __dbus_send dbus-send
complete -F _myprog_compl myprog
complete -o nospace -F __gdbus gdbus
complete -o nospace -F __gsettings gsettings

1 个答案:

答案 0 :(得分:6)

咨询 help-bash@gnu.org 后,我得到了答案:

  

冒号打破完成系统的单词(看看   COMP_WORDBREAKS shell变量的描述),所以当你输入

时      

progname:[TAB]

     

完成系统获得一个空字来完成。如果所有的   可能的完成有`:&#39;作为最长的共同前缀,那么   完成系统会将冒号插入该行。

我的COMP_WORDBREAKS搜索给了我stackoverflow的答案。

debian bash completion page修复(我遗失的)/ etc / bash_completion文件后,现在,我的冒号启动完成了我的意愿。