Gerenciando caracteres finais usando o preenchimento automático de zsh

2

Estou tentando criar um arquivo de conclusão autoloaded para zsh. Para fazer isso, adicionei um arquivo _myprog em uma pasta que está no meu fpath.

Este arquivo é mais ou menos assim:

#compdef myprog
_myprog () {
    local cmd
    if (( CURRENT > 2)); then
        cmd=${words[2]}
        curcontext="${curcontext%:*:*}:myprog-$cmd"
        (( CURRENT-- ))
        shift words
        case "${cmd}" in
          list|ls)
            _arguments : "--limit[Max depth]" "--folders[Print flat list of folders]"
            _describe -t commands "myprog list" subcommands
          ;;
          insert)
            _arguments : "--force[Overwrite file]" "--append[Append to existing data]"
            _describe -t commands "myprog insert" subcommands
            _myprog_complete_folders
          ;;
        esac
    else
        local -a subcommands
        subcommands=(
          "insert:Insert a new file"
          "list:List existing files"
        )
        _describe -t command 'myprog' subcommands
        _arguments : "--yes[Assume yes]" 
        _myprog_complete_files
    fi
}

_myprog_complete_files () {
    _values 'files' $(myprog ls)
}

_myprog_complete_folders () {
    _values 'folders' $(myprog ls --folders)
}

_myprog

Então, meu programa tem dois cenários onde eu quero o preenchimento automático:

  1. Quando usado sem subcomando, gostaria de especificar um caminho em um local remoto. Isso é feito pela função _myprog_complete_files graças à função _value . A lista de arquivos é fornecida executando myprog ls , que imprime cada arquivo remoto em uma nova linha.

  2. Ao inserir um novo arquivo remoto, eu gostaria de poder preencher automaticamente o nome das pastas, o que é feito na função _myprog_complete_folders using _value também, mas desta vez a lista de pastas é gerada usando myprog ls --folder , que apenas imprime pastas.

Até aí tudo bem ... Exceção de que zsh está inserindo um espaço após o nome da pasta quando estou usando <tab><tab> para exibir a lista de valores e estou tentando digitar o nome do arquivo após o nome da pasta.

Por exemplo:

$ myprog insert web<tab><tab><tab>
 -- folders --
web/                          web/foo/                web/bar/

é suposto para selecionar web/foo e efetivamente faz isso e autocomplete para myprog insert web/foo/  , mas observe o espaço à direita! Então, se eu estou tentando digitar diretamente o nome do arquivo que eu quero inserir uma vez que eu selecionei a pasta que eu queria usando <tab> , digamos que eu quero chamá-lo de baz , estou terminando com myprog insert web/foo/ baz que não é meu objetivo.

Eu tentei navegar pelo zsh doc sem sucesso. Por exemplo, tentei definir zstyle ':completion::complete:myprog-insert:' add-space false sem sucesso, tanto no meu .zshrc quanto no meu arquivo _myprog . Eu não conseguia nem ver a diferença quando configurava ou não.

Acredito que esteja faltando alguma coisa, já que parece ser um recurso desejável poder digitar diretamente após o preenchimento automático, a fim de especificar um parâmetro ou algo assim.

    
por Lery 16.11.2018 / 20:55

1 resposta

2

O código add-space em $fpath[-1]/_expand parece não estar envolvido com sua conclusão via _values ; isso pode ser verificado definindo add-space como false em todos os lugares ou chamando _complete_debug e vendo qual código a conclusão passou:

% bindkey -M viins "^t" _complete_debug
% foo 
Trace output left in /tmp/zsh438foo2 (up-history to view)

Uma solução é usar o recurso -s ... de _values , que pode opcionalmente inserir um separador normalmente usado para unir vários valores e desativar esse recurso se o separador tiver sido usado:

#compdef foo
local curcontext="$curcontext" state line

choices=(aaa bbb ccc)

_arguments '1:dir:->folders' && return 0

case "$state" in
  folders)
    if ! compset -P '*/'; then
      _values -s / folders $choices
    fi
  ;;
esac

O que em uma guia foo a deve acrescentar uma barra, e como o / agora aparece, o teste compset deve impedir conclusões adicionais.

    
por 17.11.2018 / 16:31