Relacionamento entre o script de conclusão customizado do zsh e a configuração do compsys / zstyle

2

Eu escrevi um script de conclusão simples para um comando cheat para que, ao usar cheat em um prompt, o zsh preencherá automaticamente os argumentos.
(obviamente) isso precisava ser configurado de uma maneira compatível com compinit / compsys:

arquivo

: ~/system/dev_resources/zsh_comp/_cheat

#compdef cheat

[bulk of code...]

# make call into compsys to provide completion!
_describe 'values' comp_cands_arr

use o script para zsh em ~/.zshrc :

fpath=(~/system/dev_resources/zsh_comp $fpath)
autoload -U ~/system/dev_resources/zsh_comp/*(:t)

O script de conclusão funciona bem - sem problemas.
Agora, simplesmente quero referenciar e configurar esse script de conclusão por meio do zstyle builtin.
A seção CONFIGURAÇÃO DO SISTEMA DE CONCLUSÃO em zsh documentação da compsys nos diz:

When completion is attempted somewhere on the command line the completion system begins building the context [...]
The fields are always in the order
.
:completion:function:completer:command:argument:tag

e

[completer] The completer currently active, the name of the function without the leading underscore and with other underscores converted to hyphens. A ‘completer’ is in overall control of how completion is to be performed;

A minha pergunta é: o meu script de conclusão do zsh _cheat considerou um "completer" na cadeia de contexto? ou seja, isso seria correto / aplicável?

:completion:function:cheat:command:argument:tag
                     ^^^^^

Parece ser aplicável, mas ao mesmo tempo o script _cheat não é formalmente definido como uma função shell, é apenas uma coleção de comandos ...

    
por the_velour_fog 17.03.2016 / 23:14

2 respostas

1

Seu arquivo _cheat faz definir uma função chamada _cheat . Você pode verificar isso exibindo o código da função ( echo $functions[_cheat] ). Quando uma função é autoloaded de um arquivo, o arquivo contém a função código, como se houvesse _cheat () { antes do conteúdo do arquivo e } após o conteúdo do arquivo. (Zsh também suporta o carregamento automático "ksh-style" onde o arquivo deve conter uma definição de função mais uma chamada para a própria função.)

A primeira linha mágica #compdef encontrada em um arquivo em $fpath quando o sistema de completação é inicializado equivale a chamar compdef _cheat cheat onde _cheat é o nome do arquivo (e função autoloaded) e cheat é o nome do comando para o qual esta função deve ser usada. A associação é registrada no array associativo _comps ( $_comps[cheat]=_cheat ).

O campo completer na zstyle string de contexto é o nome da função de conclusão com um sublinhado à esquerda removido.

    
por 18.03.2016 / 01:15
0

Em resposta à pergunta

is my zsh completion script _cheat considered a "completer" in the context string?

A resposta parece ser não
Se você usar ESC 2 , CTRL + x , h para descarregar a conclusão do zsh contexto

% cheat b                                                                                                                             
tags in context :completion::complete:cheat::
    values  (_describe _cheat)

Você pode ver que zsh considera que a terceira / completa posição pertence ao completador "complete" e que cheat está atribuída a quarta posição ou command .
É importante que este seja o comando cheat (o programa executável real) e não a função de conclusão _cheat , a função de conclusão _cheat
é um valor definido pelo zstyle builtin do zsh.

    
por 02.05.2016 / 01:39