我正在为 Bash 编写一个制表符补全脚本,使用 Python 来提供补全结果。我正在使用虚拟脚本来显示我遇到的问题,内容并不重要。
我有一个名为 的 Bash 脚本dothat
,其中包含以下代码:
var=$1
echo "You have chosen $var"
我还有一个为 创建制表符完成的脚本dothat
,称为dothat-completion.bash
:
_comp_func()
{
COMPREPLY=()
# Gets the output of a Python file and puts it into a variable
fruits=$(python fruit.py)
COMPREPLY=($(compgen -W "${fruits[*]}" -- $cur))
}
complete -F _comp_func dothat
以及(简单)内容fruit.py
:
print('fruit:', end='')
Python 脚本只是将字符串打印到 STDOUT,然后由 Bash 补全函数捕获该字符串,并用于生成制表符补全的可能匹配项。
现在,我想用这个脚本做的是,当我输入 时dothat <TAB>
,它将完成到dothat fruit:
,末尾没有空格。问题是,当我键入dothat
并按 Tab 时,它会完成为dothat fruit:
,并带有不需要的尾随空格。
我尝试将Python的内容更改为以下内容,并且所有结果都相同:
print('"fruit:"', end='')
print("'fruit:'", end='')
print('fruit:', end='')
print("fruit:", end='')
print("fruit: ", end='')
print("fruit: ", end='')
print('fruit')
甚至:
foo='fruit'
print(foo)
而我所有的尝试都是徒劳的,因为它们都达到了同样的结果。字符串上有 0 个、1 个还是 20 个空格并不重要:如果 Python 输出字符串fruit:
并将其反馈到 Bash 补全脚本中,compgen
则将决定fruit:
以空格补全。
这里有我错过的明显解决方案吗?对于 Bash 还是 Python?
答案1
这是找到完全匹配时的默认行为complete
,附加一个空格并允许进一步在该行中键入,表明该单词已完成。这里只有一个单词COMPREPLY
,所以当TAB你完成这个单词后。
要覆盖此默认行为,您可以使用-o nospace
.从man bashbuiltins
:
没有空间告诉 readline 不要在行尾完成的单词后添加空格(默认)。