My configuration for the tools I use on macOS and Linux. Shared files live at
the root. Platform integration lives under macos/ and
linux/.
The setup script deploys configuration. It does not install Linux packages or
manage Linux services. The macOS side has a small optional
Brewfile, but I keep system setup explicit.
git clone --depth=1 https://github.com/vetr0s/dotfiles
cd dotfiles
bash setup.shsetup.sh detects the platform and links the matching files into place. It
moves an existing target to a timestamped backup. Later runs leave correct
links alone.
Preview the changes first:
bash setup.sh --dry-runThe platform can also be selected for testing:
bash setup.sh --platform macos --dry-run
bash setup.sh --platform linux --dry-runPackage installation and host services stay outside the root setup script. The platform READMEs define that boundary:
Emacs is my primary GUI editor. I run it as a daemon so emacsclient can open
frames without starting another process. Its configuration has a separate
README.
Neovim owns $EDITOR and $VISUAL for terminal work. Vim remains the small
fallback. Both use <Space> as the leader and share the bindings I use most.
Kitty is the terminal. AeroSpace handles tiling on macOS. Karabiner maps the right diamond key to the modifier AeroSpace uses. Bash is the login shell and tmux remains available for remote sessions.
The repository also carries my Git configuration, C formatting rules, and the fonts used by Kitty and Emacs.
| Path | Contents |
|---|---|
.emacs.d/, nvim/, .vimrc |
Editor configuration |
bashrc, bash_profile, config.bash |
Shell configuration |
kitty/, tmux/ |
Terminal configuration |
gitconfig, clang-format |
Tool configuration |
fonts/ |
Editor and terminal font assets |
macos/ |
Homebrew, launchd, AeroSpace, and Karabiner |
linux/ |
Distribution-neutral Linux behavior |
util/links.tsv |
Shared deployment manifest |
These are separate from deployment:
bash util/scripts/install-fonts.sh
bash util/scripts/tags.sh [project]
bash util/scripts/install-odinfmt.sh
bash util/scripts/install-vimplug.sh
bash macos/scripts/install-bash.sh
bash macos/scripts/make-emacsclient-app.shtags.sh indexes a project for goto-definition, which is what both editors
use now that neither runs a language server. It writes tags for Neovim, which
finds it through the default ./tags;, and .tags for Emacs, which
rc-programming visits when a buffer opens. Both come from one universal-ctags
run, so the two editors jump to the same place. C, C++, Go and Python are its
own parsers; Odin and Zig are regex definitions in the script, since
universal-ctags ships neither. Rerun it when the index goes stale.
install-odinfmt.sh builds odinfmt from source, since it is not packaged.
It needs the odin compiler and nothing else. The checkout goes to
~/source/third_party/ols and the binary is symlinked into ~/.local/bin.
Override with OLS_SRC_DIR and OLS_BIN_DIR. Emacs and Neovim both skip Odin
formatting when odinfmt is not on PATH, so this is only needed on a machine
where I write Odin.