zsh-completion: Completando duas partes de um argumento, separadas por dois pontos

3

Eu gostaria de configurar o zsh completion para um comando que tenha um único argumento no formato scheme:parameter .

Suponha que eu tenha comandos que possam retornar todos os esquemas possíveis e todos os parâmetros possíveis. Qual é a função de conclusão que completa da lista de esquemas até que os dois-pontos sejam digitados e, em seguida, sejam concluídos a partir da lista de parâmetros?

A conclusão de uma única lista é simples, algo como:

function _prmt() { _alternative 'args:args:($(prmt --completions))' }

mas não sei como reconhecer um separador.

    
por jogloran 23.10.2015 / 18:26

1 resposta

2

Uma maneira é procurar o : e se comportar como se fosse diferente:

#compdef foo
# put this file into a $fpath directory (typically one you create
# and prefix to that array) then 'rm ~/.zcompdump && exec zsh'
# until work-making (a temporary 'print -z "foo "' in your .zshrc
# may also speed debugging, as then you can go directly to the
# mashing-of-tab stage)

local curcontext="$curcontext" state line
local suf
typeset -A opt_args

_arguments -C -s \
  '1: :->dofoo' \
  && return 0

case "$state" in
  dofoo)
    if compset -P '*[:]'; then
      _values "parameters" $(_call_program getparam ls /)
    else
      if compset -S '[:]*'; then
        suf=()
      else
        suf=( -qS ':' )
      fi
      _wanted "schemes" expl "scheme" compadd $suf[@] $(_call_program getscheme ls /)
    fi
  ;;
esac

Os ls / bits precisarão ser seus comandos apropriados, talvez com complicações adicionais para dividir adequadamente a saída em uma lista, dependendo do que esses programas emitem, etc.

Como aprendi isso: principalmente cd $fpath[-1] e, em seguida, bisbilhotando especialmente as _chown e _users completions, que têm conclusão para : handing. Mais informações .

    
por 23.10.2015 / 19:12