我有一个自定义命令define
,可以从字典中获取单词定义。我想制作一个自动完成脚本来使用 中找到的单词列表来完成我想要定义的单词/usr/share/dict/words
。这是我到目前为止所拥有的:
自动完成脚本:/etc/bash_completion.d/define
_define()
{
dict='/usr/share/dict/words'
cur=${COMP_WORDS[COMP_CWORD]}
regex="^$cur*"
words=$(grep $regex $dict)
if [[ $cur != -* ]]
then
COMPREPLY=( $( compgen -W "$(echo $words)" $cur) )
else
COMPREPLY=()
fi
return 0
}
complete -F _define define
当我点击时,[tab][tab]
有时我会得到一个以键入的单词开头的单词列表,有时它只是删除最后一个字符。例如,当我这样做时,define wall [tab][tab]
我会得到define wal
,但如果我这样做,define wal [tab][tab]
我会得到一个单词列表。
为什么会发生这种情况?
答案1
事实证明,问题与补全单词列表中的单引号字符有关'
,我通过将grep
命令的正则表达式从 更改为 来^$cur*
修复它^$cur[^']*$
:
_define()
{
local dict='/usr/share/dict/words'
local cur=${COMP_WORDS[COMP_CWORD]}
local regex="^$cur[^']*$"
if [[ $cur == -* ]]
then
COMPREPLY=()
else
local WORDS="$( grep "$regex" $dict )"
COMPREPLY=( $(compgen -W "${WORDS}" -- $cur) )
fi
}
complete -F _define define