zshシェルのオートコンプリート、関数から返されたファイル、ランダムな文字列をオートコンプリートする方法

zshシェルのオートコンプリート、関数から返されたファイル、ランダムな文字列をオートコンプリートする方法

たとえば、rcloneコマンドを自動補完し、同時にファイル名に対して同じ操作を実行するようにrclone copy gdr <tab>zshを設定したいとします。rclone copy gdrive-johnsmith


rclone には zsh オートコンプリートファイルを生成するコマンドが提供されますが、そのファイルは (上記のように) リモートディレクトリ名をオートコンプリートせず、 、 のようなgdrive-johnsmith:コマンドのみオートコンプリートします。生成されたファイルを開いたが、zshで「正しい方法」ファイルと一緒にリモート名を一覧表示する方法(リストが利用可能)を一生にわかりません(copylistremotesauthorizerclone listremotes解析しない:血)。とにかく、私はついに放棄してこれをしましたが、今私の_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

など...

とにかくzshに方法はありますか?

  • A)_files関数を使用するか、rcloneリモートディレクトリを自動補完するためにスペースバーを押しても中断されない関数を使用しますか?
  • B)Aが不可能な場合、少なくとも通常のディレクトリとrcloneディレクトリを(視覚的に)分離する方法はありますか?

ZSHバージョンは5.1.1、オペレーティングシステムはKDEネオン5.11、oh-my-zshもインストールされています。

ベストアンサー1

~からReddit:

_alternativesで実行できるアクションには、ディレクトリとrcloneリモートの2種類があります。たとえば、次のようになります。

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

_arguments compaddオプションを渡さないようにするには、_alternativeの前のスペースが重要です。

視覚的に区別されるかどうかはスタイル設定によって異なります。 oh-my-zshがこれを行うことができるようですが、そうでない場合は、次のことを試してください。

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

ありがとうございます /u/okapi-a!

おすすめ記事