14

我正在尝试创建一个用于鱼的自动完成脚本;我正在为同一个程序移植一个 bash 完成脚本。

该程序具有三个顶级命令,例如foobar和 ,baz并且每个都有一些子命令,只需说a bc

我所看到的是顶级命令自动完成正常,所以如果我输入ffoo会自动完成,但是如果我再次点击选项卡以查看它的子命令是什么,我会看到foo, bar, baz, a,bc它应该只是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" 

非常感谢有关如何进行这项工作的任何建议。

4

1 回答 1

13

我想你知道这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

完成后的输出:

➤ prog <Tab>
bar  baz  foo
➤ prog foo <Tab>
a  b  c
➤ prog foo

这是你想要的吗?

于 2013-05-21T14:52:01.730 回答