One command to set up a complete macOS development environment: Neovim (LazyVim) + tmux + Go + Claude Code + Ghostty terminal.
git clone https://github.com/YOUR_USERNAME/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
chmod +x install.sh
./install.shThen restart your terminal. See Manual Post-Install Steps below for anything that can't be automated.
- Neovim — editor
- Ghostty — GPU-accelerated terminal with native splits
- Go + gopls, delve, gofumpt, goimports, golangci-lint
- Java (OpenJDK 21) + Maven, Gradle — for Quarkus work
- C# / .NET — for Unity scripting (OmniSharp)
- Python 3.12
- Node.js + pnpm — required by some Neovim LSPs and Next.js
- tmux — terminal multiplexer (sessions, splits, detach)
- lazygit — git TUI (used inside Neovim)
- ripgrep, fd — fast search (used by Telescope)
- starship — fast shell prompt
- zoxide — smart
cdreplacement (zcommand) - eza — modern
lswith icons - bat —
catwith syntax highlighting - fzf — fuzzy finder
- FiraMono Nerd Font — terminal/editor font with icons
- Go language support — gopls, semantic tokens, formatting, linting
- Java language support — jdtls for Quarkus work
- C# language support — OmniSharp for Unity
- TypeScript/JavaScript — vtsls, ESLint, Prettier, Tailwind CSS
- Debugging — DAP + delve (breakpoints, variable inspection)
- diffview.nvim — side-by-side diff review + stash viewer
- Harpoon 2 — bookmark files and jump instantly (ThePrimeagen)
- flash.nvim — jump anywhere on screen with 1-2 keystrokes
- oil.nvim — edit filesystem like a buffer
- undotree — visualize and navigate undo history
- neotest — run tests from inside nvim (Go adapter)
- vim-tmux-navigator — seamless Ctrl+H/J/K/L between vim and tmux
- Claude Code integration — WebSocket bridge
- catppuccin theme — vibrant colors with LSP semantic token support
- Alternative themes: cyberdream, dracula
- zinit — fast plugin manager (replaces oh-my-zsh)
- Loads only the oh-my-zsh plugins you need: git, history, completions
- zsh-autosuggestions — fish-like suggestions
- zsh-syntax-highlighting — command highlighting
- starship prompt — shows git branch, Go version, etc.
C-a | → Split right
C-a - → Split down
C-a f → Sessionizer (fuzzy-find projects, switch sessions)
C-a c → New window
C-a d → Detach
Ctrl+H/J/K/L → Navigate between tmux panes AND vim splits
<leader>ha → Add current file to harpoon
<leader>hh → Toggle harpoon menu
<leader>1-4 → Jump to harpoon file 1-4
gd → Go to definition
gI → Go to implementation
gr → Find references
<leader>ff → Find files
<leader>sg → Search in files (grep)
<leader>e → Toggle file tree
s → Flash jump (type 2 chars, press label)
- → Oil: open parent directory as buffer
<leader>gd → Open Diffview (all uncommitted changes)
Tab/S-Tab → Cycle through changed files
<leader>gD → Close Diffview
<leader>gs → View a stash in Diffview (without applying)
<leader>gg → Open LazyGit (stash tab for full management)
<leader>tt → Run nearest test
<leader>tf → Run all tests in file
<leader>ts → Toggle test summary
<leader>to → Toggle test output
<leader>db → Toggle breakpoint
<leader>dc → Start/continue debugging
F10 → Step over
F11 → Step into
<leader>du → Toggle debug UI
<leader>p → Paste without overwriting register (visual)
<leader>d → Delete to void register
<leader>y → Yank to system clipboard
dotfiles/
├── install.sh # One-command setup script
├── Brewfile # Homebrew packages
├── nvim/ # Neovim config (LazyVim)
│ ├── init.lua
│ └── lua/
│ ├── config/
│ │ ├── options.lua
│ │ ├── keymaps.lua
│ │ └── autocmds.lua
│ └── plugins/
│ ├── colorscheme.lua
│ ├── git.lua
│ ├── claude.lua
│ ├── editor.lua
│ ├── navigation.lua # vim-tmux-navigator, harpoon, flash, oil
│ └── tools.lua # undotree, neotest
├── tmux/
│ ├── tmux.conf # tmux configuration
│ └── tmux-sessionizer # Project switcher script
├── ghostty/
│ └── config
├── zsh/
│ └── .zshrc
├── starship/
│ └── starship.toml
├── git/
│ ├── .gitconfig
│ └── .gitignore_global
└── claude/
└── skills/ # Claude Code custom skills (→ ~/.claude/skills)
└── k8s-pf/
└── SKILL.md # Port-forward to MJ dev EKS pods
- Change theme: Edit
nvim/lua/plugins/colorscheme.lua - Add plugins: Create new files in
nvim/lua/plugins/ - Add brew packages: Edit
Brewfile, then runbrew bundle - Shell aliases: Edit
zsh/.zshrc - Add Claude skills: Create
claude/skills/<skill-name>/SKILL.md— invoke with/<skill-name>in Claude Code
┌─────────────────┬──────────────────┐
│ │ │
│ Claude Code │ Neovim │
│ │ │
│ C-a | │ │
│ ├──────────────────┤
│ │ Terminal │
│ │ C-a - │
└─────────────────┴──────────────────┘
Navigate: Ctrl+H/J/K/L (seamless vim↔tmux)
Sessions: C-a f (sessionizer — fuzzy-find projects)
These steps require manual action and can't be fully automated by install.sh.
The install script will prompt for your password, but if it fails or you skipped it:
sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdkVerify: java --version should show OpenJDK 21.
System Settings → Keyboard → Keyboard Shortcuts → Modifier Keys → Set Caps Lock to Escape.
Open Ghostty → Cmd+, (Settings) → enable "Default Terminal". The old System Settings path (Desktop & Dock → Default terminal application) is no longer available in recent macOS versions.
On first nvim launch, Lazy.nvim will auto-install all plugins (takes 1-3 minutes). After that:
- Run
:Masonto verify LSP servers are installed (gopls, jdtls, omnisharp, vtsls, json-lsp, tailwindcss-language-server, eslint-lsp, prettier) - Run
:checkhealthto verify everything is working
cd ~/.dotfiles
git init
git add -A
git commit -m "initial dotfiles: neovim + ghostty + zsh + go/java/csharp/ts"
git remote add origin git@github.com:YOUR_USERNAME/dotfiles.git
git push -u origin main