Когда количество файлов конфигураций для различных программ достаточно разрастается, очевидным решением становится хранение их в отдельном репозитории, чтобы ничего не потерять. Однако с этим возникает другая проблема — если потребовалось внести какие-то изменения в конфиг, то нужно после этого внести их и в соответствующие файлы репозитория.
Такой подход, разумеется, никуда не годится. Хочется иметь единый источник правды в виде репозитория, изменения из которого будут автоматически отражаться на системе. Можно, конечно, вручную насоздавать симлинков на каждый конфигурационный файл, но для этих целей есть инструмент куда удобнее — GNU Stow.
Эта утилита помогает более удобно создавать симлинки, как бы проецируя нужные директории со всей их структурой и файлами в домашнюю, либо другую указанную. И в репозитории с dotfiles для использования stow можно либо полностью воссоздать всю структуру директории .config и одной командой создавать её в домашней директории, либо же для каждого конфига создать свою директорию, например zellij/.config/zellij/, и в таком случае .config можно собирать как конструктор, запуская stow для каждого конфига по отдельности.
Для себя я выбрал второй подход, так как он позволяет гибко собирать конфиг в install.sh скрипте под нужную систему. Вот как это реализовано:
# Common config dirs
packages=("bat" "fzf-git" "yazi" "zellij" "zsh")
if [[ "$OSTYPE" == "darwin"* ]]; then
packages+=("ghostty-macos")
else
if [ "$WITH_GUI_INSTALL" = true ]; then
packages+=("ghostty-arch")
fi
fi
echo "Is your device a laptop? [y/n]"
read -r is_laptop
if [ "$is_laptop" = "y" ]; then
packages+=("p10k-laptop")
else
packages+=("p10k-desktop")
fi
mv ~/.zshrc ~/.zshrc-backup
# Apply configs with stow
for pkg in "${packages[@]}"; do
stow -R -v -t "$HOME" "$pkg"
done
Также можно сделать удобный алиас, позволяющий, находясь в любой директории, быстро открыть репозиторий со всеми конфигами в Neovim:
# Dark magic of zsh to get absolute path of dotfiles directory
DOTFILES_DIR="${${(%):-%x}:A:h:h}"
alias ndot="cd $DOTFILES_DIR && nvim && cd -"

Во-первых, там не то чтобы было что изучать. Всё, чем занимается stow, это просто автоматизация процесса создания симлинков, позволяя создавать их не для каждого файла по отдельности, а разом для всего содержимого нужной директории, не более. Во-вторых, тут я привёл алиас для открытия именно директории со всеми конфигами, а не с конфигом Neovim, для такого, кажется, плагинов ещё не придумали.