Por que um valor '-' (hífen) no estilo “tag-order” impede a correspondência da tag “executáveis” mesmo que essa tag seja explicitamente especificada?

4

Com o código abaixo, tudo funciona conforme o esperado:

  • Quando escrevo c e clico na tecla TAB , obtenho as conclusões apropriadas na ordem correta.

  • Quandoescrevo./ecliconateclaTAB,obtenhoaconclusãodatagexecutables.

# Always use menu selection when using unambiguous completions.
zstyle ':completion:*:*:*:*:*' menu 'select'

# Show only completions.
zstyle ':completion:*:*:*:*:*' completer _complete

# Group name becomes the name of the matching tag.
zstyle ':completion:*:*:*:*:*' group-name ''

# Configure the order of tag matching as well as their descriptions.
zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
          )
'

# Configure the order in which completion groups will be shown.
zstyle ':completion:*:*:-command-:*:*' group-order 'Executables' 'Builtins' 'Commands' 'Aliases' 'Functions' 'Variables' 'Keywords'

# Configure the format for each group/tag description.
zstyle ':completion:*:*:*:*:descriptions' format $'%{\e[0;38;2;0;0;0;48;2;200;150;0m%} %d %{\e[0;38;2;200;150;0;48;2;0;0;0m%}%{\e[0m%}'

# Initialize completion system.
autoload -Uz compinit && compinit

No entanto, se as tags que eu especifique não produzirem nenhuma conclusão, outras tags também serão testadas.

A maneira mais fácil de provar isso é excluir a tag functions de tag-order style:

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
          )
'

e, em seguida, crie duas funções com um prefixo exclusivo:

function unique_prefix_A() { }
function unique_prefix_B() { }

Agora, quando escrevo unique_prefix_ e clico na tecla TAB , não espero ver nada, pois functions tag foi removido de tag-order .
No entanto, como Executables , Builtins , Commands , Aliases , Variables e Keywords não forneceram nenhuma conclusão, zsh tentará corresponder, por padrão, a outras tags, ou seja, as excluídas functions tag, para tentar dar alguma conclusão.

Por causa disso, as funções unique_prefix_A e unique_prefix_B serão sugeridas:

Eunãogostodessecomportamentoequerolimitarapesquisaapenasatagsqueeuespecifiqueiexplicitamente.

Omanualdoestilo tag-order sugere uma solução simples:

- If any value consists of only a hyphen, then only the tags specified in the other values are generated. Normally all tags not explicitly selected are tried last if the specified tags fail to generate any matches. This means that a single value consisting only of a single hyphen turns off completion.

Aplicando a solução:

# Configure the order of tag matching as well as their descriptions.
zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords"
           "-"
          )
'

O comportamento atual é:

  • Quando escrevo c e clico na tecla TAB , obtenho as conclusões apropriadas na ordem correta.

    )

  • Quandoescrevo./ecliconateclaTAB,nãoobtenhonada.

Por que agora apenas a tag executables não está funcionando?

Como posso consertar e obter o comportamento desejado?

    
por Iskustvo 05.05.2018 / 06:56

2 respostas

2

A tag executable chama _files -g '*(-*) neste caso. Então _files chama mais _tags , então seria necessário especificar essas tags implicitamente especificadas nas funções de conclusão , também.

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            globbed-files directories"
           "-"
          )
'

Seria útil adicionar globbed-files e directories neste caso:

% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 16 root root 69632 May 18 15:27 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
directory/        executable-file*

Mas na configuração acima, diretórios e arquivos executáveis locais entrarão no mesmo grupo "Executável". Se gostaríamos de fazer "diretórios" entrar em outros grupos, poderíamos especificar o file-patterns diretamente e use assim:

zstyle ':completion:*:*:-command-:*:*' file-patterns \
 '*(#q-*):executables:Executables *(-/):directories:Directories'

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            directories:Directories"
            -
          )
'

No exemplo abaixo, "diretório" e "arquivo executável" estão nos grupos separados:

% ls -al
total 80
drwxr-xr-x  3 t    t     4096 May 18 08:27 .
drwxrwxrwt 15 root root 69632 May 18 15:24 ..
drwxr-xr-x  2 t    t     4096 May 18 08:27 directory
-rwxr-xr-x  1 t    t        0 May 18 08:27 executable-file
-rw-r--r--  1 t    t        0 May 18 08:27 test
% ./<TAB>
Executables
executable-file*
Directories
directory/

Abaixo está o menor exemplo de .zshrc:

autoload -Uz compinit && compinit
zstyle ':completion:*:*:*:*:*' group-name ''
zstyle ':completion:*:descriptions' format '%B%F{black}%d%f%b'
zstyle ':completion:*:*:*:*:*' menu 'select'

# This comment out block is just for a reminder of my answer's first half.
# zstyle -e ':completion:*:*:-command-:*:*' tag-order '
#       reply=(
#                    "executables:Executables:Executables
#                       builtins:Builtins:Builtins
#                       commands:Commands:Commands
#                       aliases:Aliases:Aliases
#                       functions:Functions:Functions
#                       parameters:Variables:Variables
#                       reserved-words:Keywords:Keywords
#                       globbed-files directories"
#                    "-"
#                   )
# '

zstyle ':completion:*:*:-command-:*:*' file-patterns \
 '*(#q-*):executables:Executables *(-/):directories:Directories'

zstyle -e ':completion:*:*:-command-:*:*' tag-order '
    reply=(
           "executables:Executables:Executables
            builtins:Builtins:Builtins
            commands:Commands:Commands
            aliases:Aliases:Aliases
            functions:Functions:Functions
            parameters:Variables:Variables
            reserved-words:Keywords:Keywords
            directories:Directories"
            -
          )
'

Atualizado: comente o bloqueio desnecessário.

    
por 18.05.2018 / 06:12
1

Eu acho que o problema não é apenas o (hífen), mas o quão específico você é sobre as regras de autocompletar.

Eu executei alguns testes, por exemplo, removendo 'Variables' da tag de pedido e criando (TEST, LOLO) no shell.

Depois disso, experimentei o preenchimento automático esperando não ver nada, mas, em vez disso, sendo listado em "Variáveis", eles apareceram como "Parâmetros".

Esse comportamento me fez pensar sobre o UDEV e como certos sistemas exigem regras bastante específicas para determinado comportamento.

O seu grupo de correspondência de tags está ok e funciona como pretendido (no cenário ./), mas uma coisa é executar:

./<TAB>

e uma coisa totalmente diferente é autocompletar algo como:

unique_prefix<TAB>

Por isso, não importa quantos hífens você adicionar a esse grupo, isso não funcionará porque é uma execução de regra diferente.

Em vez de lidar com isso, procurei um exemplo para evitar especificamente funções, e esse trecho funcionou muito bem ( verifique a origem ):

One use of these features is to try one tag more than once, setting other styles differently on each attempt, but still to use all the other tags without having to repeat them all. For example, to make completion of function names in command position ignore all the completion functions starting with an underscore the first time completion is tried:

(alterei isso para corresponder a todas as funções):

ignored-patterns ’_*’   

para isso:

ignored-patterns ’*’

Nas regras:

zstyle ’:completion:*:*:-command-:*:*’ tag-order \
    ’functions:-non-comp *’ functions
zstyle ’:completion:*:functions-non-comp’ \
    ignored-patterns ’*’

E quando eu tentei autocompletar: unique_prefix (nada aconteceu) e a execução ./ funcionou bem.

Então, a resposta é: você precisará de regras específicas para cada cenário diferente, lembrando que qualquer padrão pode ser interpretado de acordo com as regras que você definiu.

    
por 17.05.2018 / 18:51

Tags