Linux

zsh shell自動完成,如何自動完成從函式返回的文件和任意字元串

  • November 13, 2017

例如,我正在嘗試設置 zsh 以便它自動完成我的 rclone 命令,同時rclone copy gdr <tab>rclone copy gdrive-johnsmith也會對文件名執行相同的操作。


rclone 確實附帶了一個生成 zsh 自動完成文件的命令,但該文件沒有自動完成遠端目錄名稱(gdrive-johnsmith:如上),只是像copy,listremotesauthorize. 我打開了生成的文件,但我終生無法弄清楚如何讓 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!

引用自:https://unix.stackexchange.com/questions/404122