gpt4 book ai didi

zsh - 当程序有子命令时完成

转载 作者:行者123 更新时间:2023-12-01 19:19:52 25 4
gpt4 key购买 nike

我编写了一个命令行工具,它使用子命令,非常类似于 Mercurial、Git、Subversion 等,其一般用法是:

>myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS]

例如

>myapp --verbose speak --voice=samantha --quickly "hello there"

我现在正在为其构建 Zsh 补全,但很快发现它是一个非常复杂的野兽。我看过 _hg_git 完成,但它们非常复杂且方法不同(我很难理解它们),但两者似乎都处理每个子-单独命令。

有谁知道是否有办法使用内置函数(_arguments_valuespick_variant 等)来处理以下概念:正确的子命令,包括正确处理常规选项和子命令特定选项?或者最好的方法是手动处理常规选项和子命令?

非常感谢一个点头的例子。

非常感谢。

最佳答案

zsh 编写完成脚本可能相当困难。最好的选择是使用现有的作为指导。 Git 的内容对于初学者来说太多了。您可以使用此存储库:

https://github.com/zsh-users/zsh-completions

对于你的问题,你使用了状态的概念。您在列表中定义子命令,然后通过 $state 识别您所在的命令。然后为每个命令定义选项。您可以在 play 的完成脚本中看到这一点。简化版本如下:

_play() {
local ret=1

_arguments -C \
'1: :_play_cmds' \
'*::arg:->args' \
&& ret=0

case $state in
(args)
case $line[1] in
(build-module|list-modules|lm|check|id)
_message 'no more arguments' && ret=0
;;
(dependencies|deps)
_arguments \
'1:: :_play_apps' \
'(--debug)--debug[Debug mode (even more informations logged than in verbose mode)]' \
'(--jpda)--jpda[Listen for JPDA connection. The process will suspended until a client is plugged to the JPDA port.]' \
'(--sync)--sync[Keep lib/ and modules/ directory synced. Delete unknow dependencies.]' \
'(--verbose)--verbose[Verbose Mode]' \
&& ret=0
;;
esac
esac

(如果您要粘贴此内容,请使用原始来源,因为这不起作用)。

看起来令人畏惧,但总体思路并不复杂:

  • 子命令排在第一位(_play_cmds 是子命令列表,其中每个子命令都有说明)。
  • 然后是争论。这些参数是根据您选择的子命令构建的。请注意,如果多个子命令共享参数,则可以将它们分组。

使用man zshcompsys,您可以找到有关整个系统的更多信息,尽管它有点密集。

关于zsh - 当程序有子命令时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com