Bash 如何在不影响其他完成脚本的情况下重置COMP_分词符?

Bash 如何在不影响其他完成脚本的情况下重置COMP_分词符?,bash,shell,autocomplete,bash-completion,Bash,Shell,Autocomplete,Bash Completion,当我实现一个bash自动完成函数时,我会把它放在/etc/bash\u completion.d/ 为了实现某些功能,我想从变量$COMP\u WORDBREAKS中删除分词字符冒号(:),并在$COMP\u WORDBREAKS的开头添加斜杠(/) COMP_WORDBREAKS=" /'><=;|&(" _mytool() { local cur=${COMP_WORDS[COMP_CWORD]} compopt -o nospace # my

当我实现一个bash自动完成函数时,我会把它放在/etc/bash\u completion.d/

为了实现某些功能,我想从变量
$COMP\u WORDBREAKS
中删除分词字符冒号(
),并在
$COMP\u 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
不是推荐的方法(因为它是一个全局变量,可能会影响其他完成脚本的行为,例如ssh)

但是,bash completion提供了一些帮助方法,您可以使用这些方法来实现您的目标

建议使用以下两种辅助方法来处理补全词中的非分词字符:

  • \u使用
    -n EXCLUDE
    选项
    • 获取要完成的单词,而不将EXCLUDE中的字符视为分词
  • \u ltrim\u colon\u补全
    • 从压缩项中删除包含前缀的冒号
      (针对-E13的解决方案)
下面是一个如何在补全词中处理冒号(:)的基本示例:

\u mytool()
{
本地电流
_通过\u ref-n:cur获取\u comp\u words\u
#我在这里的实现
COMPREPLY=($(compgen……..my_implement……..--$cur))
__ltrim\u冒号\u补全“$cur”
}
完成-F_mytool mytool

最后,helper方法位于
/etc/bash\u completion
中。查看内部,阅读每个方法的详细描述,并发现更多帮助方法。

非常感谢,这对我在Ruby on Rails中完成rake任务非常有用!另外,感谢您指出文档中的E13部分。这只在我将这一行
cur=“${COMP\u WORDS[COMP\u CWORD]}”
放在
\u get\u COMP\u WORDS\u by_ref-n:cur
之前时起到了作用,如果您也使用了prev,您可以将其添加到末尾
\u获取\u comp\u words\u by\u ref-n:cur prev
当我有不明确的补全并按tab键两次时,根据使用此解决方案时键入的内容,我会得到不正确的建议。请参阅
/etc/bash_completion
的内容,该内容在
\uu ltrim\u colon_completions
的标题注释中说明:“首选的解决方案是从.bashrc中的COMP_分词符中删除冒号(:)”如果COMP_分词符被修剪,ssh的bash完成如何中断?我想ssh的自动完成功能可以在这两种情况下都正常工作。
$ echo $BASH_VERSION
4.2.10(1)-release