Maven的Bash完成逃脱冒号

arm*_*ino 13 bash shell ubuntu maven-2 autocomplete

我在文档之后为Maven添加了bash完成:

http://maven.apache.org/guides/mini/guide-bash-m2-completion.html

除了使用冒号的目标外,一切运作良好.例如,而不是

mvn eclipse:eclipse
Run Code Online (Sandbox Code Playgroud)

完成逃脱冒号

mvn eclipse\:eclipse
Run Code Online (Sandbox Code Playgroud)

有什么建议可以修复吗?我正在使用Ubuntu 8.10(2.6.27-17-generic)和

$ bash -version
GNU bash,版本3.2.39(1)-release(i486-pc-linux-gnu)

Pau*_*ce. 13

来自Bash FAQ E13.

complete在您链接到的脚本中的命令之后,发出此命令以从完成分隔字符列表中删除冒号:

COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
Run Code Online (Sandbox Code Playgroud)

  • 警告您可能不应该这样做,因为它会破坏依赖于默认行为的完成函数(如scp).有关讨论,请参阅https://bugs.launchpad.net/gvfs/+bug/290784 (2认同)

Rad*_*ler 8

这是一个相关问题和另一个建议的解决方案:

如何在不影响其他完成脚本的情况下重置COMP_WORDBREAKS?

如前所述,最简单的解决方案是改变COMP_WORDBREAKS.但是,COMP_WORDBREAKS在完成脚本中进行修改并不安全(因为它是一个全局变量,它具有影响其他完成脚本行为的副作用 - 例如scp).

因此,bash完成提供了一些帮助方法,您可以使用这些方法以更好,更安全的方式实现目标.

Bash完成1.2中添加了两个辅助方法:

  • _get_comp_words_by_ref-n EXCLUDE选项
    • 获得单词到完成而不考虑EXCLUDE中的字符作为单词中断
  • __ltrim_colon_completions

所以,这是一个如何在完成单词中处理冒号(:)的基本示例:

_mytool()
{
    local cur
    _get_comp_words_by_ref -n : cur

    # my implementation here

    __ltrim_colon_completions "$cur"
}
complete -F _mytool mytool
Run Code Online (Sandbox Code Playgroud)

使用辅助方法还可以简化完成脚本,并确保在任何环境(bash-3或bash-4)上获得相同的行为.

您还可以查看manperl完成脚本,/etc/bash_completion.d以了解它们如何使用上述帮助程序方法来解决此问题.

  • 您好,您发布到 Bash Completion 1.2 的链接现已失效,另一个链接没有提及任何有关这两种方法的内容。我不清楚如何使用这些方法来更改 COMP_WORDS 数组以忽略冒号。您介意进一步解释一下吗? (2认同)