Когда количество файлов конфигураций для различных программ достаточно разрастается, очевидным решением становится хранение их в отдельном репозитории, чтобы ничего не потерять. Однако с этим возникает другая проблема — если потребовалось внести какие-то изменения в конфиг, то нужно после этого внести их и в соответствующие файлы репозитория.

Такой подход, разумеется, никуда не годится. Хочется иметь единый источник правды в виде репозитория, изменения из которого будут автоматически отражаться на системе. Можно, конечно, вручную насоздавать симлинков на каждый конфигурационный файл, но для этих целей есть инструмент куда удобнее — 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 -"
  • Ëжкин КотOPM
    link
    fedilink
    arrow-up
    1
    ·
    2 hours ago

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