我正在尝试为内部工具编写一些补全。我们就这样称呼它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