【问题标题】:Bash Command-Line Tab Completion Colon CharacterBash 命令行制表符完成冒号字符
【发布时间】: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'),我会完全按照我的意愿完成:bfirstbsecond...

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

$ 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。
  • 你还有其他使用冒号的补全吗?典型的候选者是tarssh,它们使用带有冒号的远程文件名。 Bash 本身甚至可能有硬编码的特殊情况。
  • 我在我的 shell 上添加了完整的输出。谢谢。

标签: bash shell command-line


【解决方案1】:

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

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

节目名称:[TAB]

完成系统得到一个空词来完成。如果所有的 可能的补全有 `:' 作为最长的公共前缀,然后 补全系统会将冒号插入到行中。

我的 COMP_WORDBREAKS 搜索为我提供了来自 stackoverflow 的答案。

在从debian bash completion page 修复(我丢失的)/etc/bash_completion 文件之后,现在,我的冒号启动完成功能正在按我的意愿工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-12-31
    • 2013-12-19
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多