Fish Completions - 如何防止文件完成?

Fish Completions - 如何防止文件完成?

我正在尝试为内部工具编写一些补全。我们就这样称呼它thetool

许多命令thetool不将“文件”作为参数。我想法--no-files和/或--exclusive会为我做这件事,但我似乎无法让它发挥作用。

换句话说,我如何编写补全,以便以下命令在选项卡补全中显示文件

$ thetool file-command *hit-tab*

而以下命令不会在选项卡补全中显示文件

$ thetool non-file-command *hit-tab*

让我们尝试一个玩具示例:

$ function thetool
    echo $argv
  end
$ complete --command thetool --no-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "file-command" --description "file-command"
$ complete --command thetool --no-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "non-file-command" --description "non-file-command"
$ complete --command thetool
complete --no-files thetool -d non-file-command -a non-file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'
complete --no-files thetool -d file-command -a file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'

现在尝试完成:

$ thetool *hit-tab*
file-command  (file-command)  non-file-command  (non-file-command)

到目前为止看起来不错...

$ thetool non-file-command *hit-tab*
bin/                  dev.yml       Judgment.lock  README.md              TODO.md           
completion_test.fish  exe/          lib/           shipit.production.yml  vendor/           
completion_test.zsh   Gemfile       linters/       sorbet/                zsh_completions.sh
coverage/             Gemfile.lock  Rakefile       test/                  

看!这些文件建议在那里做什么?

让我们再试一次:

$ complete --command thetool --force-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "file-command" --erase
$ complete --command thetool --force-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "file-command"
$ complete --command thetool --no-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "non-file-command"
$ complete --command thetool
complete --no-files thetool -a non-file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'
complete --force-files thetool -a file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'
$ thetool *hit-tab*
bin/                  dev.yml       Gemfile.lock   non-file-command       sorbet/  zsh_completions.sh
completion_test.fish  exe/          Judgment.lock  Rakefile               test/    
completion_test.zsh   file-command  lib/           README.md              TODO.md  
coverage/             Gemfile       linters/       shipit.production.yml  vendor/  

arrg 有人可以帮助我了解发生了什么事以及我做错了什么吗?

答案1

如果 Fish 看到了non-file-command.

让我们来看看它们:

complete --command thetool --no-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "file-command" --description "file-command"

可见non-file-command,条件为假。

complete --command thetool --no-files --condition "not __fish_seen_subcommand_from file-command non-file-command" --arguments "non-file-command" --description "non-file-command"

可见non-file-command,条件为假。

complete --command thetool

这没有任何作用。

complete --no-files thetool -d non-file-command -a non-file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'

可见non-file-command,条件为假。

complete --no-files thetool -d file-command -a file-command -n 'not __fish_seen_subcommand_from file-command non-file-command'

可见non-file-command,条件为假。

禁用文件的条件不成立,因此我们默认启用它们。如果non-file-command给出的话,没有任何东西告诉它禁用文件。

添加

complete --command thetool --no-files --condition " __fish_seen_subcommand_from non-file-command"

它会起作用的。

或者,如果你有很多东西获取文件和一些文件,您可以添加

complete --command thetool --no-files

这将禁用文件总是(它没有条件,所以只要你完成,它总是正确的thetool),然后对那些有条件的情况强制归档,例如

complete --command thetool --condition "__fish_seen_subcommand_from file-command" --force-files

相关内容