Автозавершение опций cp в zsh не отображает все из них.

Вопрос или проблема

Я работал над настройкой автокомплита, следуя этому руководству https://thevaluable.dev/zsh-install-configure-mouseless/. Я использую MacOS, но по какой-то причине, когда я пытаюсь автозаполнить опции, он не перечисляет полный набор опций. Вот моя конфигурация для автокомплита:

#Completion
autoload -Uz compinit
compinit
zmodload zsh/complist
#Удивительная статья https://thevaluable.dev/zsh-install-configure-mouseless/
zstyle ':completion:*' completer _extensions _complete _approximate
zstyle ':completion:*' menu select
zstyle ':completion:*' file-sort modification
zstyle ':completion:*:*:*:*:descriptions' format '%F{green}-- %d --%f'
zstyle ':completion:*' complete-options true
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*' #https://unix.stackexchange.com/a/259511
zstyle ':completion:*' verbose yes
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-colors 'di=34:fi=31:no=33;00'
# zstyle ':completion:*' file-list all #К сожалению, это портит раскраску
#Перемещение с помощью VIM клавиш Автозаполнение
bindkey '^[[Z' reverse-menu-complete
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
bindkey -M menuselect 'j' vi-down-line-or-history

Когда я пытаюсь автозаполнить опции для встроенных команд оболочки, я получаю следующее:

❯ cp -
-- option --
-H  -- следовать символьным ссылкам на командной строке в рекурсивном режиме
-L  -- следовать всем символьным ссылкам в рекурсивном режиме
-P  -- не следовать символьным ссылкам в рекурсивном режиме (по умолчанию)
-R  -- копировать директории рекурсивно
-X  -- не копировать дополнительные атрибуты или ресурсы
-a  -- архивный режим, то же самое, что -RpP
-f  -- принудительно перезаписать существующий файл
-i  -- подтвердить перед перезаписью существующего файла
-n  -- не перезаписывать существующий файл
-p  -- сохранить метки времени, режим, владельца, флаги, ACL и дополнительные атрибуты
-v  -- показывать имена файлов по мере их копирования

Я ожидал получить полный список опций cp в соответствии со статьей. Может ли это быть проблемой MacOS для автозаполнения в zsh?

Если вы посмотрите на код автокомплита zsh для команды cp, вы увидите, что он адаптирует список опций в зависимости от ОС, на которой он работает, кроме того, он также определяет, используете ли вы реализацию GNU (которая может использоваться на многих различных системах, будучи портативной и свободным программным обеспечением), поскольку разные ОС поставляются с разными реализациями cp.

Как оказывается, собственный cp macos имеет гораздо меньше опций, чем GNU реализация cp.

Автокомплит cp zsh не знает обо всех опциях всех версий всех различных реализаций cp, но для данной ОС обычно предлагает достаточно наиболее используемых.

В любом случае, чтобы узнать о поддерживаемых опциях вашей собственной реализации cp, лучше прочитать ее документацию¹.


¹ Или ее исходный код для тех, кто делает его доступным, поскольку некоторые опции иногда не документированы (хотя это обычно означает, что вас не поощряют их использовать).

Ответ или решение

Автозаполнение опций команды cp в zsh на macOS

Введение

При работе с оболочкой zsh и попытках настроить автозаполнение, пользователи могут столкнуться с проблемой, когда автозаполнение опций для встроенной команды cp не отображает полный набор доступных параметров. Это может вызвать недоумение, особенно если вы следуете рекомендациям по настройке, как указано в статье на сайте The Valuable Dev.

Настройка автозаполнения

Вы привели следующий код для настройки автозаполнения:

# Completion
autoload -Uz compinit
compinit
zmodload zsh/complist

zstyle ':completion:*' completer _extensions _complete _approximate
zstyle ':completion:*' menu select
zstyle ':completion:*' file-sort modification
zstyle ':completion:*:*:*:*:descriptions' format '%F{green}-- %d --%f'
zstyle ':completion:*' complete-options true
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' verbose yes
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-colors 'di=34:fi=31:no=33;00'

# Move with VIM keys Autocompletion
bindkey '^[[Z' reverse-menu-complete
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
bindkey -M menuselect 'j' vi-down-line-or-history

Ваши настройки выглядят корректными и должны позволять zsh правильно обрабатывать автозаполнение для различных команд. Однако, продолжая исследовать проблему, важно учесть, что автозаполнение может быть ограничено реализацией используемой команды cp.

Причины ограничения автозаполнения

  1. Разные реализации команды cp: На различных операционных системах могут применяться разные версии команды cp. В случае macOS используется версия cp, которая значительно меньше по количеству опций по сравнению с реализацией GNU. Это означает, что стандартный автозаполнитель zsh будет учитывать только доступные опции для вашей конкретной версии.

  2. Исходный код автозаполнятора zsh: Если вы заглянете в исходный код автозаполнятора zsh для команды cp, вы обнаружите, что он адаптируется к списку опций в зависимости от операционной системы. Однако он не знает обо всех возможных опциях всех реализаций cp, что может вызвать отсутствие некоторых возможностей, особенно если они специфичны для другой платформы, такой как GNU.

  3. Документация: Для более полного понимания доступных возможностей, рекомендуется ознакомиться с документацией на вашу версию cp в macOS. Это справочная информация, которая может помочь понять, какие параметры вам действительно доступны.

Решения для обхода проблемы

  • Установка GNU Coreutils: Если вы хотите иметь доступ ко всем опциям команды cp, вы можете установить GNU Coreutils через Homebrew. Это позволит вам использовать улучшенную версию команды cp, которая поддерживает больше опций.

    brew install coreutils

    После этого команда может потребовать использования gcp вместо cp для реализации GNU версии.

  • Проверка параметров: Вы можете всегда проверить доступные параметры вашей команды, используя man cp, чтобы получить актуальную информацию о доступных опциях.

Заключение

Проблема с неполным автозаполнением опций команды cp в zsh на macOS может быть связана с различием в реализациях команды. С вашей текущей настройкой автозаполнения всё на месте, и вам стоит рассмотреть возможность установки GNU Coreutils, если вам требуются дополнительные опции команды. Обратитесь к документации, чтобы быть в курсе всех возможностей вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...