This commit is contained in:
Ray Elliott 2025-12-19 21:44:01 +00:00
parent 9248cf468b
commit 52e04cd8df
5 changed files with 319 additions and 2 deletions

242
KEYMAPS.md Normal file
View File

@ -0,0 +1,242 @@
# Keymap Reference
Living reference of every explicit keymap defined in this config. Use `:KeymapsGuide` to open this file inside Neovim in a floating window.
## `lua/keymaps.lua`
| Mode | Key | Description | Notes |
| --- | --- | --- | --- |
| n | `gd` | Vim goto-definition fallback | Executes `normal! gd` for tags/include jumps when no LSP |
| n | `gD` | Vim goto-declaration fallback | Executes `normal! gD` |
| n | `gr` | LSP references placeholder | `<Nop>` so LSP buffers can override cleanly |
| n | `gI` | LSP implementation placeholder | `<Nop>` so LSP buffers can override cleanly |
| n | `K` | Keyword help fallback | Uses `keywordprg` (e.g., `man`) when LSP hover is unavailable |
| n | `<leader>xx` | Diagnostics → location list | Populates current buffer diagnostics |
| n | `<leader>xX` | Diagnostics → quickfix | Populates project-wide diagnostics |
| n | `<leader>xe` | Diagnostics → buffer errors | Location list filtered to errors |
| n | `<leader>xE` | Diagnostics → all errors | Quickfix filtered to errors |
| n | `[d` | Diagnostics: previous item | Uses `vim.diagnostic.goto_prev` |
| n | `]d` | Diagnostics: next item | Uses `vim.diagnostic.goto_next` |
| n | `<leader>xd` | Diagnostic float | Opens hover window for cursor diagnostic |
| n | `<leader>xt` | Toggle diagnostics | Flips `vim.diagnostic.enable()` |
| n | `<leader>hi` | Highlight inspector | Shows highlight/capture stack under cursor |
## `lua/netrw-config.lua`
| Mode | Key | Description |
| --- | --- | --- |
| n | `<leader>te` | Open netrw in a new tab rooted at current file directory |
| n | `<leader>tE` | Open netrw in a new tab rooted at project cwd |
## `lua/plugins/lsp.lua` *(buffer-local when an LSP client attaches)*
| Mode | Key | Description |
| --- | --- | --- |
| n | `gd` | LSP: go to definition |
| n | `gr` | LSP: references |
| n | `gD` | LSP: declaration |
| n | `gI` | LSP: implementation |
| n | `K` | LSP hover |
## `lua/plugins/none-ls.lua`
| Mode | Key | Description |
| --- | --- | --- |
| n | `<leader>lt` | Toggle format-on-save flag |
| n | `<leader>lf` | Format current buffer (synchronous) |
| v | `<leader>lf` | Format visual selection |
## `lua/plugins/gitsigns.lua` *(buffer-local when inside a git repo)*
| Mode | Key | Description |
| --- | --- | --- |
| n | `]h` | Next hunk (`expr` mapping that respects `diff` windows) |
| n | `[h` | Previous hunk |
| n | `<leader>hs` | Stage current hunk |
| n | `<leader>hr` | Reset current hunk |
| v | `<leader>hs` | Stage visually selected range as hunk |
| v | `<leader>hr` | Reset visually selected range |
| n | `<leader>hS` | Stage entire buffer |
| n | `<leader>hu` | Undo last staged hunk |
| n | `<leader>hR` | Reset entire buffer |
| n | `<leader>hp` | Preview hunk |
| n | `<leader>hd` | Diff against index |
| n | `<leader>hD` | Diff against previous commit (`~`) |
| o/x | `ih` | Text object: select git hunk |
## `lua/plugins/telescope.lua`
### Launcher mappings (normal mode)
| Key | Description |
| --- | --- |
| `<leader>ff` | Find files |
| `<leader>fg` | Live grep |
| `<leader>fb` | Open buffers picker (`<C-d>` deletes buffers in picker) |
| `<leader>fh` | Help tags |
| `<leader>fr` | Recent files (oldfiles) |
| `<leader>/` | Fuzzy search current buffer |
| `<leader>fk` / `<leader>?` | Telescope keymaps picker |
| `<leader>fc` | Commands picker |
| `<leader>fs` | LSP document symbols |
| `<leader>fS` | LSP workspace symbols |
### Telescope prompt mappings (`defaults.mappings`)
| Mode | Key | Description |
| --- | --- | --- |
| i | `<C-n>` / `<C-j>` | Move selection down |
| i | `<C-p>` / `<C-k>` | Move selection up |
| i | `<C-c>` | Close picker |
| i | `<CR>` | Accept selection |
| i | `<C-x>` | Open selection in horizontal split |
| i | `<C-v>` | Open selection in vertical split |
| i | `<C-t>` | Open selection in tab |
| n | `<Esc>` | Close picker |
| n | `<CR>` | Accept selection |
| n | `<C-x>` | Horizontal split |
| n | `<C-v>` | Vertical split |
| n | `<C-t>` | New tab |
| n | `j` | Move selection down |
| n | `k` | Move selection up |
### Picker-specific overrides
| Context | Mode | Key | Description |
| --- | --- | --- | --- |
| `buffers` picker | i | `<C-d>` | Delete highlighted buffer |
## `lua/plugins/oil.lua`
### Global launcher mappings
| Mode | Key | Description |
| --- | --- | --- |
| n | `<leader>fo` | Open Oil in current window |
| n | `<leader>fO` | Open Oil in floating window |
### Oil buffer mappings (`opts.keymaps`)
| Key | Description |
| --- | --- |
| `g?` | Show Oil help |
| `<CR>` | Open entry in current window |
| `<C-s>` | Open entry in vertical split |
| `<C-h>` | Open entry in horizontal split |
| `<C-t>` | Open entry in new tab |
| `<C-p>` | Preview entry (vertical split belowright) |
| `<C-c>` | Close Oil |
| `<C-l>` | Refresh |
| `-` | Go to parent directory |
| `_` | Open Neovim cwd |
| `` ` `` | `:cd` into entry |
| `~` | `:tcd` into entry |
| `gs` | Change sort mode |
| `gx` | Open entry externally |
| `g.` | Toggle hidden files |
| `g\` | Toggle trash visibility |
## `lua/plugins/ufo.lua`
| Mode | Key | Description |
| --- | --- | --- |
| n | `zR` | Open all folds |
| n | `zM` | Close all folds |
| n | `zr` | Open folds except configured kinds |
| n | `zm` | Close folds with configured kinds |
| n | `K` | Peek fold under cursor; falls back to LSP hover |
| preview window | `<C-u>` / `<C-d>` | Scroll within UFO preview |
| preview window | `[` / `]` | Jump to top/bottom of preview |
## `lua/plugins/undotree.lua`
| Mode | Key | Description |
| --- | --- | --- |
| n | `<leader>u` | Toggle Undotree panel |
## `lua/plugins/treesitter.lua`
### Incremental selection
| Key | Description |
| --- | --- |
| `<CR>` | Initialize/expand selection |
| `<S-CR>` | Expand to scope |
| `<BS>` | Shrink selection |
### Textobject selection (`select.keymaps`)
| Key | Target |
| --- | --- |
| `af` / `if` | Function outer / inner |
| `ac` / `ic` | Class outer / inner |
| `aa` / `ia` | Parameter outer / inner |
| `ai` / `ii` | Conditional outer / inner |
| `al` / `il` | Loop outer / inner |
| `a/` | Comment outer |
### Textobject movement (`move` mappings)
| Key | Action |
| --- | --- |
| `]f` / `]F` | Next function start / end |
| `[f` / `[F` | Previous function start / end |
| `]c` / `]C` | Next class start / end |
| `[c` / `[C` | Previous class start / end |
| `]a` / `]A` | Next parameter start / end |
| `[a` / `[A` | Previous parameter start / end |
### Parameter swapping
| Key | Description |
| --- | --- |
| `<leader>a` | Swap parameter with next |
| `<leader>A` | Swap parameter with previous |
## `lua/plugins/comment.lua`
| Mapping | Description |
| --- | --- |
| `gcc` | Toggle line comment |
| `gbc` | Toggle block comment |
| `gc` | Operator-pending line comment |
| `gb` | Operator-pending block comment |
| `gcO` / `gco` / `gcA` | Insert comment above / below / end-of-line |
## `lua/plugins/surround.lua`
| Mode | Mapping | Description |
| --- | --- | --- |
| normal | `ys{motion}{char}` | Add surround to motion |
| normal | `yss` | Surround current line |
| normal | `yS` | Surround motion with linewise behavior |
| normal | `ySS` | Surround current line linewise |
| insert | `<C-g>s` | Surround following text object |
| insert | `<C-g>S` | Surround current line |
| visual | `S` | Surround selection |
| visual line | `gS` | Surround visual-line selection |
| normal | `ds{char}` | Delete surround |
| normal | `cs{old}{new}` | Change surround |
| normal | `cS{old}{new}` | Change surround (linewise) |
## `lua/plugins/cmp.lua`
| Mode | Key | Description |
| --- | --- | --- |
| insert | `<C-Space>` | Manually trigger completion |
| insert | `<CR>` | Confirm selection (selects first item by default) |
| insert | `<C-n>` | Next completion item |
| insert | `<C-p>` | Previous completion item |
| insert | `<C-e>` | Abort completion menu |
## `lua/plugins/autopairs.lua`
| Mode | Key | Description |
| --- | --- | --- |
| insert | `<M-e>` | Fast wrap the previous text with a pair |
## `lua/keymaps_reference.lua`
| Command | Description |
| --- | --- |
| `:KeymapsGuide` | Open this reference in a floating window (read-only) |

View File

@ -480,7 +480,7 @@ Source of truth for the step-by-step rebuild. Keep this concise and up to date.
- [ ] Verify linting (eslint_d, phpcs, markdownlint)
## Phase 12.6 — Final polish
- [ ] Review all keymaps and ensure they're documented
- [x] Review all keymaps and ensure they're documented (KEYMAPS.md + :KeymapsGuide)
- [ ] Update README.md with final architecture and usage
- [ ] Clean up any remaining debug code or temporary comments

View File

@ -161,6 +161,7 @@ Record every decision here with a short rationale. Append new entries; do not re
- **Validation**: Full config reload tested - all highlight groups load correctly
- **Colorscheme integration**: Native Neovim colorscheme at `colors/paper-tonic-modern.lua`
- **No overrides needed**: Modern implementation doesn't require separate override file
- 2025-12-12: Added `KEYMAPS.md` + `:KeymapsGuide` floating viewer to document every configured keymap (global + plugin-specific) grouped by source file.
## Project-Local Configuration (design)

View File

@ -8,6 +8,7 @@ require('netrw-config')
require('keymaps')
require('autocmds')
require('abbreviations')
require('keymaps_reference')
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
@ -25,4 +26,3 @@ require('lazy').setup({
{ import = 'plugins' },
},
})

74
lua/keymaps_reference.lua Normal file
View File

@ -0,0 +1,74 @@
local M = {}
local reference_filename = "KEYMAPS.md"
local reference_path = vim.fn.stdpath("config") .. "/" .. reference_filename
local function read_reference()
local lines = {}
local fd = io.open(reference_path, "r")
if not fd then
return {
("Keymap reference file not found: %s"):format(reference_path),
"Create KEYMAPS.md to document mappings.",
}
end
for line in fd:lines() do
table.insert(lines, line)
end
fd:close()
if #lines == 0 then
lines = { "KEYMAPS.md is empty." }
end
return lines
end
local function open_float(lines)
local buf = vim.api.nvim_create_buf(false, true)
vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines)
vim.bo[buf].buftype = "nofile"
vim.bo[buf].bufhidden = "wipe"
vim.bo[buf].filetype = "markdown"
vim.bo[buf].swapfile = false
vim.bo[buf].modifiable = false
local width = 0
for _, line in ipairs(lines) do
width = math.max(width, vim.fn.strdisplaywidth(line))
end
width = math.min(math.max(width + 4, 60), math.floor(vim.o.columns * 0.9))
local height = math.min(#lines, math.floor(vim.o.lines * 0.9))
if height < 10 then
height = math.min(10, vim.o.lines - 2)
end
local win_opts = {
relative = "editor",
width = width,
height = height,
row = math.floor((vim.o.lines - height) / 2),
col = math.floor((vim.o.columns - width) / 2),
style = "minimal",
border = "rounded",
}
local win = vim.api.nvim_open_win(buf, true, win_opts)
vim.keymap.set("n", "q", "<cmd>close<cr>", { buffer = buf, silent = true })
vim.keymap.set("n", "<Esc>", "<cmd>close<cr>", { buffer = buf, silent = true })
return win
end
function M.open_reference()
local lines = read_reference()
open_float(lines)
end
vim.api.nvim_create_user_command("KeymapsGuide", function()
M.open_reference()
end, { desc = "Show KEYMAPS.md in a floating window" })
return M