Como posso definir a preferência de conclusão do zstyle para um alias do zsh?

1

Se eu tiver um executável - por exemplo, ~/bin/stuff no meu PATH , posso definir isso em .zshrc para que ele preencha automaticamente os arquivos de texto como argumentos do meu comando:

zstyle ':completion:*:*:stuff:*' file-patterns '*.txt:all-files' '*:all-files'

No entanto, se stuff for um alias - por exemplo, alias stuff=less , isso não funcionará mais - e o zsh fingirá que deve preencher automaticamente todos os arquivos, pois esse é o padrão.

Eu consultei os documentos aqui - Sistema de preenchimento do Zsh e não encontrei nada mais do que falar de como expandir um alias - que não é o que eu estou procurando.

Eu acho que os documentos dizem que o padrão de argumento para zstyle é ':completion:*:*:-command-:*:commands' , mas isso significa que a quarta seção deve ser um comando e não uma alias . Eu sempre assumi que eles eram mais ou menos intercambiáveis em zsh.

Quero dizer, posso criar um conjunto de executáveis de uma linha que apenas tenham o meu alias seguido por "$@" neles - mas isso não é elegante .

    
por Vidur 01.08.2018 / 13:48

1 resposta

1

Assumindo que a guia seja esmagada após stuff em ambos os casos

% ls
bar     foo.txt
% whence stuff
% alias stuff=less
% zstyle ':completion:*:*:stuff:*' file-patterns '*.txt:all-files'
% stuff
bar      foo.txt

um botão relevante de zshoptions(1) é

COMPLETE_ALIASES
    Prevents aliases on the command line from being internally sub-
    stituted before completion is attempted. The effect is to make
    the alias a distinct command for completion purposes.

então

% setopt COMPLETE_ALIASES
% stuff foo.txt

caso contrário, o alias já é outra coisa.

Para verificar os efeitos colaterais, devemos confirmar que essa alteração não interrompe a conclusão em aliases para os quais não há conclusão ou configuração de estilo,

% setopt COMPLETE_ALIASES
% whence foo
% unfunction _foo
unfunction: no such hash table element: _foo
% alias foo=ls
% foo (eval):1: command not found: _foo

com COMPLETE_ALIASES definido, talvez seja necessário configurar as conclusões para cada alias ou listar ou incluir os nomes de alias no compdef , por exemplo,

% compdef _ls foo
% foo
...

Por outro lado, acho que exec wrappers são bastante elegantes, já que eles podem ser chamados por exec(3) ou system(3) sem a necessidade de carregar um shell grande ou poluir o que deveria ser uma simples chamada de sistema com configuração de shell interativa.

    
por 01.08.2018 / 16:35