TL,DR :При обычной работе просто поместите файл в соответствующий каталог. Во время тестирования вам нужно удалить файл кеша(.zcompdump
по умолчанию, но пользователи могут поместить его в другое место, и о -мой -zsh помещает его в другое место ).
Простой ответ — записать функцию завершения в файл, где первая строка —#compdef fab
. Файл должен находиться в каталоге $fpath
.
Файл может содержать либо тело функции, либо определение функции, за которым следует вызов функции. То есть либо файл содержит что-то вроде
#compdef fab
_arguments …
или
#compdef fab
function _fab {
_arguments …
}
_fab "$@"
Файл должен присутствовать на $fpath
перед запуском compinit
. Это означает, что вам нужно обратить внимание на порядок вещей в .zshrc
:: сначала добавьте любые пользовательские каталоги в $fpath
, а затем вызовите compinit
. Если вы используете такой фреймворк, как oh -my -zsh, не забудьте добавить любые пользовательские каталоги в $fpath
перед кодом oh -my -zsh.
compinit
— это функция, которая инициализирует систему завершения. Он читает все файлы в $fpath
и проверяет их первую строку на наличие магических директив#autoload
и #compdef
.
.zcompdump
— это файл кэша, используемый compinit
. ~/.zcompdump
— расположение по умолчанию; вы можете выбрать другое место при запуске compinit
. О, -мой -zsh вызывает compinit
с опцией -d
для использования другого имени файла кеша, заданного переменной ZSH_COMPDUMP
, которая по умолчанию равна
ZSH_COMPDUMP="${ZDOTDIR:-${HOME}}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
Имя хоста включено для людей, чей домашний каталог является общим для разных машин и у которых может быть установлено различное программное обеспечение на разных машинах. Версия zsh включена, потому что файл кеша несовместим между версиями (, он содержит код, который меняется от версии к версии ).
Я думаю, что все ваши проблемы связаны с устаревшим файлом кэша (, и поэтому вы слишком усложняете ситуацию ). К сожалению,Алгоритм zsh для определения того, устарел ли файл кэша , не идеален, по-видимому, в интересах скорости. Он не проверяет содержимое или временные метки файлов на $fpath
, а просто подсчитывает их. Файл .zcompdump
начинается со строки вида
#files: 858 version: 5.1.1
Если версия zsh и количество файлов правильные, zsh загружает файл кеша.
Кэш-файл содержит только ассоциации между именами команд, а не код функций завершения. Вот несколько распространенных сценариев, когда кеш работает прозрачно:
$fpath
, это сделает кеш недействительным. $fpath
, а общее количество удаленных файлов не равно общему количеству удаленных файлов, кэш становится недействительным. $fpath
без изменения его имени, это не повлияет ни на что в кеше, поэтому кеш останется правильным. $fpath
без изменения его первой строки, это не повлияет ни на что в кеше, поэтому кеш останется правильным. Вот несколько распространенных сценариев, когда кеш становится недействительным, но zsh этого не понимает.
$fpath
и удаляете точно такое же количество файлов. $fpath
. #compdef
(или#autoload
)вверху файла. Этот последний пункт имеет тенденцию кусаться во время тестирования. При изменении строки #compdef
необходимо удалить файл .zcompdump
и перезапустить zsh (или перезапустить compinit
).
Если вы помещаете дополнения в распространяемый пакет, просто перетащите файл завершения в системный каталог -по всему $fpath
. Для пакета Ubuntu подходящим местом будет /usr/share/zsh/vendor-completions
. Для чего-то, установленного под /usr/local
, это /usr/local/share/zsh/site-functions
.Это все, что вам нужно сделать.
Единственное, что не является прозрачным, — это необходимость изменить строку #compdef
при обновлении или удалить или переименовать некоторые файлы. В таких случаях пользователям потребуется удалить свой файл кеша, а это невозможно сделать из пакета, который устанавливается на многопользовательской машине.
Проверьте файл конфигурации grub2 и его записи.
Я всегда забывал запускать sudo update -grub при редактировании для нового ISO. Поэтому я переместил все записи в текстовый файл в моей папке ISO и одну запись в файле конфигурации в стандартном grub 40 _custom. Затем мне нужно только отредактировать текстовый файл.
Подробнее о конфигурационном файле см. п. 6.5.https://www.gnu.org/software/grub/manual/grub/grub.html#Multi_002dboot-manual-configИспользуйте метки и файл конфигурации для загрузки другой установки
Показывает 40 _настраиваемых файлов конфигурации в текстовый файл в папках ISO, один на hd0, а другой на hd1. У меня есть ISO на одном диске для установки на другой диск с меньшими проблемами.
https://ubuntuforums.org/showthread.php?t=2076205&p=13788092#post13788092
https://www.gnu.org/software/grub/manual/grub/grub.html#Multi_002dboot-manual-config
Типичная запись в 40 _пользовательских, никогда не меняется:
menuentry 'Live ISOs on SSD' {
search --set=root --label iso_ssd --hint hd1,gpt5
configfile /livecdimage.cfg
}
Затем в livecdimage.cfg или любом другом файле скопируйте полный загрузочный раздел grub2 для ISO или других установок. Любая строфа grub может находиться в текстовом файле.
Другой пример:
https://ubuntuforums.org/showthread.php?t=2076205&p=14020961#post14020961
Пример моего конфигурационного файла с именем livecdimage.cfg, обычно содержит несколько записей или много файлов ISO в папке ISO:
# livecdimage.cfg
menuentry "Kubuntu 21.10 Impish Live ISO" {
set isofile="/ISO/kubuntu-21.10-desktop-amd64.iso"
loopback loop (hd1,5)$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile toram noeject
initrd (loop)/casper/initrd
}