Personal Neovim config. Prose/Markdown/JSON-focused; leader = Space. Full rationale for anything here: CLAUDE.md. Display-line history: docs/display-line-editing.md.
| Key(s) | Vanilla | Here |
|---|---|---|
j/k/0/$ (N, V) |
logical line | display line. gj/gk/g0/g$ = original logical-line behavior |
0/$/Home/End (O, operator-pending) |
logical line | display line (so d$ only eats the visible row) |
j/k/arrows (O) |
— | logical line (unlike 0/$ above — dj/d2k act on real lines) |
dd |
delete logical line | unchanged. dr = delete display row (new, no dot-repeat/count) |
x, s, c, S, C (N, V) |
fills ""/"+ |
never touches the system clipboard (even an image/rich-text one); always lands in "-, any size |
d (any mode, any size) |
fills ""/"+ |
unchanged — the one "real cut" key |
<CR> (N) |
— | split line at cursor, stay in Insert |
<BS> (N) |
— | delete char before cursor, stay in Normal (X) |
G bare, no count (N, V) |
last line, first non-blank | last line, end of display line. {count}G unchanged |
whichwrap |
h/l stop at line ends |
h/l/arrows wrap to prev/next line |
Insert Cmd+C |
types literal chars | swallowed (<Nop>) — stops Superwhisper leaking text |
Ctrl+h/j/k/l |
— | mini.move: move line/selection (see below) |
General
| Key | Action |
|---|---|
<Leader>rc |
Reload config and plugin specs (lua/plugins/*.lua) |
<Leader>cd |
:cd to current file's directory |
<Leader>w |
Toggle wrap |
<Leader>l |
Clear search highlight + redraw |
<Leader>d / <Leader>c (N, V) |
Delete / change without yanking |
<Leader>1 |
Collapse blank-line breaks to one newline (V: selection, N: whole buffer) |
<leader>- (V) |
Spaces → dashes in selection |
Files (snacks.nvim)
| Key | Action |
|---|---|
<Leader>ff / fr / fg / fb / fe |
Find files / recent / grep / buffers / explorer |
<Leader>fR |
Rename current file (LSP-aware). If name is a date-slug, offers the buffer's first line as default |
<Leader>fD |
Delete current file + close buffer (permanent) |
Tables (vim-table-mode, markdown/text only)
| Key | Action |
|---|---|
<Leader>tm |
Toggle table mode |
<Leader>tt (V) |
Tableize selection |
<Leader>tr |
Realign table |
<Leader>tc / tR |
Copy cell / replace cell contents |
<Leader>t', ⌘' (N + I) |
Fill cell from cell above |
Tab/S-Tab (N + I, table mode on) |
Next/previous cell |
Ctrl+l (I, table mode on) |
Realign |
Lists (autolist.nvim, markdown/text only)
| Key | Action |
|---|---|
o / O |
New line, continue list |
<CR>, Tab/S-Tab (I) |
New bullet / indent+renumber |
<Leader>lr |
Force-recalculate numbering |
<Leader>ln / lp |
Cycle marker type forward/back |
<Leader>lb / lB (V) |
Bulletize selection / strip markers |
>>, <<, dd, d (V) |
Renumber after indent/delete (built-in keys, augmented) |
Move lines/selections (mini.move)
| Key | Action |
|---|---|
Ctrl+h/j/k/l (N, I) |
Move current line left/down/up/right |
Ctrl+h/l (V) |
Move selection left/right |
Ctrl+j/k (V) |
Move selection down/up — always whole logical lines |
Text objects / editing
| Key | Action |
|---|---|
gl{motion}, gll, gl (V) |
Titlecase operator (sibling to gu/gU/g~) |
sa/sd/sr/sf/sF/sh |
mini.surround: add/delete/replace/find/highlight |
ip/ap, iq/aq, is/as, etc. |
mini.ai text objects. s = sentence, newline always ends it |
Arrows, Home/End, Option+←/→ (word), Cmd+←/→ (display-line start/end);
Shift+ variants extend a selection. All display-line-based, mirroring the
j/k/0/$ swap above.
- Autosave: debounced 5s after edits, immediate on
InsertLeave/focus-lost. New unnamed buffers auto-save toOneDrive-UW/ag-buffer/on first keystroke. - aText (system text expansion) is off outside Insert mode and back on in Insert mode, so Normal-mode keystrokes can't trigger expansions. Needs the Keyboard Maestro setup below.
- Auto
:lcdto the current file's directory. - A new tab opens the Snacks dashboard if left blank.
lua/config/AG-atext-guard.lua toggles aText itself on every Insert-mode
enter/leave, and mirrors the mode into the KM variable
AGaTextNvimInsertMode (1 in Insert mode, 0 otherwise). That covers
mode switches inside VimR; KM covers switching apps. These macros (group
"__🧐🔎system monitoring [eg for turning aText on/off]") need to exist and be
enabled:
- "turn on/off aText when vimR activates …": trigger VimR activates. If
AGaTextNvimInsertModeis not1→ Execute Macro "_sub text expansions PAUSE [now aText]"; otherwise → "_sub text expansions RESUME [now aText]". - "_sub text expansions PAUSE [now aText]" / "… RESUME [now aText]":
AppleScript
tell application "aText" to disable/enable. - "turn on aText on app activation": re-enables aText when other listed apps activate. It's an allowlist; apps not on it keep whatever state aText was left in.
Claude Code's prompt has the same guard with its own variable,
AGaTextClaudeInsertMode, and a matching cmux macro: see
~/Developer/system-tools/claude-statusline/README.md. If the variable is
ever renamed again, change it in AG-atext-guard.lua (and bump the
-vN.scpt cache filenames) and in the VimR macro's condition.
lazy.nvim-managed, lua/plugins/*.lua: snacks.nvim (dashboard/picker/
explorer/rename), vim-table-mode, mini.move, autolist.nvim,
mini.surround, mini.ai. Verify against lua/plugins/ before trusting
this list — it drifts.