例如,我正在尝试设置 zsh,以便它自动完成我的 rclone 命令,rclone copy gdr <tab>
并且它rclone copy gdrive-johnsmith
同时对文件名执行相同的操作。
rclone 确实附带了一个生成 zsh 自动完成文件的命令,但该文件没有自动完成远程目录名称(如上),只是诸如、和 之gdrive-johnsmith:
类的命令。我打开了生成的文件,但我一生都无法弄清楚如何使 zsh 列出远程名称(我可以获取使用列表)和文件一起“以正确的方式”(copy
listremotes
authorize
rclone 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!