狂暴完成Maven逃脱冒号

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

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

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

mvn eclipse:eclipse 

完成逃离冒号

 mvn eclipse\:eclipse 

任何build议如何解决这个问题? 我使用的是Ubuntu 8.10(2.6.27-17-generic)和

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

从Bash常见问题E13 。

紧跟链接的脚本中的complete命令之后,发出以下命令以从完成单词分隔字符列表中删除冒号:

 COMP_WORDBREAKS=${COMP_WORDBREAKS//:} 

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

如何重置COMP_WORDBREAKS而不影响其他完成脚本?

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

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

在Bash completion 1.2中添加了两个辅助方法:

  • 带有-n EXCLUDE选项的_get_comp_words_by_ref
    • 在不考虑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)上获得相同的行为。

您也可以在/etc/bash_completion.d中看看manperl完成脚本,看看他们如何使用上面的帮助器方法来解决这个问题。

任何建议如何可以解决? 我使用的是Ubuntu 8.10(2.6.27-17-generic)和

丹尼斯的回答绝对正确。

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

就个人而言,我使用Ludovic Claude的PPA (捆绑到Ubuntu的maven包中的PPA)中的Bash Completion脚本 ,我直接从集市下载(她的e是直接下载链接到HEAD版本)。 这真是太棒了。

我会去与willcodeforbeer.com Maven2 Bash完成文件 。

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

希望有所帮助!