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

2024-01-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

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

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

处理补全词中的非断词字符的推荐方法是使用两种辅助方法:

  • _get_comp_words_by_ref with the -n EXCLUDE option
    • 获取完整单词,而不将 EXCLUDE 中的字符视为断词
  • __ltrim_colon_completions
    • 从 COMPREPLY 项目中删除包含前缀的冒号
      (解决方法http://tiswww.case.edu/php/chet/bash/FAQ 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。查看内部以阅读每个方法的详细说明并发现更多辅助方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重置 COMP_WORDBREAKS 而不影响其他完成脚本? 的相关文章