- Dev Environment Config
- 2026 Setup
- 2025 Setup (Archive) - Terminal ZSH Setup - TMUX Setup - Neovim Setup - Plugin Manager - Navigating Between Neovim Windows and Tmux - File Explorer - Buffer Line - Keymap Suggestions - Fuzzy Finder - Autocompletion - Snippets - Managing & Installing Language Servers, Linters & Formatters - LSP Configuration - Formatting & Linting - Comments - Treesitter Syntax Highlighting, Autoclosing & Text Objects
My daily driver workflow built around
tmux + Neovim + Claude Code,
orchestrated by a single command: nic.
The core of this setup is a tmux function called
nic (Neovim + AI + CLI) that creates a
three-pane development layout:
+----------------------------+----------+
| | |
| Neovim | Claude |
| (70%) | Code |
| | (30%) |
+----------------------------+----------+
| Terminal (15%) |
+---------------------------------------+
Type nic in any project directory and you get:
- Left pane -- Neovim (LazyVim) as the editor
- Right pane -- Claude Code (
cx) as the AI assistant - Bottom pane -- Terminal for commands, tests, servers
There's also nichl for the same layout but tunneled
into a homelab server via SSH,
and unnic to tear it down cleanly.
| Area | 2025 | 2026 |
|---|---|---|
| Shell config | .bashrc (single file) |
ZSH (modular) |
| Editor | LunarVim | LazyVim |
| Prompt | Basic | Starship |
| AI assistant | -- | Claude Code |
| File listing | exa |
eza |
| Navigation | cd |
zoxide |
| File manager | -- | yazi |
| Setup | Manual | install.sh |
Moved from a monolithic .bashrc to a modular ZSH setup.
The entry point .zshrc just sources ~/config/zsh/rc,
which loads five focused files:
| File | Purpose |
|---|---|
zsh/envs |
PATH, editor, FZF/bat config |
zsh/shell |
History, vi mode, keybindings |
zsh/aliases |
Short commands (ls, lg, cx, n) |
zsh/functions |
Utility functions (nic, yy, fip) |
zsh/init |
Tool init (starship, zoxide, fzf, direnv) |
zsh/local |
Machine-specific overrides (not in git) |
| Alias | What it does |
|---|---|
n |
Open Neovim (current dir if no args) |
nv <file> |
Open file in existing Neovim instance |
cx |
Claude Code with full permissions |
lg |
Lazygit |
t |
Attach or create tmux session |
ls / lsa / lt |
eza with icons, tree view |
ff |
fzf with bat preview |
cd |
zoxide smart navigation |
yy |
Yazi file manager (changes cwd on exit) |
| Function | What it does |
|---|---|
nic [ai] |
Open NIC dev layout |
nichl [host] |
Same layout but SSH'd into homelab |
unnic |
Tear down the layout cleanly |
fip <host> <ports> |
SSH port forwarding |
dip <ports> |
Stop port forwards |
img2jpg, img2png |
Image conversion via ImageMagick |
compress / decompress |
tar.gz helpers |
- Vi mode with cursor shape switching
- History: 32K entries, deduplication
- Completions: case-insensitive, colored, TAB cycling
- Zapmarks (
Ctrl+Z): saved command bookmarks
Migrated from LunarVim to LazyVim. Much cleaner config -- LazyVim provides excellent defaults and the custom layer is minimal.
nvim/
init.lua # bootstraps lazy.nvim
lua/config/
lazy.lua # plugin manager setup
options.lua # wrap off, nvim server socket
keymaps.lua # custom keybindings
autocmds.lua # auto-reload + diffview refresh
lua/plugins/
snacks.lua # dashboard, picker, explorer
tmux-navigator.lua # Ctrl+h/j/k/l between panes
diffview.lua # git diff with auto-refresh
undotree.lua # visual undo history
- snacks.nvim -- picker, explorer, dashboard, notifications
- blink.cmp -- fast autocompletion
- conform.nvim + nvim-lint -- formatting and linting
- flash.nvim -- jump navigation
- which-key.nvim -- keymap discovery
- noice.nvim -- better UI for messages and cmdline
- trouble.nvim -- diagnostics list
- mini.surround -- surround motions (enabled as extra)
- bufferline.nvim + lualine.nvim -- tabs and statusline
| Plugin | Purpose |
|---|---|
| vim-tmux-navigator | Ctrl+h/j/k/l between panes |
| diffview.nvim | Git diff viewer, auto-refresh |
| undotree | Visual undo history |
| Key | Mode | Action |
|---|---|---|
<leader>W |
n,i,v | Save file |
<leader>Q |
n | Close buffer |
J / K |
v | Move selected text down/up |
U |
n | Redo |
+ / - |
n | Increment / decrement number |
! @ # $ % |
n | Jump to buffer 1-5 |
<C-h/l/j/k> |
i | Arrow movement in insert mode |
<C-e> / <C-a> |
n,i | End / start of line |
<C-b> / <C-f> |
i | Word backward / forward |
<leader>a |
n | Select all |
<leader>rr |
n | Reload file |
<leader>gv |
n | Open Diffview |
<leader>gV |
n | Current file history |
<leader>ut |
n | Toggle undo tree |
A server socket is started at ~/.cache/nvim/server.pipe,
allowing external tools (like Claude Code via nv <file>)
to open files in the running Neovim instance.
| Setting | Value |
|---|---|
| Prefix | Ctrl+s (instead of Ctrl+b) |
| Split panes | | horizontal, - vertical |
| Resize panes | h/j/k/l with prefix |
| Mouse | Enabled (with pbcopy integration) |
| Vi mode | Enabled for copy mode |
| Base index | 1 (windows and panes start at 1) |
| Key | Opens |
|---|---|
g |
Lazygit in new window |
y |
Yazi file manager in new window |
b |
Btop system monitor in new window |
q |
TinyQuery launcher in new window |
t |
New window (replaces current) |
C-u |
URL picker from pane content |
- tpm -- plugin manager
- vim-tmux-navigator -- pane navigation with Neovim
- tmux-resurrect + tmux-continuum -- persist sessions
- tmux-copycat -- regex search in tmux
- tmux-open -- open URLs and files from tmux
Minimal prompt showing only what matters:
~/projects/my-app main ~1 +2
❯
- Directory: full path, no truncation
- Git branch: branch name
- Git status: modified, staged, untracked counts
- Vi mode indicator:
❯(insert) /❮(normal) - Everything else disabled
Separate starship-homelab.toml adds user@hostname
for SSH sessions.
Tiling window manager for macOS.
Config at aerospace/aerospace.toml.
| Tool | Purpose |
|---|---|
| fzf | Fuzzy finder (history, files, completions) |
| bat | Syntax-highlighted cat replacement |
| eza | Modern ls with icons and git status |
| zoxide | Smart cd that learns your directories |
| yazi | Terminal file manager |
| lazygit | Terminal git UI |
| direnv | Auto-load .envrc per project |
| ripgrep | Fast grep (used by Neovim pickers) |
| Nix | Package manager (used on homelab) |
git clone <repo> ~/config
cd ~/config
./install.shThe install script symlinks:
~/.zshrc->~/config/.zshrc~/.config/starship.toml->~/config/starship.toml~/.config/nvim->~/config/nvim~/.config/aerospace->~/config/aerospace(macOS only)
Tmux config (~/.tmux.conf) is in the repo
but linked manually.
Click to expand the original 2025 configuration
- FZF
- BAT
- EXA
Needs: fzf, ripgrep, cmake







