Bash 补全在单词后附加一个空格 - 我怎样才能阻止这个?

Bash 补全在单词后附加一个空格 - 我怎样才能阻止这个?

我正在为 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 不要在行尾完成的单词后添加空格(默认)。

相关内容