Bash, zsh, Vim, tmux, clangd, and Git configuration for Linux and macOS.
The original Linux installer remains at the repository root:
./setup.shThe modern macOS installer is separate:
./mac/setup.shThe macOS setup keeps the current login shell unchanged, backs up conflicting
files under ~/.dotfiles-backup, and preserves the existing Vim, tmux, Bash,
and zsh key bindings.
On macOS, modern tools are installed under their own command names rather than replacing standard commands:
bat,eza, andfdfor file inspection and searchripgrepandfzffor fast text and fuzzy searchzoxidefor directory navigationstarshipfor the promptmisefor language/tool versions and per-project environmentsuvfor Python projectsdeltafor Git diffslazygitfor an optional full-screen Git workflowghfor pull requests, issues, Actions, and repository operationsyazifor an optional terminal file managerjqandyqfor structured datajustfor project commandsshellcheckandshfmtfor shell scripts
The macOS setup uses tmux-resurrect and tmux-continuum, the established
dynamic snapshot solution for tmux:
- sessions, windows, panes, ordering, layouts, focus, and working directories are restored
- pane scrollback is captured
- Vim uses Obsession to continuously maintain private session files under
~/Library/Application Support/vim/sessions, restoring open files, tabs, splits, folds, and the current directory - safe interactive programs such as Vim, Copilot CLI, LazyGit, and Yazi are relaunched
- snapshots are written every five minutes and whenever the macOS setup runs
- a LaunchAgent starts tmux at login, which triggers automatic restoration
Project-local Session.vim files are globally ignored by Git for compatibility,
but the macOS setup does not create them. No new tmux or Vim key bindings are
added.
This is state reconstruction, not process checkpointing: arbitrary running jobs, in-memory application state, unsaved Vim buffer contents, and network connections cannot be resumed exactly after a reboot. Pane scrollback and Vim swap/undo files provide recovery context, but important edits and job state must still be saved by their applications.
Snapshots can contain terminal output and are stored locally in a user-readable-only directory.
The setup deliberately does not install or initialize:
- Atuin, because its default history bindings conflict with the existing fzf
Ctrl-Rbinding - Zellij, because it replaces tmux's key model
- Neovim, because obtaining its main benefits requires a separate editor migration rather than a safe Vim configuration update
- direnv, because mise officially recommends not activating both environment managers together
- replacement aliases for
cat,ls, orcd;bat,eza, andzoxideremain explicit commands