【问题标题】:Bash completion for Maven escapes colonMaven 的 Bash 完成转义冒号
【发布时间】:2011-02-17 19:46:49
【问题描述】:

我在文档之后为 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 -版本
GNU bash,版本 3.2.39(1)-release (i486-pc-linux-gnu)

【问题讨论】:

    标签: bash shell maven-2 ubuntu autocomplete


    【解决方案1】:

    来自Bash FAQ E13

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

    COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
    

    【讨论】:

    • 谢谢!这件事困扰了我一段时间:)
    • 警告您可能不应该这样做,因为它破坏了依赖于默认行为(如 scp)的完成功能。请参阅bugs.launchpad.net/gvfs/+bug/290784 进行讨论
    • 同意@gfxmonk,这是不合适的,因为它会破坏其他功能的完成
    • 正如大家所说,不建议这样做,因为它会破坏其他工具的完成。相反,对于这种情况,您应该使用 bash 完成包提供的辅助方法 - _get_comp_words_by_ref 和 __ltrim_colon_completions。您还可以查看 /etc/bash_completion.d 中的其他完成脚本,了解它们如何使用上述辅助方法轻松解决此问题。我试图在下面的答案中更好地描述这一点。
    • @RaduGasler:感谢您的反对。我的回答基于 Bash 维护者的文档(请参阅链接)。
    【解决方案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 是 HEAD 修订版的直接download link)。真是太棒了。

    【讨论】:

      【解决方案3】:

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

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

      希望有帮助!

      【讨论】:

        【解决方案4】:

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

        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)上都获得相同的行为。

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

        【讨论】:

        • 您好,您发布到 Bash Completion 1.2 的链接现已失效,另一个链接没有提及任何一种方法。我不清楚您如何使用这些方法更改 COMP_WORDS 数组以忽略冒号。你介意再解释一下吗?
        猜你喜欢
        • 2017-06-04
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 2013-01-30
        • 1970-01-01
        • 2023-01-11
        • 2012-04-13
        相关资源
        最近更新 更多