【问题标题】:How to reset COMP_WORDBREAKS without affecting other completion script?如何在不影响其他完成脚本的情况下重置 COMP_WORDBREAKS?
【发布时间】:2012-05-18 17:05:52
【问题描述】:

当我实现一个 bash 自动完成功能时,有些东西让我感到困惑,我将把它放在 /etc/bash_completion.d/

为了实现某些功能,我想从变量 $COMP_WORDBREAKS 中删除分词字符冒号 (:) 并在 $COMP_WORDBREAKS 的开头添加一个斜杠 (/)。

COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    compopt -o nospace

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool

但是,我无法直接重置COMP_WORDBREAKS,因为该值与其他完成脚本共享。在调用完成函数时,变量COMP_WORDS 数组已经被填充,因此本地更改COMP_WORDBREAKS 无效。

有什么解决方案可以在一个完成脚本中更改COMP_WORDBREAKS 而对其他脚本没有影响?

$ echo $BASH_VERSION
4.2.10(1)-release

【问题讨论】:

    标签: bash shell autocomplete bash-completion


    【解决方案1】:

    不推荐在补全脚本中修改 $COMP_WORDBREAKS(因为它是一个全局变量,可能会影响其他补全脚本的行为 - 例如 ssh)。

    但是,bash 补全提供了一些帮助方法,您可以使用它们来实现您的目标。

    处理完成词中的非断词字符的推荐方法是使用两个辅助方法:

    • _get_comp_words_by_ref-n EXCLUDE 选项
      • 在不将 EXCLUDE 中的字符视为分词的情况下完成单词
    • __ltrim_colon_completions

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

    _mytool()
    {
        local cur
        _get_comp_words_by_ref -n : cur
    
        # my implementation here
    
        COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
    
        __ltrim_colon_completions "$cur"
    }
    complete -F _mytool mytool
    

    最后提示,辅助方法位于/etc/bash_completion。查看内部以阅读每个方法的详细说明并发现更多辅助方法。

    【讨论】:

    • 非常感谢,这对我在 Ruby on Rails 中完成 rake 任务非常有用!另外,感谢您指出文档中的 E13 部分。
    • 这只是正常工作,当我把这行cur="${COMP_WORDS[COMP_CWORD]}"放在_get_comp_words_by_ref -n : cur之前也很高兴知道,如果你也使用prev,你可以在最后添加它_get_comp_words_by_ref -n : cur prev
    • 当我有模棱两可的完成并两次点击选项卡时,根据我在使用此解决方案时输入的内容,我得到了不正确的建议。见stackoverflow.com/questions/28479216/…
    • /etc/bash_completion 的内容在 __ltrim_colon_completions 的标题注释中指出:“首选的解决方案是从 .bashrc 中的 COMP_WORDBREAKS 中删除冒号 (:)”
    • 你可以使用_init_completion -n :而不是_get_comp_words_by_ref,但是你必须声明更多的局部变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多