zsh shell autocomplete, como autocompletar os arquivos e as cadeias arbitrárias retornadas de uma função

1

Estou tentando configurar o zsh para que ele complete automaticamente meus comandos rclone, por exemplo, rclone copy gdr <tab> e se torne rclone copy gdrive-johnsmith , além de fazer a mesma coisa com nomes de arquivos.

O rclone veio com um comando para gerar um arquivo de preenchimento automático de zsh, mas o arquivo não preencheu automaticamente nomes de diretório remotos (como gdrive-johnsmith: acima), apenas os comandos copy , listremotes e authorize . Eu abri o arquivo gerado e não poderia para a vida de mim descobrir como fazer lista zsh os nomes remotos (que eu posso obter uma lista de usando rclone listremotes ) e os arquivos juntos "a maneira correta" ( sem ls de análise : P). De qualquer forma, acabei desistindo e fazendo exatamente isso e agora meu arquivo _rclone é algo como isto:

#compdef rclone

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

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

O arquivo inteiro é como 38 linhas, mas eu não acho que haja nada relevante lá (eu posso postar o resto se necessário). A linha "_argumentos" costumava ficar assim:

_arguments '*: :_files'

antes de alterá-lo para listar os arquivos remotos e os arquivos no cwd. Como eu disse acima, eu gostaria de uma maneira de poder usar _files. Minha abordagem atual é feia, quebra sempre que os nomes de arquivos ou pastas têm um espaço, porque o zsh é dividido, e agrupa tudo e fica horrível:

 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 ...

De qualquer forma, existe uma maneira de, em zsh:

  • A) Use a função _files ou qualquer coisa que não quebre sempre que eu pressionar a barra de espaço para autocompletar diretórios remotos do rclone?
  • B) Se A não for possível, existe pelo menos uma maneira de (visualmente) separar os diretórios normais e clone?

A versão do ZSH é 5.1.1, o SO é o KDE neon 5.11, o oh-my-zsh também é instalado.

    
por Matias K 12.11.2017 / 23:14

1 resposta

1

De reddit :

You can use _alternative to complete two sorts of things such as directories and rclone remotes. For example, something like:

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

The space before _alternative is important here to avoid _arguments passing compadd options to it.

Whether they are visually separated depends on your style settings. I think oh-my-zsh does this for you but if not, try the following:

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

Obrigado ao / u / okapi-a!

    
por 13.11.2017 / 18:35