My personal configuration for a development environment on macOS. The intended audience is future me on a new laptop.
| Path | Purpose |
|---|---|
nvim/ |
Neovim config — Lua, lazy.nvim, LSP + treesitter + completion + snippets. The primary editor. |
vim/ |
Legacy Vim config (kept as a fallback during the nvim transition). |
zsh/zshrc |
Shell config (oh-my-zsh + powerlevel10k + vi-mode + fzf integration). |
tmux/tmux.conf |
Tmux config (C-a prefix, powerline theme, mouse on, tpm). |
git/ |
gitconfig + global gitignore. |
claude/ |
Claude Code user-level skills (e.g. /initiative for structured multi-phase workflow). |
iterm/ |
iTerm color presets (.itermcolors files). Imported per-machine into the iTerm prefs plist; see the per-machine state section below. |
Assumes macOS with Command Line Tools installed (xcode-select --install).
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install \
neovim tree-sitter-cli \
fzf fd eza \
uv \
tmux \
git \
node \
powerlevel10k
brew install --cask iterm2sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattendedDon't let it overwrite ~/.zshrc — if it does, restore the symlink in step 4.
git clone git@github.com:pwsiegel/dotfiles.git ~/dotfilesln -sfn ~/dotfiles/zsh/zshrc ~/.zshrc
ln -sfn ~/dotfiles/tmux/tmux.conf ~/.tmux.conf
ln -sfn ~/dotfiles/git/gitconfig ~/.gitconfig
ln -sfn ~/dotfiles/vim/vimrc ~/.vim/vimrc # legacy, optional
mkdir -p ~/.config/git
ln -sfn ~/dotfiles/nvim ~/.config/nvim
ln -sfn ~/dotfiles/git/gitignore_global ~/.config/git/ignore # git reads this by default (XDG)
mkdir -p ~/.claude/skills
ln -sfn ~/dotfiles/claude/skills/initiative ~/.claude/skills/initiative # /initiative skillOn a work machine where ~/.gitconfig is kept separate (different identity,
custom aliases), skip the gitconfig link above but keep the ~/.config/git/ignore
one — git reads it regardless of what your .gitconfig says.
Install tpm:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpmStart tmux, then press <C-a> I (capital-i) to install the plugins listed
in tmux.conf.
Lualine chevrons and the nvim-tree file-type icons both come from a
Nerd-Fonts-patched font. Without one, file-tree icons render as ?.
brew install --cask font-jetbrains-mono-nerd-fontIn iTerm: Preferences → Profiles → Text → Font → JetBrainsMono Nerd Font (or JetBrainsMonoNL Nerd Font for the ligature-free variant).
Open nvim. lazy.nvim self-clones on first launch and installs every
plugin from nvim/lua/plugins/*.lua. Quit and relaunch once the install
finishes.
Then inside nvim, install the treesitter parsers and LSP servers:
:lua require('nvim-treesitter').install({
'bash','css','diff','dockerfile','gitcommit','gitignore','html',
'javascript','json','lua','markdown','markdown_inline','python',
'query','regex','sql','toml','tsx','typescript','vim','vimdoc','yaml',
})
:MasonInstall pyright ruff typescript-language-server eslint-lsp lua-language-server prettier(The :MasonInstall line uses Mason's package names, which differ from the
mason-lspconfig short names — ts_ls vs typescript-language-server etc.)
On first shell launch, p10k will run its configuration wizard. Answer the
prompts to taste; it writes ~/.p10k.zsh which zshrc sources.
Some things can't be symlinked in — they live in macOS preferences, app preference plists, or get generated by interactive wizards. When setting up a new machine, work through this checklist alongside the symlinks above:
| What | Where | How to set |
|---|---|---|
| GitHub SSH key | ~/.ssh/id_ed25519 |
Generate with ssh-keygen -t ed25519 -C pwsiegel@gmail.com, then add the public key at https://github.com/settings/keys. Required before the git clone step works. |
| iTerm font | iTerm prefs (com.googlecode.iterm2.plist) |
Preferences → Profiles → Text → Font → JetBrainsMono Nerd Font. |
| iTerm color scheme | iTerm prefs | Import iterm/*.itermcolors (open iterm/*.itermcolors registers them as Color Presets), then Preferences → Profiles → Colors → Color Presets... → pick Solarized Dark Berry fg. Pairs with the nvim solarized8 theme. |
| Powerlevel10k config | ~/.p10k.zsh |
Runs a wizard on first shell launch (sourced by zshrc). Re-run any time with p10k configure. |
| Tmux plugins | ~/.tmux/plugins/ |
Install tpm (step 5 above), then <C-a> I inside tmux. |
| Nvim plugins | ~/.local/share/nvim/lazy/ |
lazy.nvim self-installs on first nvim launch. |
| Nvim LSP servers + parsers | ~/.local/share/nvim/mason/, ~/.local/share/nvim/lazy/nvim-treesitter/parser/ |
Run the :MasonInstall and require('nvim-treesitter').install(...) commands from step 7. |
| Claude Code skills (user-level) | ~/.claude/skills/ |
Symlinked from claude/skills/* (see step 4). Adding a new skill = drop it under claude/skills/<name>/ and add the symlink. |
The repo is the source of truth. Edit files in place under ~/dotfiles/
and reload:
| What | How |
|---|---|
| Zsh | source ~/.zshrc or open a new shell |
| Tmux | <C-a> r (if mapped) or tmux source ~/.tmux.conf |
| Nvim | :Lazy sync for plugin changes; restart nvim for config changes (Lua module cache makes in-place reload unreliable) |
- The
nvim/config requires Neovim 0.11+ (usesvim.lsp.config,vim.diagnostic.jump, etc.). On macOS just keep brew current. - The brew-shipped
tree-sitterpackage is the library only; you also need thetree-sitter-clipackage for parsers that build from grammar (latex in particular). - The legacy
vim/config and Vim itself are kept around as a fallback. Delete them once nvim is fully settled.