【发布时间】:2014-08-18 12:09:15
【问题描述】:
当参数中不包含特殊字符时,我已经成功地为我的自定义命令实现了 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 并以这样的冒号开头:
$ progname :<Tab here after colon>
我看到没有完成,但有两个冒号 ("::") - 其中一个自动添加到我键入的行中。如果我将冒号转换为普通字符(比如说'b'),我会完全按照我的意愿完成:bfirst、bsecond...
需要注意的是,当我按下制表符时,它会在我之前插入的冒号旁边放置另一个“:”,它变成“::”。
$ 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
【问题讨论】:
-
想提供您如何执行
complete命令吗? -
您真的一无所获,还是您获得了文件名补全?
-
更新了你的答案@konsolebox 和 Ethan。
-
你还有其他使用冒号的补全吗?典型的候选者是
tar和ssh,它们使用带有冒号的远程文件名。 Bash 本身甚至可能有硬编码的特殊情况。 -
我在我的 shell 上添加了完整的输出。谢谢。
标签: bash shell command-line