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

时间:2012-05-10 06:40:26

标签: bash shell autocomplete bash-completion

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

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

$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

1 个答案:

答案 0 :(得分:23)

修改完成脚本中的$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。看看里面的内容,阅读每种方法的详细描述,并发现更多辅助方法。