Jump to content

Nvim: Difference between revisions

From Archive
Expanded with hot reload details, diffview, mini.diff, statusline indicators
Add LazyVim quick reference tables for splits, buffers, navigation
 
(2 intermediate revisions by the same user not shown)
Line 44: Line 44:
* Ignores .git/, node_modules/, swap files
* Ignores .git/, node_modules/, swap files


''Triggers:''
== Lazygit Integration ==
* FocusGained, TermLeave (switching from Claude Code pane)
''Critical to the workflow.'' Lazygit is the bridge between reviewing Claude's changes and committing them.
* BufEnter, WinEnter (switching windows)
 
* CursorHold (idle cursor)
''Access from anywhere:''
* Filesystem changes in project directory
* <code><leader>gg</code> — Open lazygit in floating tmux popup (snacks.nvim)
* Works from any nvim buffer, any tmux pane
* Full-screen TUI for staging, committing, branching
 
''Why lazygit matters:''
* Claude Code makes changes → you review in diffview → stage/commit in lazygit
* Interactive staging: pick exactly which hunks to commit
* Amend commits, rebase, cherry-pick - all without leaving the terminal
* Visual branch management
* Integrates with delta for beautiful diffs
 
''Flow:''
# Claude edits files
# <code><leader>gd</code> to review in diffview
# <code><leader>gg</code> to open lazygit
# Stage changes (space), write commit message, commit (c-c)
# Back to coding


== Diffview Integration ==
== Diffview Integration ==
Review all robot changes with one keystroke.
Review all robot changes with one keystroke.
''File:'' <code>lua/plugins/claude-code-workflow.lua</code>


{| class="wikitable"
{| class="wikitable"
Line 70: Line 84:
|}
|}


''Auto-refresh:'' When Claude Code commits, diffview refreshes automatically via git-diff-hotreload watching <code>.git/</code> directory.
''Auto-refresh:'' When Claude Code commits, diffview refreshes automatically.
 
== Three-Layer AI System ==
 
# ''Copilot'' — Inline ghost text for line-level suggestions
#* Tab to accept, ]s/[s to cycle
#* No popup menus, old school ghost text
# ''Avante'' — Claude Sonnet 4 chat in sidebar
#* <code><leader>aa</code> — Ask about code
#* <code><leader>ae</code> — Edit/refactor selection
# ''Claude Code'' — Full agent in tmux pane
#* Hot reload integration
#* Diffview for reviewing changes
 
=== Copilot Keybindings ===
{| class="wikitable"
|-
! Key !! Action
|-
| <code>Tab</code> || Accept full suggestion
|-
| <code>]s</code> / <code>[s</code> || Cycle through suggestions
|-
| <code>C-Right</code> || Accept one word
|-
| <code>C-l</code> || Accept one line
|-
| <code>C-]</code> || Dismiss
|}


== Inline Git Diff ==
== Inline Git Diff ==
Line 88: Line 130:
|}
|}


Uses <code>▎</code> signs for additions/changes, clean minimal look.
== Statusline ==
 
''File:'' <code>lua/plugins/minimal-statusline.lua</code>
== Inline AI (Ghost Text) ==
''File:'' <code>lua/plugins/copilot-inline.lua</code>
 
Ghost text suggestions, not popup completions:


{| class="wikitable"
{| class="wikitable"
|-
|-
! Key !! Action
! Symbol !! Color !! Meaning
|-
|-
| <code>Tab</code> || Accept full suggestion
| <code></code> || Red || Unsaved changes
|-
|-
| <code>]s</code> / <code>[s</code> || Cycle through suggestions
| <code></code> || Green || Just reloaded by Claude Code (5 sec)
|-
|-
| <code>C-Right</code> || Accept one word
| <code>AI</code> || Gray || Copilot attached
|-
|-
| <code>C-l</code> || Accept one line
| <code>Δ</code> || Blue || Diffview open
|-
| <code>C-]</code> || Dismiss
|}
|}


''Why inline > popup:'' Ghost text for AI, completion menu for LSP. No fighting between them.
Also shows: file path (last 2 dirs + filename), line count, diagnostics, LSP icons.
 
== LSP & Formatting ==
''conform.nvim'' handles formatting with Prettier (respects project .prettierrc)
 
''Statusline shows active LSPs:''
* Vue, TypeScript, ESLint, Python, Rust, Lua icons
* Copilot filtered from display (but still active)
 
''Diagnostics:'' Error/warning/hint counts in statusline (E/W/H format)


== Yank With Context ==
== Yank With Context ==
Line 127: Line 154:
* <code><leader>ya</code> → Yank with absolute path
* <code><leader>ya</code> → Yank with absolute path


''Output format:''
''Output:'' <code>src/file.ts:42-55</code> with fenced code block
 
== Essential Plugins ==
 
=== Navigation ===
 
''Oil.nvim'' — Filesystem as a buffer
<pre>
-        Open parent directory
<CR>    Open file/directory
g.      Toggle hidden files
</pre>
 
''Harpoon'' — Quick access to marked files
<pre>
<leader>ha    Add file to harpoon
<leader>hh    Toggle harpoon menu
<leader>h1-4  Jump to file 1-4
</pre>
 
''vim-tmux-navigator'' — Seamless pane navigation
<pre>
Ctrl-h/j/k/l    Move between nvim splits AND tmux panes
</pre>
 
=== Git ===
 
''Lazygit'' — Full git TUI (see above)
<pre>
<leader>gg    Open lazygit popup
</pre>
 
''Gitsigns'' — Change indicators in sign column
 
''Git-conflict'' — Visual merge conflict handling
<pre>
<pre>
src/components/Button.tsx:15-23
co    Choose ours
```tsx
ct    Choose theirs
import { useState } from 'react'
cb    Choose both
// selected code here
[x/]x Jump between conflicts
```
</pre>
</pre>


Claude Code sees exact file + line numbers = perfect context.
=== Editing ===
 
''nvim-surround'' — Surround text objects
<pre>
ysiw"    Wrap word in quotes
cs"'    Change " to '
ds"      Delete surrounding quotes
</pre>
 
=== Focus ===
 
''Zen-mode'' — Distraction-free writing


== Statusline Indicators ==
''Twilight'' — Dim inactive code blocks
''File:'' <code>lua/plugins/minimal-statusline.lua</code>


{| class="wikitable"
== Training Mode ==
|-
! Symbol !! Color !! Meaning
|-
| <code>●</code> || Red || Unsaved changes
|-
| <code>⟳</code> || Green || Just reloaded by Claude Code (5 sec)
|-
| <code>AI</code> || Gray || Copilot attached
|-
| <code>Δ</code> || Blue || Diffview open
|}


Also shows: file path (last 2 dirs + filename), line count, diagnostics, LSP icons.
''Hardtime'' — Vim motion coaching:
* Blocks hjkl spam after 1 press
* Arrow keys disabled
* Hints for better motions


== CLI Aliases ==
== CLI Aliases ==
Line 162: Line 224:
vs    # Fuzzy find files with bat preview
vs    # Fuzzy find files with bat preview
vg    # Grep contents, fuzzy find, open file
vg    # Grep contents, fuzzy find, open file
o    # Obsidian vault fuzzy finder (sorted by recency)
o    # Obsidian vault fuzzy finder
r    # Recent files across ALL ~/code projects
r    # Recent files across ALL ~/code projects
tip  # Random tip from ~/tips.txt
</pre>
</pre>


== Plugin Stack ==
== The Complete Flow ==
''Core:''
 
* LazyVim (base, most defaults disabled)
# Write code in nvim (left pane)
* oil.nvim (filesystem as buffer)
# Claude Code refactors in right pane
* telescope (fuzzy finding)
# Files auto-reload, statusline shows ⟳
* diffview + mini.diff (git visualization)
# <code><leader>gd</code> — review changes in diffview
* harpoon (quick file switching)
# <code><leader>gg</code> — open lazygit, stage & commit
# Back to coding


''AI:''
''No context switching. No mouse. No leaving the terminal.''
* copilot.lua (ghost text)
* Claude Code CLI (separate terminal)


''Visual:''
== LazyVim Quick Reference ==
* ayu theme (dark, easy on eyes)
* twilight (dims inactive code)
* zen-mode (distraction-free)


''Workflow:''
''Mental model: Windows are viewports (where you look), buffers are files in memory (what you're editing).''
* vim-tmux-navigator (seamless pane switching)
* surround, hardtime, vimbegood


== The Magic Moment ==
=== Windows & Splits ===
Robot edits 5 files → nvim shows green ⟳ → all files refresh → <code><leader>gd</code> → review everything in diffview → back to coding.


No manual steps. Just flow.
{| class="wikitable"
|-
! Key !! Action !! Notes
|-
| <code><leader>-</code> || Split below || Stack two views
|-
| <code><leader>|</code> || Split right || Vertical split
|-
| <code><leader>wd</code> || Close current split || Keeps buffers alive
|-
| <code><leader>wm</code> || Zoom/maximize split || tmux-zoom vibe, toggle back
|-
| <code>Ctrl</code> + arrows || Resize split || Fast pane resizing
|-
| <code>Ctrl-w x</code> || Swap windows || When you like buffers but hate layout
|-
| <code>Ctrl-w o</code> || Close all other windows || Keep only current view
|}
 
=== Buffers ===
 
{| class="wikitable"
|-
! Key !! Action !! Notes
|-
| <code>Shift-h</code> / <code>Shift-l</code> || Prev/next buffer || Two-file ping-pong
|-
| <code><leader>bb</code> || Toggle other buffer || Flip between last two
|-
| <code><leader>,</code> || Buffer picker || When you have too many open
|-
| <code><leader>bo</code> || Delete other buffers || Clear mental clutter
|-
| <code><leader>bD</code> || Delete buffer AND window || Gone from everywhere
|-
| <code><leader>bp</code> / <code><leader>bP</code> || Pin buffer / nuke non-pinned || Keep active files sacred
|-
| <code><leader>bl</code> / <code><leader>br</code> || Delete buffers left/right || Brutal tabline cleanup
|}
 
=== Fast Navigation ===
 
{| class="wikitable"
|-
! Key !! Action !! Notes
|-
| <code><leader><space></code> || Find files || Open file without knowing path
|-
| <code><leader>fr</code> || Recent files || "I was just there" time machine
|-
| <code><leader>/</code> || Grep project || Find text across repo
|-
| <code><leader>sB</code> || Grep open buffers only || Search files you already have open
|-
| <code><leader>ss</code> || Jump to symbol in file || Go to function/section instantly
|-
| <code><leader>sk</code> || Search your keymaps || Meta: look up bindings
|}


== See Also ==
== See Also ==

Latest revision as of 14:00, 18 January 2026

Neovim

LazyVim + Claude Code workflow for non-Cursor open source coding

nvim dotfiles

Philosophy

Code manually in nvim (left pane) with subtle AI assistance, while Claude Code handles big refactors in a separate tmux pane (right). Robot edits files → nvim auto-reloads → review changes instantly.

┌─────────────────┬─────────────────┐
│ nvim (manual)   │ Claude Code     │
│ - Ghost text AI │ - Big refactors │
│ - Hot reload    │ - File edits    │
│ - Diffview      │ - Commits       │
└─────────────────┴─────────────────┘

Why not Cursor?

  • Nvim muscle memory preserved
  • Complete control over AI integration
  • No vendor lock-in
  • tmux + ssh workflow stays intact
  • Works on remote servers seamlessly
  • OSC52 clipboard works over SSH

Hot Reload System

The killer feature. When Claude Code edits files, nvim reloads them automatically.

Files:

  • lua/custom/directory-watcher.lua - Native fs_event monitoring
  • lua/custom/hotreload.lua - Smart buffer reload logic
  • lua/custom/git-diff-hotreload.lua - Diffview auto-refresh

How it works:

  1. Claude Code edits a file in right pane
  2. Directory watcher detects change (200ms debounce)
  3. Nvim reloads visible buffers (only if unmodified)
  4. Statusline shows green ⟳ for 5 seconds
  5. Notification: "📝 File reloaded (Claude Code edit)"

Safety:

  • Never reloads modified buffers (won't lose unsaved work)
  • Skips special buffers (neo-tree, diffview, terminals)
  • Ignores .git/, node_modules/, swap files

Lazygit Integration

Critical to the workflow. Lazygit is the bridge between reviewing Claude's changes and committing them.

Access from anywhere:

  • <leader>gg — Open lazygit in floating tmux popup (snacks.nvim)
  • Works from any nvim buffer, any tmux pane
  • Full-screen TUI for staging, committing, branching

Why lazygit matters:

  • Claude Code makes changes → you review in diffview → stage/commit in lazygit
  • Interactive staging: pick exactly which hunks to commit
  • Amend commits, rebase, cherry-pick - all without leaving the terminal
  • Visual branch management
  • Integrates with delta for beautiful diffs

Flow:

  1. Claude edits files
  2. <leader>gd to review in diffview
  3. <leader>gg to open lazygit
  4. Stage changes (space), write commit message, commit (c-c)
  5. Back to coding

Diffview Integration

Review all robot changes with one keystroke.

Key Action
<leader>gd Open diffview (review all changes)
<leader>gh File history
<leader>gc Close diffview
]c / [c Jump between changes
Tab Cycle through files

Auto-refresh: When Claude Code commits, diffview refreshes automatically.

Three-Layer AI System

  1. Copilot — Inline ghost text for line-level suggestions
    • Tab to accept, ]s/[s to cycle
    • No popup menus, old school ghost text
  2. Avante — Claude Sonnet 4 chat in sidebar
    • <leader>aa — Ask about code
    • <leader>ae — Edit/refactor selection
  3. Claude Code — Full agent in tmux pane
    • Hot reload integration
    • Diffview for reviewing changes

Copilot Keybindings

Key Action
Tab Accept full suggestion
]s / [s Cycle through suggestions
C-Right Accept one word
C-l Accept one line
C-] Dismiss

Inline Git Diff

Plugin: mini.diff - shows deleted lines inline

Key Action
gh Apply hunk
gH Reset hunk
[h / ]h Navigate hunks
<leader>go Toggle diff overlay

Statusline

File: lua/plugins/minimal-statusline.lua

Symbol Color Meaning
Red Unsaved changes
Green Just reloaded by Claude Code (5 sec)
AI Gray Copilot attached
Δ Blue Diffview open

Also shows: file path (last 2 dirs + filename), line count, diagnostics, LSP icons.

Yank With Context

Share code with Claude Code including file path:

  • <leader>yr → Yank with relative path
  • <leader>ya → Yank with absolute path

Output: src/file.ts:42-55 with fenced code block

Essential Plugins

Oil.nvim — Filesystem as a buffer

-        Open parent directory
<CR>     Open file/directory
g.       Toggle hidden files

Harpoon — Quick access to marked files

<leader>ha    Add file to harpoon
<leader>hh    Toggle harpoon menu
<leader>h1-4  Jump to file 1-4

vim-tmux-navigator — Seamless pane navigation

Ctrl-h/j/k/l    Move between nvim splits AND tmux panes

Git

Lazygit — Full git TUI (see above)

<leader>gg    Open lazygit popup

Gitsigns — Change indicators in sign column

Git-conflict — Visual merge conflict handling

co    Choose ours
ct    Choose theirs
cb    Choose both
[x/]x Jump between conflicts

Editing

nvim-surround — Surround text objects

ysiw"    Wrap word in quotes
cs"'     Change " to '
ds"      Delete surrounding quotes

Focus

Zen-mode — Distraction-free writing

Twilight — Dim inactive code blocks

Training Mode

Hardtime — Vim motion coaching:

  • Blocks hjkl spam after 1 press
  • Arrow keys disabled
  • Hints for better motions

CLI Aliases

v     # Just nvim
n     # nvim . (open with oil.nvim)
vs    # Fuzzy find files with bat preview
vg    # Grep contents, fuzzy find, open file
o     # Obsidian vault fuzzy finder
r     # Recent files across ALL ~/code projects

The Complete Flow

  1. Write code in nvim (left pane)
  2. Claude Code refactors in right pane
  3. Files auto-reload, statusline shows ⟳
  4. <leader>gd — review changes in diffview
  5. <leader>gg — open lazygit, stage & commit
  6. Back to coding

No context switching. No mouse. No leaving the terminal.

LazyVim Quick Reference

Mental model: Windows are viewports (where you look), buffers are files in memory (what you're editing).

Windows & Splits

Key Action Notes
<leader>- Split below Stack two views
Split right Vertical split
<leader>wd Close current split Keeps buffers alive
<leader>wm Zoom/maximize split tmux-zoom vibe, toggle back
Ctrl + arrows Resize split Fast pane resizing
Ctrl-w x Swap windows When you like buffers but hate layout
Ctrl-w o Close all other windows Keep only current view

Buffers

Key Action Notes
Shift-h / Shift-l Prev/next buffer Two-file ping-pong
<leader>bb Toggle other buffer Flip between last two
<leader>, Buffer picker When you have too many open
<leader>bo Delete other buffers Clear mental clutter
<leader>bD Delete buffer AND window Gone from everywhere
<leader>bp / <leader>bP Pin buffer / nuke non-pinned Keep active files sacred
<leader>bl / <leader>br Delete buffers left/right Brutal tabline cleanup

Fast Navigation

Key Action Notes
<leader><space> Find files Open file without knowing path
<leader>fr Recent files "I was just there" time machine
<leader>/ Grep project Find text across repo
<leader>sB Grep open buffers only Search files you already have open
<leader>ss Jump to symbol in file Go to function/section instantly
<leader>sk Search your keymaps Meta: look up bindings

See Also


Technical
Core Technical · CLI · Dotfiles · Nvim · SSH · VPS
Tools Sketchybar · ArchiveBox · ThinkPad Linux
Systems Automation · Personal APIs · Quantified Self
Reference Runbooks · New Computer Runbook · Syntax guide