Почему значение '-' (дефис) в стиле "тег-порядок" предотвращает сопоставление тега "исполняемые файлы", даже если этот тег указан явно?

436
Iskustvo

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

  • Когда я пишу 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не работает только тег?

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

3
Я понимаю текст «Если какое-либо значение состоит только из дефиса, то генерируются только теги, указанные в других значениях», чтобы означать, что дефис ограничивает вас значениями в списке. Поскольку `. /` Отсутствует в списке, вы ничего не получите. harrymc 5 лет назад 0
Я пытался использовать ваш код, но не смог воспроизвести вашу проблему (с `zsh 4.3.17`). Есть ли шанс, что вы пытаетесь завершить `. /` В папке, где нет исполняемых файлов? Можете ли вы привести пример нежелательного поведения? JRI 5 лет назад 0
@harrymc Да, я тоже так понимаю. Однако я не понимаю вашу мысль о `. /`, Как это должно быть в списке? Тег `executeables` отвечает за дополнения к`. / `или я не прав? Iskustvo 5 лет назад 0
@JRI Это странно. Я использую `zsh 5.5.1`, как вы думаете, это может быть регрессия в исходном коде` zsh`? К сожалению, нет, есть исполняемые файлы и каталоги. Я обновил вопрос с изображениями для каждого случая. Последнее изображение явно представляет нежелательное поведение: D Iskustvo 5 лет назад 0
@JRI и Iskustvo: На каких версиях Linux вы работаете? JRI: Вы пробовали те же самые команды, что и выше, без дополнений? harrymc 5 лет назад 0
@harrymc `Linux Arch 4.16.4-1-ARCH # 1 ПРЕДСТАВЛЕНИЕ SMP Чт 24 апреля 13:21:29 UTC 2018 x86_64 GNU / Linux`. Действительно ли версия для Linux действительно хороша тем, как `zsh` использует дополнения? Iskustvo 5 лет назад 0
В дистрибутивах Linux могут быть различия между источниками. harrymc 5 лет назад 0
Вы должны спросить об unix & linux stackexchange, там есть какой-то очень хороший парень с zsh. Kiwy 5 лет назад 0
Спасибо, сначала я дал ему шанс на StackOverflow. Затем я узнал об этом сайте и разместил тот же вопрос здесь, и когда ни на одном из этих сайтов не было ни одного ответа, я также разместил вопрос о Unix и Linux. Я дал щедрость на всех 3 сайтах, и это единственный, где кто-то действительно прокомментировал что-то важное. Другие просто игнорируются ... Iskustvo 5 лет назад 0

1 ответ на вопрос

1
hchbaw

executableТег вызывает _files -g '*(-*)в этом случае. Затем _filesвызывается more _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%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" - ) ' 

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

Я скопировал из моего оригинального ответа. https://stackoverflow.com/a/50403671/4387039 hchbaw 5 лет назад 0