Config for the tools I actually use: bash and zsh, tmux, Neovim, git, and irb.
Most of the work happens on a Linux devbox over SSH; the Mac is a light checkout that mainly needs the shell and git config.
Clone to ~/.dotfiles, then:
./install.shThe script symlinks each file to its place in $HOME, and is safe to re-run.
Use ./install.sh --dry-run to see what it would do first.
Because the files are symlinked, editing anything in this repo takes effect
immediately. Re-running install.sh is only needed when a new file is added.
Anything real already sitting at a target path is moved to <name>.backup
rather than deleted. Symlinks left behind by older versions of this repo are
cleaned up automatically.
On the first run it also clones tpm, the tmux plugin manager. Two things still need a manual nudge afterwards:
- open
nvim— lazy.nvim bootstraps itself and installs plugins - inside tmux, press
prefix + Ito install the tmux plugins
| Repo path | Symlinked to |
|---|---|
gitconfig | ~/.gitconfig |
gitignore | ~/.gitignore |
inputrc | ~/.inputrc |
irbrc | ~/.irbrc |
tmux.conf | ~/.tmux.conf |
shell/bash_profile | ~/.bash_profile |
shell/zshrc | ~/.zshrc |
bin/ | ~/.bin |
nvim/ | ~/.config/nvim |
The rest of shell/ is not symlinked individually; bash_profile and zshrc
source it directly out of the repo.
Each tool has its own page, covering what is configured and why:
- Shell — bash and zsh, aliases, functions, prompt,
PATH - tmux — key bindings, status line, plugins, the session switcher
- Neovim — plugins, key maps, LSP, running specs
- Git — settings, aliases, the global ignore file
- Ruby — the irb prompt
Machine-specific settings that should not be committed go in ~/.shell_local,
which is sourced last by both shells. On the devbox that is what pulls in the
devbox environment.
The tmux session switcher reads its search paths from
~/.tmux-sessionizer-paths if that file exists.
- Arrows over
hjkl. Both tmux and Neovim are set up so arrow keys do the navigating. Nothing requireshjkl. ,is the Neovim leader.Ctrl-bis the tmux prefix — the default, left alone deliberately.