Вопрос или проблема
Я работал над настройкой автокомплита, следуя этому руководству 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
.
Причины ограничения автозаполнения
-
Разные реализации команды
cp
: На различных операционных системах могут применяться разные версии командыcp
. В случае macOS используется версияcp
, которая значительно меньше по количеству опций по сравнению с реализацией GNU. Это означает, что стандартный автозаполнительzsh
будет учитывать только доступные опции для вашей конкретной версии. -
Исходный код автозаполнятора zsh: Если вы заглянете в исходный код автозаполнятора
zsh
для командыcp
, вы обнаружите, что он адаптируется к списку опций в зависимости от операционной системы. Однако он не знает обо всех возможных опциях всех реализацийcp
, что может вызвать отсутствие некоторых возможностей, особенно если они специфичны для другой платформы, такой как GNU. -
Документация: Для более полного понимания доступных возможностей, рекомендуется ознакомиться с документацией на вашу версию
cp
в macOS. Это справочная информация, которая может помочь понять, какие параметры вам действительно доступны.
Решения для обхода проблемы
-
Установка GNU Coreutils: Если вы хотите иметь доступ ко всем опциям команды
cp
, вы можете установить GNU Coreutils черезHomebrew
. Это позволит вам использовать улучшенную версию командыcp
, которая поддерживает больше опций.brew install coreutils
После этого команда может потребовать использования
gcp
вместоcp
для реализации GNU версии. -
Проверка параметров: Вы можете всегда проверить доступные параметры вашей команды, используя
man cp
, чтобы получить актуальную информацию о доступных опциях.
Заключение
Проблема с неполным автозаполнением опций команды cp
в zsh
на macOS может быть связана с различием в реализациях команды. С вашей текущей настройкой автозаполнения всё на месте, и вам стоит рассмотреть возможность установки GNU Coreutils, если вам требуются дополнительные опции команды. Обратитесь к документации, чтобы быть в курсе всех возможностей вашей системы.