My dotfiles: i3wm, Vim, tmux, zsh, termite.
Stow is a symlink farm manager program which takes distinct sets of software and/or data located in separate directories on the filesystem, and makes them all appear to be installed in a single directory tree.
Arch Linux:
yay -Sy stowI use stow to have all dotfiles on ~/.dotfiles under version control git.
I recommend to clone the repo on ~/.dofiles directory
git clone git@github.com:Sergi030/dotfiles.git .dotfiles- Install I3 and dependencies
yay -Sy i3-gaps i3blocks pavucontrol ttf-font-awesome ttf-font-awesome-4 alsa-utils flameshot rofi playerctl- Install vim
yay -Sy vim- Install Vundle:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim- Stow VIM config
cd ~/.dotfiles && stow VIM && cd -- Install Vundle PLugins
vim +PluginInstall +qall- Install last requierements
# Install ctags, cmake
yay -Sy ctags cmake
# Complete the installation of YouCompleteMe
cd .vim/bundle/YouCompleteMe/ && ./install.py --all && cd -
- Install termite
yay -Sy termite- Install requiered Fonts:
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh
cd ..
rm -rf fonts- Stow termite
cd ~/.dotfiles && stow TERMITE && cd -- Install ZSH
yay -Sy zsh- Install ohmyzsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"- Stow ZSH
rm ~/.zshrc && cd ~/.dotfiles && stow ZSH && cd -- Make ZSH the default shell
chsh -s /bin/zsh
My Tmux configuration is from gpakosz
- Install tmux
yay -Sy tmux- Stow TMUX
cd ~/.dotfiles && stow TMUX && cd -- Install Hyprland and the session programs
sudo apt install -y hyprland waybar swww wl-clipboard cliphist hypridle hyprlock kanshi dunst rofi brightnessctl- Stow Hypr
~/.config/systemd/user must exist first, otherwise stow folds the whole
systemd tree into a symlink and no other unit can ever be added to it.
mkdir -p ~/.config/systemd/user
cd ~/.dotfiles && stow Hypr && cd -- Enable the session services
The session is run by systemd, not by exec-once. hyprland.conf starts a single
unit, hyprland-session.target, which pulls in graphical-session.target; every
service below hangs off that and is restarted automatically if it dies. Stow only
symlinks the unit files — enabling them is separate state, so do it once per machine:
systemctl --user daemon-reload
systemctl --user enable kanshi.service waybar.service swww.service \
wl-clip-persist.service cliphist-text.service cliphist-image.service \
hypridle.service hyprpolkitagent.serviceThen log out and back in, or start it in place:
systemctl --user start hyprland-session.target- Checking on it
systemctl --user list-units 'kanshi*' 'waybar*' 'swww*' 'cliphist*' 'hypridle*'
journalctl --user -u kanshi -e # why a service diedsystemd does not follow a symlinked foo.service.d directory, and it fails
silently — systemctl --user show <unit> -p DropInPaths just comes back empty
and the packaged defaults apply. If stow folds hypridle.service.d into a single
symlink, every override in it is quietly dropped.
Keep the .service.d directories real so stow only symlinks the .conf files
inside them:
mkdir -p ~/.config/systemd/user/{hypridle,waybar,hyprpolkitagent}.service.d
cd ~/.dotfiles && stow Hypr
systemctl --user show waybar -p DropInPaths # must NOT be emptyNote that kill -9 does not catch this: SIGKILL counts as a failure, so a unit
left on the packaged Restart=on-failure still comes back and looks healthy.
Test with kill -TERM (a clean exit) to tell on-failure and always apart.
To add another autostart program, write a unit with
PartOf=graphical-session.target / WantedBy=graphical-session.target and enable
it — do not add exec-once lines to hyprland.conf, as those are unsupervised and
stay dead once the program crashes.
Stows settings.json and keybindings.json into ~/.config/Code/User/.
~/.config/Code/User must already exist as a real directory before stowing,
otherwise stow folds it into a symlink and VS Code's entire state directory
(History/, globalStorage/, workspace databases) ends up inside this repo.
cd ~/.dotfiles && stow VSCODE && cd -snippets/.gitignore only exists to keep the otherwise-empty snippets/
directory tracked; stow skips it, since .gitignore is on stow's default
ignore list.