我正在尝试创建一个用于鱼的自动完成脚本;我正在移植同一程序的bash完成脚本。
该程序有三个顶级命令,比如foo
,bar
和baz
,每个命令都有一些子命令,只需说a
b
和{每个{1}}。
我所看到的是顶级命令自动完成正常,所以如果我输入c
我正在f
自动完成,但是如果我再次点击标签看看它是什么子命令是,我看到foo
,foo
,bar
,baz
,a
,b
,它应该只是{{1} },c
,a
我使用git completion script作为参考,因为它似乎正常。我也使用git flow script作为参考。
我认为这是在git完成脚本中通过以下方式处理的:
b
哪个有意义,如果命令只有一个arg,脚本本身就可以使用完成;如果您将此作为条件(c
)用于完成顶级命令的调用,我认为正确的事情会发生。
然而,我所看到的并非如此。我将该功能复制到我的脚本中,适当地更改了“git”,并且没有运气。
修剪后的脚本如下:
function __fish_git_needs_command
set cmd (commandline -opc)
if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]
return 0
end
return 1
end
非常感谢任何关于如何使这项工作的建议。
答案 0 :(得分:8)
我猜你知道return 0
表示正确,而return 1
表示错误?
从您的输出中看起来您的needs_command
功能无法正常工作,因此即使它有子命令也会显示条形。
我刚刚尝试了以下代码,它按预期工作:
function __fish_prog_needs_command
set cmd (commandline -opc)
if [ (count $cmd) -eq 1 -a $cmd[1] = 'prog' ]
return 0
end
return 1
end
function __fish_prog_using_command
set cmd (commandline -opc)
if [ (count $cmd) -gt 1 ]
if [ $argv[1] = $cmd[2] ]
return 0
end
end
return 1
end
complete -f -c prog -n '__fish_prog_needs_command' -a bar
complete -f -c prog -n '__fish_prog_needs_command' -a foo
complete -f -c prog -n '__fish_prog_using_command foo' -a a
complete -f -c prog -n '__fish_prog_using_command foo' -a b
complete -f -c prog -n '__fish_prog_using_command foo' -a c
complete -f -c prog -n '__fish_prog_needs_command' -a baz
完成后输出:
➤ prog <Tab>
bar baz foo
➤ prog foo <Tab>
a b c
➤ prog foo
这是你想要的吗?