为什么仅将字符串添加到 COMPREPLY 会导致制表符补全不正确匹配?

问题描述 投票:0回答:1

我目前正在开发路径快捷方式管理器 CLI,它使用户能够使用短标签缩写路径。为了使这些标签易于使用,我希望自定义 bash 命令通过按 Tab 键自动完成标签。 这是我的解决方案的大致结构:

function _custom_command(){
    # load labels into COMPREPLY
}
complete -F _custom_command custom_command

目前,我的 完成功能 将每个现有标签加载到

COMPREPLY
中,这意味着这些标签应该与选项卡完成相匹配。 在这种情况下,制表符补全功能无法正常工作。 即使我输入标签的前缀作为自定义命令的第一个参数,它也永远不会被标签匹配/替换。

可以通过以下简单代码重现此行为:

function hello(){
    echo "hello"
}

function _hello(){
    COMPREPLY=("hey")
    COMPREPLY+=("cool")
}

complete -F _hello hello

这似乎是问题的根源,因为向 COMPREPLY 添加两个字符串会导致与上面指定的相同行为。

例如:

$hello c[Tab]
cool hey

我是否缺少

complete
的任何选项/规范,或者我对该命令的使用是否有错误? 也请随意留下对此问题的任何反馈,因为这是我的第一个问题。 谢谢你:)

bash tab-completion
1个回答
0
投票

来自可编程完成的文档:

生成这些匹配项后,将调用使用 -F 和 -C 选项指定的任何 shell 函数或命令。调用命令或函数时,将如上所述为 COMP_LINE、COMP_POINT、COMP_KEY 和 COMP_TYPE 变量分配值(请参阅 Bash 变量)。如果调用 shell 函数,还会设置 COMP_WORDS 和 COMP_CWORD 变量。调用函数或命令时,第一个参数 ($1) 是要完成其参数的命令的名称,第二个参数 ($2) 是要完成的单词,第三个参数 ($3) 是要完成的单词之前的单词。当前命令行上正在完成的单词。 不会根据正在完成的单词对生成的完成进行过滤;函数或命令在生成匹配方面具有完全的自由。

因此您输入的任何内容

COMPREPLY
都将用作可能的完成。如果您只需要以用户输入的内容开头的单词,则该函数应该自行进行过滤。正在完成的单词将在
$2
中,您可以使用它。

© www.soinside.com 2019 - 2024. All rights reserved.