当我实现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
答案 0 :(得分:23)
修改完成脚本中的$COMP_WORDBREAKS
不是推荐的方式(因为它是一个全局变量,它可能会影响其他完成脚本的行为 - 例如ssh)。
但是,bash完成提供了一些辅助方法,您可以使用这些方法来实现目标。
在完成单词中处理非破坏字符的推荐方法是使用两种辅助方法:
_get_comp_words_by_ref
选项的-n 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
。看看里面的内容,阅读每种方法的详细描述,并发现更多辅助方法。