当参数中没有特殊字符时,我已成功为自定义命令实现了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'),我会完全按照我的要求完成:bfirst
,bsecond
...
需要注意的是,当我按下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
答案 0 :(得分:6)
咨询 help-bash@gnu.org 后,我得到了答案:
冒号打破完成系统的单词(看看 COMP_WORDBREAKS shell变量的描述),所以当你输入
时progname:[TAB]
完成系统获得一个空字来完成。如果所有的 可能的完成有`:&#39;作为最长的共同前缀,那么 完成系统会将冒号插入该行。
我的COMP_WORDBREAKS搜索给了我stackoverflow的答案。
从debian bash completion page修复(我遗失的)/ etc / bash_completion文件后,现在,我的冒号启动完成了我的意愿。