23

当我实现一个 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
4

1 回答 1

25

不推荐在完成脚本中进行修改$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. 查看内部以阅读每个方法的详细说明并发现更多辅助方法。

于 2012-09-19T13:13:47.907 回答