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

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

    я читал про него давно но так и не понял чеб мне просто симлинки не сделать вместо того, чтобы новую технологию изучать? конфиг neovim кстати открывается нажатием c на главном экране neovim, если у тебя lazyvim или snacks.nvim плагин

    • Ëжкин КотOPM
      link
      fedilink
      arrow-up
      1
      ·
      14 days ago

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

      • vasthecat
        link
        fedilink
        arrow-up
        2
        ·
        13 days ago

        Я вообще не понимаю зачем ещё и с симлинками возиться… У меня просто bare репа ~/.dotfiles на весь ~, с вот таким gitignore:

        *
        !.gitignore
        !.config
        !.local
        

        Да, чтобы развернуть на новой тачке конфиг надо помнить пару флагов гита. Но после развёртывания есть алиас dot. Тупее подхода к дотфайлам быть не может, но зачем сложнее…

        • mcherniginA
          link
          fedilink
          arrow-up
          2
          ·
          edit-2
          11 days ago

          Со Stow ты можешь по сути, в своих дотфайлах хранить несколько конфликтующих конфигов и после клона репозитория симлинкать конкретно те конфиги, которые тебе нужны на этой машине

          • Ëжкин КотOPM
            link
            fedilink
            arrow-up
            1
            ·
            11 days ago

            В моём случае это одна из основных причин его использования, так как конфиг в install.sh должен гибко собираться как под MacOS/Arch, так и под ноутбук/десктоп.