使用子命令创建自动完成脚本

时间:2013-05-20 20:28:11

标签: fish

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

该程序有三个顶级命令,比如foobarbaz,每个命令都有一些子命令,只需说a b和{每个{1}}。

我所看到的是顶级命令自动完成正常,所以如果我输入c我正在f自动完成,但是如果我再次点击标签看看它是什么子命令是,我看到foofoobarbazab,它应该只是{{1} },ca

我使用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

非常感谢任何关于如何使这项工作的建议。

1 个答案:

答案 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

这是你想要的吗?