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?

3

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 / 17:33

1 resposta

1

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 19.05.2018 / 01:02