我正在尝试创建一个与鱼一起使用的自动完成脚本; 我正在为同一个程序移植一个bash完成脚本.
该方案有三个顶级的命令,比如foo,bar和baz每个有一些子命令,只说a b和c每个.
我所看到的是,顶层命令自动完成好了,所以如果我型f我得到foo自动完成,但随后如果我再次按Tab键,看看它的子命令是的,我看到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
Run Code Online (Sandbox Code Playgroud)
这是有道理的,你只能使用完成,如果命令有一个arg,脚本本身; 如果你使用它作为条件(-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 ]
# wtf, this is always false? it 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"
Run Code Online (Sandbox Code Playgroud)
任何关于如何使这项工作的建议非常感谢.
我想你知道这return 0意味着真的,这return 1意味着错误?
从您的输出看起来您的needs_command功能无法正常工作,因此即使它有子命令也显示bar.
我刚刚尝试了以下代码,它按预期工作:
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
Run Code Online (Sandbox Code Playgroud)
完成后输出:
? prog <Tab>
bar baz foo
? prog foo <Tab>
a b c
? prog foo
Run Code Online (Sandbox Code Playgroud)
这是你想要的吗?