zsh – 程序具有子命令时完成

前端之家收集整理的这篇文章主要介绍了zsh – 程序具有子命令时完成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个命令行工具,它使用的子命令非常像Mercurial,Git,Subversion& c,因为它的一般用法是:
  1. >myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS]

例如.

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

我现在正在构建Zsh完成的过程,但很快就发现它是一个非常复杂的野兽.我看过了_hg和_git的完成,但是它们的方法非常复杂和不同(我很难理解它们),但是它们似乎都分别处理每个子命令.

有没有人知道有没有使用内置函数(_arguments,_values,pick_variant& c.)来正确处理子命令的概念,包括适当地处理一般选项和子命令特定选项?或者最好的方法是手动处理一般选项和子命令?

一个肮脏的例子将非常感激.

非常感谢.

解决方法

你是正确的,为zsh写的完成脚本可能相当困难.你最好的办法是用现有的一个作为指导.对于初学者,imo来说,git的方法太多了.你可以使用这个repo:

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

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

  1. _play() {
  2. local ret=1
  3.  
  4. _arguments -C \
  5. '1: :_play_cmds' \
  6. '*::arg:->args' \
  7. && ret=0
  8.  
  9. case $state in
  10. (args)
  11. case $line[1] in
  12. (build-module|list-modules|lm|check|id)
  13. _message 'no more arguments' && ret=0
  14. ;;
  15. (dependencies|deps)
  16. _arguments \
  17. '1:: :_play_apps' \
  18. '(--debug)--debug[Debug mode (even more informations logged than in verbose mode)]' \
  19. '(--jpda)--jpda[Listen for JPDA connection. The process will suspended until a client is plugged to the JPDA port.]' \
  20. '(--sync)--sync[Keep lib/ and modules/ directory synced. Delete unknow dependencies.]' \
  21. '(--verbose)--verbose[Verbose Mode]' \
  22. && ret=0
  23. ;;
  24. esac
  25. esac

(如果要粘贴,请使用原始来源,因为这将不起作用).

看起来令人望而生畏,但一般的想法并不复杂.子命令首先出现(_play_cmds是一个子命令的列表,其中包含每个子命令的描述),然后来参数.参数是根据您选择的子命令构建的.请注意,如果共享参数,则可以对多个子命令进行分组.

与人zshcompsys,你可以找到更多关于整个系统的信息,虽然它有点密集.

猜你在找的Linux相关文章