Neovim with LazyVim, Solarized Dark, JetBrainsMono Nerd Font

Neovim — Getting Started & Cheatsheet

LazyVim · Solarized · leader = <Space> · localleader = \ · Polish keyboard: no Alt-bindings
view full screenshot

Getting started / what you have

Stack at a glance

DistroLazyVim core (~/.config/nvim/)
Plugin managerlazy.nvim — pinned in lazy-lock.json
LSP installermason.nvim — pinned in mason-lock.json
Thememaxmx03/solarized.nvim (dark)
Completionblink.cmp
Picker / UIsnacks.nvim (replaces Telescope) + noice
Testsneotest + rspec, vitest, jest

Languages enabled

LazyVim "extras" loaded — full LSP / formatter / linter setup:

Treesitter highlighting is also on for Python and SQL (no LSP).

First-run checklist

  1. Open nvim: nvim
  2. Lazy will install plugins on first start; wait for the splash to settle.
  3. Run :checkhealth — fix any red items (clipboard, node, ripgrep).
  4. Run :Mason — confirm everything from mason-lock.json is installed.
  5. Open a file in a project to trigger LSP attach; check :LspInfo.

House rules (per CLAUDE.md)

Vim essentials / the always-there ones

Modes

Esc or Ctrl-[→ normal
i / ainsert before / after cursor
I / Ainsert at first non-blank / end of line
o / Oopen line below / above
v / V / Ctrl-vvisual char / line / block
Rreplace mode
:command-line

Files & buffers

:e <path>edit file
:w / :wawrite / write all
:q / :qaquit / quit all
:wq / ZZsave & quit
Ctrl-^switch to alternate buffer
Shift-h / Shift-lprev / next buffer (LazyVim)
bddelete buffer (keep window)

Edit / undo

u / Ctrl-rundo / redo
.repeat last change
ymotion / yyyank / yank line
dmotion / dddelete
cmotion / ccchange
p / Ppaste after / before
>> / <<indent / dedent line
=motionauto-indent range

Clipboard = system (unnamed): y/p already use the OS clipboard.

Search / replace

/pat / ?patforward / backward search
n / Nnext / previous match
* / #word under cursor → next / prev
:%s/foo/bar/greplace in file
:s/foo/bar/greplace in line / selection
srproject search/replace (grug-far)

smartcase is on: lowercase = case-insensitive, mixed = sensitive.

Windows & splits

Ctrl-w s / vsplit horizontal / vertical
Ctrl-w h/j/k/lmove between splits
Ctrl-w qclose window
Ctrl-w =equalize sizes
Ctrl-Up/Downresize height (LazyVim)
Ctrl-Left/Rightresize width (LazyVim)

New splits open right / below (your splitright/splitbelow).

Marks, registers, macros

ma / 'aset mark / jump to it
"aymotionyank into register a
"appaste from register a
qa ... qrecord macro to a
@a / @@play macro / replay last

Leader cheatsheet / = Space

Press and wait — which-key shows you the live menu. Below is the most-used subset.

Top-level most used

find file (smart picker)
/grep across project (live)
,switch buffer
:command history
efile explorer (Snacks)
Eexplorer at cwd
wwrite file
qqquit all
| / -vsplit / split
lLazy plugin UI

f — find

fffiles (root)
fFfiles (cwd)
fbbuffers
frrecent files
fggit files
fcconfig files
fpprojects

s — search

sggrep (live, project)
swgrep word under cursor
sbsearch current buffer
ssdocument symbols
sSworkspace symbols
sddiagnostics (buffer)
sDdiagnostics (workspace)
skkeymaps
shhelp tags
srgrug-far replace
s"registers

b — buffers / w — windows

bddelete buffer
bodelete other buffers
bptoggle pin
bPdelete non-pinned
bbswitch to other buffer
wddelete window
wmmaximize window toggle

u — UI toggles

uwword wrap
usspell check
ulline numbers
uLrelative numbers
uddiagnostics
ufauto-format (buffer)
uFauto-format (global)
uhinlay hints
ucconceal level
uTtreesitter

x — trouble / diagnostics

xxdocument diagnostics
xXworkspace diagnostics
xLlocation list
xQquickfix list
xtTODO / FIX / NOTE comments
]d / [dnext / prev diagnostic

Picker (Snacks) / inside the prompt

Inside any picker

Ctrl-j / Ctrl-knext / prev item
Enteropen in current window
Ctrl-xopen in horizontal split
Ctrl-vopen in vertical split
Ctrl-topen in new tab
Tabmulti-select
Ctrl-qsend to quickfix
Esc / Ctrl-cclose
?show all picker keymaps

Tip

For project-wide grep, prefer / over sg — both are live grep, but the first is the "fast lane" alias.

Start typing inside a picker; results filter as you type. Use ! at the start to negate a term. Glob-ish path filters work in file pickers ('src, !test).

LSP & code / c

LSPs are off by default. Run :LspOn <name> once per session to enable a server (e.g. :LspOn vtsls); every matching buffer in that session auto-attaches from then on. Mason packages stay installed — opt-in is instant.

For jsonls / yamlls: the schemastore.org catalog injection is also off by default. Inline $schema URLs still resolve; the full ~700-pattern catalog stays out of settings.{json,yaml}.schemas so no HTTP fetches fan out on every recognized file. Restore via a per-project .nvim.lua when catalog validation is genuinely wanted.

Navigate code

gdgo to definition
gDgo to declaration
grreferences
gIimplementation
gytype definition
Khover docs
gKsignature help

Edit code

cacode action
crrename symbol
cfformat buffer / range
cdline diagnostics
clLSP info
cmMason
cssymbols outline

Completion (blink.cmp)

Ctrl-Spacetrigger completion
Tab / Shift-Tabnext / prev item, snippet jump
Enteraccept
Ctrl-ecancel / hide menu
Ctrl-d / Ctrl-fscroll docs up / down

No <A-...> bindings — Polish diacritics policy.

Git / gitsigns + snacks

Hunks & blame

]h / [hnext / prev hunk
ghsstage hunk
ghrreset hunk
ghppreview hunk
ghbblame line (full)
ghddiff this
ghuundo stage hunk

Pickers & UI

ggLazygit (full TUI)
gbgit branches picker
glgit log
gLgit log (file)
gsgit status picker
gddiff (current file)
gffile history

CLI git uses delta as pager (Solarized Dark theme).

Tests (neotest) / rspec, vitest, jest

t menu

ttrun file
tTrun all (test files in cwd)
trrun nearest
tlrun last
tstoggle summary panel
toshow output (split)
tOshow output (panel)
tSstop
twtoggle watch

Adapter is auto-picked by filetype: *_spec.rb → rspec, *.test.ts → vitest, *.test.js → jest.

Within line / file

w / bnext / prev word start
e / genext / prev word end
0 / ^ / $line start / first non-blank / end
fx / Fxforward / back to char x
tx / Txtill char x
; / ,repeat f/t forward / back
gg / Gtop / bottom of file
{ / }prev / next paragraph
Ctrl-d / Ctrl-uhalf page down / up
zz / zt / zbcenter / top / bottom cursor

Flash (jump labels)

sFlash jump (type 2 chars, then label)
SFlash treesitter
r (op-pending)Flash remote (operate at distance)
R (op-pending/visual)Flash treesitter search

In normal mode, s is overridden by Flash. Use cl instead of substitute-char.

Jumps & tags

Ctrl-o / Ctrl-ijump back / forward
'' / ``last jump position
:jumpsjump list
:changeschange list

Text objects / v/d/c/y + object

Built-in & mini.ai

iw / awinner / a word
is / asinner / a sentence
ip / apinner / a paragraph
i" / a"inside / around quotes (also ', `)
i( / a(inside / around parens (also {}, [], <>)
it / atinside / around HTML tag

Treesitter text objects

af / ifa / inner function
ac / ica / inner class
]f / [fnext / prev function
]c / [cnext / prev class

Examples: vaf selects a function, cif changes its body, daf deletes the function.

Examples

ci"change inside quotes
da{delete a brace block
yi(yank inside parens
vapvisual-select a paragraph
gcipcomment-toggle a paragraph (Comment / ts-comments)

Mason / Lazy / managing plugins & LSPs

Lazy commands

:Lazyopen Lazy UI
:Lazy syncinstall + update + clean
:Lazy updateupdate plugins
:Lazy restorematch lazy-lock.json
:Lazy profilestartup profiling

Update workflow: :Lazy update → test → if good, commit the new lazy-lock.json.

Mason commands

:Masonopen Mason UI
:MasonInstall <pkg>install package
:MasonUpdateupdate registry
:MasonLocksnapshot current versions → mason-lock.json
:MasonLockUpdateupgrade to latest then snapshot
:MasonLockRestoreinstall pinned versions

On a new machine: nvim --headless "+MasonLockRestore" +qa to bootstrap LSPs.

LazyVim extras & news

:LazyExtrasbrowse / toggle extras (langs, etc.)
:LazyHealthLazyVim-specific health check
:Tutordisabled here
:checkhealthrun all health checks

Editor options / what's set in options.lua

-- UI
number           true          -- absolute line numbers
relativenumber   true          -- relative line numbers (hybrid)
cursorline       true
belloff          all           -- bells silenced (matches dotfiles)

-- Search
ignorecase       true
smartcase        true          -- mixed-case = case-sensitive

-- Indent — 2 spaces, expandtab
expandtab        true
tabstop          2
shiftwidth       2
softtabstop      2

-- Editing
scrolloff        4             -- keep 4 lines above/below cursor
sidescrolloff    8
splitright       true          -- :vsplit goes right
splitbelow       true          -- :split goes below
mouse            a
clipboard        unnamed       -- y/p use the system clipboard
undofile         true          -- persistent undo across restarts

-- Color
termguicolors    true
background       dark          -- Solarized Dark

Removed defaults