我正在尝试创建一个用于鱼的自动完成脚本;我正在为同一个程序移植一个 bash 完成脚本。
该程序具有三个顶级命令,例如foo
、bar
和 ,baz
并且每个都有一些子命令,只需说a
b
和c
。
我所看到的是顶级命令自动完成正常,所以如果我输入f
我foo
会自动完成,但是如果我再次点击选项卡以查看它的子命令是什么,我会看到foo
, bar
, baz
, a
,b
和c
它应该只是a
, b
,c
我使用git 完成脚本作为参考,因为它似乎工作正常。我也使用git flow 脚本作为参考。
我认为这是在 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
这是有道理的,如果命令只有一个参数,即脚本本身,则只能使用完成;如果您将其用作-n
调用完成顶级命令的条件(),我认为会发生正确的事情。
然而,我所看到的并非如此。我将该函数复制到我的脚本中,适当地更改了“git”,但没有任何运气。
精简后的脚本如下:
function __fish_prog_using_command
set cmd (commandline -opc)
set subcommands $argv
if [ (count $cmd) = (math (count $subcommands) + 1) ]
for i in (seq (count $subcommands))
if not test $subcommands[$i] = $cmd[(math $i + 1)]
return 1
end
end
return 0
end
return 1
end
function __fish_git_needs_command
set cmd (commandline -opc)
set startsWith (echo "$cmd[1]" | grep -E 'prog$')
# there's got to be a better way to do this regex, fish newb alert
if [ (count $cmd) = 1 ]
# Is this always false? Is this the problem?
if [ $cmd[1] -eq $cmd[1] ]
return 1
end
end
return 0
end
complete --no-files -c prog -a bar -n "__fish_git_needs_command"
complete --no-files -c prog -a foo -n "__fish_git_needs_command"
complete --no-files -c prog -a a -n "__fish_prog_using_command foo"
complete --no-files -c prog -a b -n "__fish_prog_using_command foo"
complete --no-files -c prog -a c -n "__fish_prog_using_command foo"
complete --no-files -c prog -a baz -n "__fish_git_needs_command"
非常感谢有关如何进行这项工作的任何建议。