С кодом ниже все работает как положено:
Когда я пишу
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
?
Как я могу это исправить и получить желаемое поведение?