zsh shell自動完成,如何自動完成從函式返回的文件和任意字元串
例如,我正在嘗試設置 zsh 以便它自動完成我的 rclone 命令,同時
rclone copy gdr <tab>
它rclone copy gdrive-johnsmith
也會對文件名執行相同的操作。rclone 確實附帶了一個生成 zsh 自動完成文件的命令,但該文件沒有自動完成遠端目錄名稱(
gdrive-johnsmith:
如上),只是像copy
,listremotes
和authorize
. 我打開了生成的文件,但我終生無法弄清楚如何讓 zsh 列出遠端名稱(我可以得到一個使用列表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。
來自reddit:
您可以使用 _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!