3

С кодом ниже все работает как положено:

  • Когда я пишу c и нажимаю клавишу TAB , я получаю соответствующие дополнения в правильном порядке.

    Образ

  • Когда я пишу ./ и нажимаю клавишу TAB , я получаю завершение для тега executables .

    Образ


# 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

Однако, если указанные мной теги не дают завершения, другие теги также будут опробованы.

Самый простой способ доказать это - исключить тег functions из стиля tag-order :

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"
          )
'

а затем создайте 2 функции с уникальным префиксом:

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

Теперь, когда я пишу unique_prefix_ и нажимаю клавишу TAB , я ничего не ожидаю увидеть, так как тег functions был удален из tag-order .
Однако, поскольку Executables , Builtins , Commands , Aliases , Variables и Keywords не предоставляют никаких дополнений, zsh по умолчанию будет пытаться сопоставить другие теги, а именно тег исключенных functions , чтобы попытаться дать какое-либо завершение.

Из-за этого будут предложены функции unique_prefix_A и unique_prefix_B :

Образ

Мне не нравится это поведение, и я хочу ограничить поиск только тегами, которые я явно указал.

Руководство по стилю порядка тегов предлагает простое решение:

- Если какое-либо значение состоит только из дефиса, генерируются только теги, указанные в других значениях. Обычно все теги, не выбранные явно, пробуются последними, если указанные теги не могут генерировать совпадения. Это означает, что одно значение, состоящее только из одного дефиса, отключает завершение.

Применение решения:

# 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"
           "-"
          )
'

Текущее поведение:

  • Когда я пишу c и нажимаю клавишу TAB , я получаю соответствующие дополнения в правильном порядке.

    Образ)

  • Когда я пишу ./ и нажимаю клавишу TAB , я ничего не получаю.

    Образ


Почему сейчас не работает только тег executables ?

Как я могу это исправить и получить желаемое поведение?

1 ответ1

1

В этом случае executable тег вызывает _files -g '*(-*) . Затем _files вызывает больше _tags , поэтому необходимо будет также указать эти неявно указанные теги в функциях завершения .

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"
           "-"
          )
'

Было бы полезно добавить globbed-files и directories в этом случае:

% 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*

Но, как указано выше, каталоги и локальные исполняемые файлы будут входить в одну группу "Исполняемые файлы". Если мы хотим, чтобы "каталоги" входили в другие группы, мы могли бы напрямую указать file-patterns и использовать их следующим образом:

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"
            -
          )
'

В приведенном ниже примере "каталог" и "исполняемый файл" находятся в отдельных группах:

% 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/

Ниже приведен самый маленький пример .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"
            -
          )
'

Обновлено: закомментируйте ненужный блок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .