我目前正在开发路径快捷方式管理器 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
的任何选项/规范,或者我对该命令的使用是否有错误?
也请随意留下对此问题的任何反馈,因为这是我的第一个问题。
谢谢你:)
来自可编程完成的文档:
生成这些匹配项后,将调用使用 -F 和 -C 选项指定的任何 shell 函数或命令。调用命令或函数时,将如上所述为 COMP_LINE、COMP_POINT、COMP_KEY 和 COMP_TYPE 变量分配值(请参阅 Bash 变量)。如果调用 shell 函数,还会设置 COMP_WORDS 和 COMP_CWORD 变量。调用函数或命令时,第一个参数 ($1) 是要完成其参数的命令的名称,第二个参数 ($2) 是要完成的单词,第三个参数 ($3) 是要完成的单词之前的单词。当前命令行上正在完成的单词。 不会根据正在完成的单词对生成的完成进行过滤;函数或命令在生成匹配方面具有完全的自由。
因此您输入的任何内容
COMPREPLY
都将用作可能的完成。如果您只需要以用户输入的内容开头的单词,则该函数应该自行进行过滤。正在完成的单词将在$2
中,您可以使用它。