Maven的Bash完成逃脱冒号

时间:2010-05-10 18:36:44

标签: bash shell maven-2 ubuntu autocomplete

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

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

除了使用冒号的目标外,一切都很顺利。例如,而不是

mvn eclipse:eclipse

完成越过冒号

mvn eclipse\:eclipse

有关如何解决此问题的任何建议吗?我正在使用Ubuntu 8.10(2.6.27-17-generic)和

  

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

4 个答案:

答案 0 :(得分:13)

来自Bash FAQ E13

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

COMP_WORDBREAKS=${COMP_WORDBREAKS//:}

答案 1 :(得分:8)

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

How to reset COMP_WORDBREAKS without effecting other completion script?

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

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

为此Bash completion 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

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

您还可以查看man中的perl/etc/bash_completion.d完成脚本,了解他们如何使用上述帮助方法来解决此问题。

答案 2 :(得分:2)

  

有关如何解决此问题的任何建议吗?我正在使用Ubuntu 8.10(2.6.27-17-generic)和

丹尼斯的回答绝对正确。

但是为了记录,有一个记录的问题(MNG-3928)来改进有关Maven与bash集成的文档。该问题附有一个脚本,这是当前在线的一个改进版本,只是起作用。你可能想尝试一下。

就个人而言,我使用直接从bazaar下载的Bash Completion script from Ludovic Claude's PPA(捆绑到Ubuntu的maven包中的那个)(她的e是直接download link到HEAD修订版)。真是太棒了。

答案 3 :(得分:1)

我会选择the Maven2 Bash Completion File at willcodeforbeer.com

  • 效果很好
  • 处理冒号
  • 不会破坏全局变量COMP_WORDBREAKS(从而破坏scp等)
  • 易于编辑和理解

希望有所帮助!