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

2019-05-14 00:15发布

还有,当我实现一个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

Answer 1:

修改$COMP_WORDBREAKS在完成脚本是不推荐的方式(因为它是一个全局变量,它可能会影响其他完成脚本的行为-比如SSH)。

然而,bash补全提供,你可以用它来实现自己的目标了一些辅助方法。

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

  • _get_comp_words_by_ref-n EXCLUDE选项
    • 得到词对完成不考虑字符作为排除断字
  • __ltrim_colon_completions
    • 去除COMPREPLY项含有结肠前缀
      (用于解决方法http://tiswww.case.edu/php/chet/bash/FAQ - E13)

所以,这里是一个基本的例子如何把手的冒号(:)完成的话:

_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 。 看看里面读取每个方法的详细描述和发现更多的辅助方法。



文章来源: How to reset COMP_WORDBREAKS without affecting other completion script?