当参数中不包含特殊字符时,我已经使用compgen机制为自定义命令成功实现了bash补全:
current=${COMP_WORDS[COMP_CWORD]}
all=$(_get_all_items)
COMPREPLY=( $(compgen -W "$all" -- $current) )
...
complete -F _prog_compl prog
我用同样的方法来与冒号开始完成项目::first
,:second
...,但是它不能告诉我/自动完成它们。我尝试用反斜杠转义冒号,但也不起作用。我应该如何完全摆脱结肠?
该项目开始于结肠,让我们说::first
,:second
。如果我写progname并以这样的冒号开头:
$ 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.
另外,我在外壳中做了一些实验,得出:
$ 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
在咨询[email protected]之后,我得到了一个答案:
冒号会中断补全系统的单词(请查看COMP_WORDBREAKS shell变量的描述),因此在键入时
程序名:[TAB]
完成系统会空一个单词来完成。如果所有可能的补全都以“:”作为最长的公共前缀,则补全系统会将冒号插入行中。
而且我的COMP_WORDBREAKS搜索从stackoverflow中得到了答案。
现在,从debian bash完成页面修复了(我丢失的)/ etc / bash_completion文件之后,我由冒号启动的完成工作正在按我的意愿进行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句