4

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

  • Когда я пишу 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 ?

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

2 ответа2

2

В этом случае 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"
            -
          )
'

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

1

Я думаю, что проблема не только в дефисе, но и в том, насколько конкретно вы относитесь к правилам автозаполнения.

Я запустил несколько тестов, например, удалив «Переменные» из тега заказа и создав (TEST, LOLO) в оболочке.

После этого я попытался выполнить автозаполнение, ожидая ничего не видеть, но вместо этого в списке "Переменные" они появились как "Параметры".

Такое поведение заставило меня задуматься о UDEV и о том, как определенные системы требуют определенных правил для определенного поведения.

Ваша группа соответствия тегов в порядке и работает как задумано (в сценарии ./), но нужно выполнить одно:

./<TAB>

и совсем другое дело, чтобы автозаполнить что-то вроде:

unique_prefix<TAB>

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

Вместо того, чтобы заниматься этим, я искал пример, чтобы избежать специфических функций, и этот фрагмент работал довольно хорошо (проверьте источник):

Одно из применений этих функций - пробовать один тег более одного раза, устанавливая другие стили по-разному при каждой попытке, но все равно использовать все другие теги без необходимости повторять их все. Например, чтобы выполнить завершение имен функций в позиции команды, игнорируйте все функции завершения, начинающиеся с подчеркивания, при первой попытке завершения:

(Я изменил это, чтобы соответствовать всем функциям):

ignored-patterns ’_*’   

за это:

ignored-patterns ’*’

По этим правилам:

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

И когда я попытался выполнить автозаполнение: unique_prefix (ничего не произошло) и выполнение ./ работало хорошо.

Итак, ответ таков: вам понадобятся конкретные правила для каждого сценария, помня, что любой шаблон может интерпретироваться по-разному в соответствии с определенными вами правилами.

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