zsh shell 自动完成,如何自动完成文件和从函数返回的任意字符串

zsh shell 自动完成,如何自动完成文件和从函数返回的任意字符串

例如,我正在尝试设置 zsh,以便它自动完成我的 rclone 命令,rclone copy gdr <tab>并且它rclone copy gdrive-johnsmith同时对文件名执行相同的操作。


rclone 确实附带了一个生成 zsh 自动完成文件的命令,但该文件没有自动完成远程目录名称(如上),只是诸如、和 之gdrive-johnsmith:类的命令。我打开了生成的文件,但我一生都无法弄清楚如何使 zsh 列出远程名称(我可以获取使用列表)和文件一起“以正确的方式”(copylistremotesauthorizerclone listremotes没有解析 ls:P)。不管怎样,我最终放弃了并这样做,现在我的 _rclone 文件看起来像这样:

#compdef rclone

_arguments \
    '1: :->level1' \
    '2: :->level2' \
    '3: :($(rclone listremotes) $(ls))'

_arguments '*: :($(rclone listremotes) $(ls))'

整个文件大约有 38 行,但我认为其中没有任何相关内容(如果需要,我可以发布其余内容)。 “_arguments”行过去看起来像这样:

_arguments '*: :_files'

在我将其更改为列出 cwd 中的遥控器和文件之前。就像我上面说的,我想要一种能够使用 _files 的方法。我当前的方法很丑陋,只要文件或文件夹名称有空格就会中断,因为 zsh 将它们分开,并将所有内容组合在一起,看起来很糟糕:

 17:43:06  /usr/share/zsh/vendor-completions
 » rclone copy
_bootctl                   gdrive-fakeName:           _rclone
box-fakeName:              _hostnamectl               _sd_hosts_or_user_at_host
_busctl                    _journalctl                _sd_outputmodes
_curl                      _localectl                 _sd_unit_files
dropbox-google-fakeName:   _loginctl                  _systemctl

ETC...

无论如何,有没有办法在 zsh 中:

  • A) 使用 _files 函数或任何在我按空格键时不会中断的函数来自动完成 rclone 远程目录?
  • B)如果 A 不可能,是否至少有一种方法(视觉上)分离普通目录和 rclone 目录?

ZSH版本是5.1.1,操作系统是KDE neon 5.11,也安装了oh-my-zsh。

答案1

红迪特

您可以使用 _alternative 完成两类事情,例如目录和 rclone 遥控器。例如,类似:

_arguments \
  '3: : _alternative
    "files:file:_files"
    "remotes:remote:($(rclone listremotes))"'

_alternative 之前的空格在这里很重要,可以避免 _arguments 将 compadd 选项传递给它。

它们是否在视觉上分开取决于您的样式设置。我认为 oh-my-zsh 可以为您做到这一点,但如果没有,请尝试以下操作:

zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format '%B%d%b'

感谢 /u/okapi-a!

相关内容