Files
neovim-config/docs/cheatsheet/cheatsheet.html
T
rootiest 6e1c6d081a docs: add generated Vim keymap cheatsheet
Interactive single-file cheatsheet of every built-in key and this
config's live keymaps, generated by docs/cheatsheet/gen_cheatsheet.py
from $VIMRUNTIME/doc/index.txt, a headless dump of the config
(dump.lua) and curated plugin/config notes (curated/*.json).
2026-10-03 23:39:28 -04:00

1979 lines
604 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Neovim Cheatsheet</title>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="description" content="Every Vim motion, built-in key and keymap of this Neovim config, searchable and on an interactive keyboard.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,400;0,600;0,700;1,400&family=JetBrains+Mono:ital,wght@0,500;0,700;1,500&display=swap">
<script>
// Apply a saved light/dark choice before first paint (no flash of the wrong theme).
try { const t = localStorage.getItem("nvim-cheatsheet-theme"); if (t === "light" || t === "dark") document.documentElement.setAttribute("data-theme", t); } catch (e) {}
</script>
<style>
:root {
color-scheme: light;
--bg: #e8ebee;
--panel: #f5f6f8;
--ink: #15191e;
--muted: #5b6570;
--line: #d1d6dc;
--cap: #ffffff;
--cap-edge: #bfc6ce;
--accent: #0a66e8;
--accent-ink: #ffffff;
--warn: #a35a00;
--warn-bg: #fdf0dc;
--danger: #c62828;
--danger-bg: #fde4e4;
--ok: #2f7d32;
--ok-bg: #e2f3e3;
--case: linear-gradient(170deg, #f4f4f1, #d8d9d5);
--plate: #e1e3e2;
/* Source colours: who defines a key. */
--s-builtin: #6b7480;
--s-neovim: #0f8a7e;
--s-config: #d6336c;
--s-plugin: #6a48d7;
/* Category hues (see CAT_HUE in the script). */
--h1: #1f6feb; --h2: #0f8a7e; --h3: #d1462f; --h4: #2f8a3a; --h5: #7c4ddb; --h6: #b7791f; --h7: #4b55d6;
--h8: #c03aa8; --h9: #0e7fa0; --h10: #6f7d17; --h11: #d6336c; --h12: #8a5a2b; --h13: #6b7280;
--sans: "Atkinson Hyperlegible Next", "Atkinson Hyperlegible", system-ui, sans-serif;
--mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
color-scheme: dark;
--bg: #111418; --panel: #191d22; --ink: #e6e9ed; --muted: #8e97a2; --line: #2a3038;
--cap: #252b32; --cap-edge: #0a0c0f; --accent: #4f9bff; --accent-ink: #0b1220;
--warn: #f0b35c; --warn-bg: #33270f; --danger: #ff6b6b; --danger-bg: #3a1a1c; --ok: #7ccc6c; --ok-bg: #18301a;
--case: linear-gradient(170deg, #22272e, #15191e); --plate: #0e1114;
--s-builtin: #8e97a2; --s-neovim: #3cc7b8; --s-config: #ff5c8f; --s-plugin: #a497ff;
--h1: #5ea1ff; --h2: #3cc7b8; --h3: #ff7a5c; --h4: #7ccc6c; --h5: #b197ff; --h6: #e8b44c; --h7: #8f96ff;
--h8: #e070cf; --h9: #4fc3dc; --h10: #b5c85a; --h11: #ff5c8f; --h12: #d6a06a; --h13: #8e97a2;
}
}
:root[data-theme="dark"] {
color-scheme: dark;
--bg: #111418; --panel: #191d22; --ink: #e6e9ed; --muted: #8e97a2; --line: #2a3038;
--cap: #252b32; --cap-edge: #0a0c0f; --accent: #4f9bff; --accent-ink: #0b1220;
--warn: #f0b35c; --warn-bg: #33270f; --danger: #ff6b6b; --danger-bg: #3a1a1c; --ok: #7ccc6c; --ok-bg: #18301a;
--case: linear-gradient(170deg, #22272e, #15191e); --plate: #0e1114;
--s-builtin: #8e97a2; --s-neovim: #3cc7b8; --s-config: #ff5c8f; --s-plugin: #a497ff;
--h1: #5ea1ff; --h2: #3cc7b8; --h3: #ff7a5c; --h4: #7ccc6c; --h5: #b197ff; --h6: #e8b44c; --h7: #8f96ff;
--h8: #e070cf; --h9: #4fc3dc; --h10: #b5c85a; --h11: #ff5c8f; --h12: #d6a06a; --h13: #8e97a2;
}
* { box-sizing: border-box; }
[hidden] { display: none !important; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
body { margin: 0; background: var(--bg); color: var(--ink); font: 16px/1.5 var(--sans); overflow-x: hidden; }
.wrap { max-width: 1240px; margin: 0 auto; padding: 32px 16px 64px; display: grid; gap: 48px; min-width: 0; }
.wrap > * { min-width: 0; }
@media (min-width: 720px) { .wrap { padding-inline: 20px; } }
h1, h2, h3 { font-family: var(--mono); letter-spacing: -0.02em; margin: 0; text-wrap: balance; }
h1 { font-size: clamp(1.75rem, 4vw, 2.5rem); line-height: 1.1; }
h2 { font-size: 1.35rem; }
h3 { font-size: 0.95rem; }
p { margin: 0; }
a { color: var(--accent); }
code { font: 500 0.85em var(--mono); overflow-wrap: anywhere; }
.muted { color: var(--muted); }
kbd {
font: 700 0.8em/1 var(--mono); display: inline-block; min-width: 1.7em; text-align: center; white-space: nowrap;
padding: 0.35em 0.45em 0.3em; border-radius: 5px; background: var(--cap); color: var(--ink);
border: 1px solid var(--line); border-bottom: 3px solid var(--cap-edge);
}
button { font: inherit; color: inherit; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.skip { position: absolute; left: 16px; top: -60px; background: var(--accent); color: var(--accent-ink); padding: 8px 14px; border-radius: 8px; z-index: 20; }
.skip:focus { top: 12px; }
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* ---- Header ---------------------------------------------------------- */
header { display: grid; gap: 18px; }
.eyebrow { font: 600 0.75rem/1.4 var(--mono); letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); }
.titlebar { display: flex; flex-wrap: wrap; gap: 12px 24px; align-items: end; justify-content: space-between; }
nav { display: flex; gap: 8px 16px; flex-wrap: wrap; font-size: 0.95rem; }
nav a { color: var(--accent); text-decoration: none; font-weight: 600; }
nav a:hover { text-decoration: underline; }
.seg { display: inline-flex; border: 1px solid var(--line); border-radius: 9px; overflow: hidden; background: var(--panel); flex: none; }
.seg button { border: 0; background: transparent; padding: 6px 12px; cursor: pointer; font-size: 0.85rem; font-weight: 600; }
.seg button + button { border-left: 1px solid var(--line); }
.seg button[aria-pressed="true"] { background: var(--accent); color: var(--accent-ink); }
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; list-style: none; margin: 0; padding: 0; }
.stats li { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; display: grid; gap: 4px; align-content: start; }
.stats b { font: 700 1.5rem/1.1 var(--mono); font-variant-numeric: tabular-nums; }
.stats span { font-size: 0.85rem; color: var(--muted); }
.stats kbd { font-size: 0.9rem; }
/* ---- Shared bits ------------------------------------------------------- */
.stack { display: grid; gap: 16px; }
.lede { color: var(--muted); max-width: 75ch; }
.search { display: flex; align-items: center; gap: 10px; background: var(--cap); border: 1.5px solid var(--line); border-radius: 10px; padding: 0 14px; min-width: 0; }
.search:focus-within { border-color: var(--accent); }
.search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--ink); font: 500 1.1rem var(--mono); padding: 11px 0; }
.search input::placeholder { color: var(--muted); font-family: var(--sans); font-weight: 400; }
.search svg { flex: none; color: var(--muted); }
.count { font: 500 0.85rem var(--mono); color: var(--muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
.chips { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: thin; align-items: center; }
.chips.wrapchips { flex-wrap: wrap; overflow: visible; }
.chips > .lbl { flex: none; font: 600 0.72rem var(--mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-right: 4px; }
.chip { flex: none; border: 1px solid var(--line); background: var(--panel); border-radius: 99px; padding: 4px 11px; font-size: 0.85rem; cursor: pointer; white-space: nowrap; }
.chip[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.chip span { opacity: 0.65; font-variant-numeric: tabular-nums; margin-left: 4px; }
.chip i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--dot, var(--muted)); margin-right: 6px; vertical-align: 1px; }
.toggle { display: inline-flex; gap: 6px; align-items: center; cursor: pointer; font-size: 0.9rem; flex: none; }
.toggle input { accent-color: var(--accent); width: 16px; height: 16px; }
.empty { padding: 32px 0; text-align: center; color: var(--muted); }
.compose { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; padding: 10px 14px; border-radius: 10px; border: 1px dashed var(--accent); background: color-mix(in oklab, var(--accent) 7%, var(--panel)); font-size: 0.95rem; }
.compose .keys kbd { font-size: 0.85rem; }
.toast {
position: fixed; left: 50%; bottom: calc(24px + env(safe-area-inset-bottom, 0px)); transform: translateX(-50%);
background: var(--ink); color: var(--bg); padding: 10px 18px; border-radius: 99px; font-weight: 600; z-index: 30;
max-width: calc(100vw - 32px); text-align: center;
}
.btn { border: 1px solid var(--line); background: var(--panel); border-radius: 8px; padding: 6px 12px; cursor: pointer; font-size: 0.85rem; font-weight: 600; }
.btn:hover { border-color: var(--accent); }
.btn.big { padding: 10px 20px; font-size: 0.95rem; justify-self: center; }
/* Key sequences rendered as keycaps */
.keys { display: inline-flex; flex-wrap: wrap; gap: 3px; align-items: center; min-width: 0; vertical-align: middle; }
.keys kbd { font-size: 0.85rem; }
.keys .combo { display: inline-flex; gap: 1px; align-items: center; }
.keys kbd.mod { font-size: 0.68rem; color: var(--muted); padding-inline: 0.4em; }
.keys kbd.named { font-size: 0.74rem; }
.keys kbd.lead { background: color-mix(in oklab, var(--s-config) 18%, var(--cap)); border-color: color-mix(in oklab, var(--s-config) 55%, var(--line)); display: inline-flex; flex-direction: column; gap: 2px; padding-block: 0.25em 0.2em; }
.keys kbd.lead small { font: 600 0.55rem/1 var(--sans); text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); }
.keys .ph { font: italic 500 0.8rem var(--mono); color: var(--muted); border: 1px dashed var(--line); border-radius: 5px; padding: 2px 6px; }
.keys .reg { font: 500 0.75rem var(--mono); color: var(--muted); border: 1px dashed var(--line); border-radius: 5px; padding: 2px 5px; opacity: 0.85; }
.keys .exk { font: 700 0.95rem var(--mono); }
.keys .exk .opt { color: var(--muted); font-weight: 500; }
.badge { display: inline-flex; align-items: center; font: 600 0.68rem/1 var(--mono); padding: 3px 6px; border-radius: 5px; border: 1px solid var(--line); color: var(--muted); white-space: nowrap; }
.badge.m { min-width: 1.9em; justify-content: center; }
.src { display: inline-flex; align-items: center; gap: 5px; font: 600 0.72rem/1.2 var(--sans); padding: 3px 8px; border-radius: 99px; white-space: nowrap;
color: var(--sc); background: color-mix(in oklab, var(--sc) 13%, transparent); border: 1px solid color-mix(in oklab, var(--sc) 40%, transparent); }
.src.builtin { --sc: var(--s-builtin); } .src.neovim { --sc: var(--s-neovim); } .src.config { --sc: var(--s-config); } .src.plugin { --sc: var(--s-plugin); }
.catb { display: inline-flex; align-items: center; gap: 5px; font-size: 0.75rem; color: var(--muted); white-space: nowrap; }
.catb::before { content: ""; width: 8px; height: 8px; border-radius: 2px; background: var(--cat); }
.ctx { font-size: 0.75rem; color: var(--muted); border: 1px dashed var(--line); border-radius: 99px; padding: 2px 8px; white-space: nowrap; }
.flag { display: inline-block; font: 600 0.75rem/1.35 var(--sans); padding: 3px 8px; border-radius: 6px; color: var(--warn); background: var(--warn-bg); }
.flag.rep { color: var(--muted); background: color-mix(in oklab, var(--muted) 12%, transparent); }
.flag.over { color: var(--s-config); background: color-mix(in oklab, var(--s-config) 12%, transparent); }
.flag.dead { color: var(--danger); background: var(--danger-bg); }
.flag.info { color: var(--muted); background: transparent; border: 1px solid var(--line); }
.flag b { font-weight: 700; }
.flag code { font-size: 0.72rem; }
.flag s { opacity: 0.8; font-weight: 500; }
/* ---- Finder rows -------------------------------------------------------- */
.finder { position: sticky; top: 0; z-index: 5; background: var(--bg); padding: 12px 0 10px; display: grid; gap: 10px; border-bottom: 1px solid var(--line); }
.searchrow { display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: center; min-width: 0; }
.searchrow .search { flex: 1 1 260px; }
.filters { display: grid; gap: 8px; }
.opts { display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center; font-size: 0.9rem; }
.opts .seg button { font-size: 0.82rem; padding: 6px 11px; }
.scopehint { font-size: 0.85rem; color: var(--muted); flex: 1 1 240px; min-width: 0; }
.sel { font: 500 0.85rem var(--sans); color: var(--ink); background: var(--panel); border: 1px solid var(--line); border-radius: 99px; padding: 4px 10px; cursor: pointer; flex: none; max-width: 100%; }
.sel.on { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
@media (min-width: 720px) { .chips.wrapwide { flex-wrap: wrap; overflow: visible; } }
.chips, .tabs, .wsubs { scrollbar-color: var(--line) transparent; }
@media (max-width: 560px) {
/* Phones: tab rows and window chips scroll sideways instead of stacking 4–10 rows deep. */
.tabs, .wsubs { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: thin; padding-bottom: 4px; }
.tab, .wsubs .chip { flex: none; }
#scope { display: grid; grid-template-columns: 1fr 1fr; width: 100%; gap: 1px; background: var(--line); }
#scope button + button { border-left: 0; }
#scope button:not([aria-pressed="true"]) { background: var(--panel); }
}
.results { display: grid; gap: 6px; }
.rcat { margin: 14px 0 2px; display: flex; gap: 8px; align-items: center; font: 600 0.78rem var(--mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); }
.rcat::before { content: ""; width: 10px; height: 10px; border-radius: 3px; background: var(--cat); }
.rcat:first-child { margin-top: 0; }
.row { display: grid; grid-template-columns: minmax(96px, 180px) minmax(0, 1fr); gap: 4px 16px; padding: 9px 12px; background: var(--panel); border: 1px solid var(--line); border-radius: 10px; border-left: 4px solid var(--cat, var(--line)); align-items: start; }
.row.dimmed .rd { text-decoration: line-through; text-decoration-color: color-mix(in oklab, var(--muted) 70%, transparent); color: var(--muted); }
.rb { display: grid; gap: 5px; min-width: 0; }
.rd { font-size: 0.97rem; overflow-wrap: anywhere; }
.rm { display: flex; flex-wrap: wrap; gap: 5px 8px; align-items: center; }
.rm .fl { font: 500 0.74rem var(--mono); color: var(--muted); }
.rm a { font: 500 0.74rem var(--mono); text-decoration: none; }
.rm a:hover { text-decoration: underline; }
.rflags { display: flex; flex-wrap: wrap; gap: 5px; }
.rn { font-size: 0.86rem; color: var(--muted); overflow-wrap: anywhere; }
.rn kbd { font-size: 0.75rem; }
.rf { display: flex; flex-wrap: wrap; gap: 4px 12px; align-items: center; font: 500 0.75rem var(--mono); color: var(--muted); }
.rf a { text-decoration: none; }
.rf a:hover { text-decoration: underline; }
.copy { border: 1px solid var(--line); background: transparent; border-radius: 5px; padding: 1px 6px; cursor: pointer; font: 500 0.72rem var(--mono); color: var(--muted); }
.copy:hover { color: var(--ink); border-color: var(--accent); }
.keys .alt { color: var(--muted); font-size: 0.8rem; margin: 0 2px; }
@media (max-width: 640px) { .row { grid-template-columns: minmax(0, 1fr); } }
/* ---- What's different -------------------------------------------------- */
.notes { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 290px), 1fr)); gap: 22px 28px; font-size: 0.92rem; }
.notes > div { border-top: 3px solid var(--kind, var(--line)); padding-top: 10px; display: grid; gap: 6px; align-content: start; min-width: 0; }
.notes .change { --kind: var(--accent); } .notes .warn { --kind: var(--warn); } .notes .tip { --kind: var(--ok); }
.notes b.t { font-family: var(--mono); font-size: 0.8rem; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.notes b.t em { font-style: normal; font-size: 0.65rem; padding: 2px 6px; border-radius: 4px; color: var(--kind); border: 1px solid var(--kind); letter-spacing: 0.08em; }
.notes p { color: var(--muted); font-size: 0.85rem; }
.notes p.lead { color: var(--ink); font-size: inherit; }
.notes dl { display: grid; grid-template-columns: fit-content(48%) minmax(0, 1fr); gap: 5px 14px; margin: 2px 0 4px; align-items: center; }
.notes dt { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.notes dd { margin: 0; overflow-wrap: anywhere; }
.notes kbd { font-size: 0.75rem; }
.difflists { display: grid; gap: 10px; }
.dl { display: grid; gap: 10px; }
.dl > p { color: var(--muted); font-size: 0.9rem; max-width: 80ch; }
details.dl { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 4px 16px; }
details.dl[open] { padding-bottom: 14px; }
details.dl > summary { cursor: pointer; padding: 10px 0; list-style-position: outside; margin-left: 18px; }
details.dl > summary h3 { display: inline-flex; gap: 10px; align-items: baseline; }
#notemore { justify-self: start; }
.dgroup { display: grid; gap: 2px; }
.dgroup h4 { margin: 10px 0 4px; font: 600 0.8rem var(--mono); text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); display: flex; gap: 8px; align-items: center; }
.drow { display: grid; grid-template-columns: minmax(110px, 190px) minmax(0, 1fr); gap: 4px 16px; padding: 8px 0; border-top: 1px solid var(--line); align-items: start; font-size: 0.92rem; }
.drow .was { color: var(--muted); text-decoration: line-through; text-decoration-color: color-mix(in oklab, var(--danger) 60%, transparent); }
.drow .arrow { color: var(--muted); margin: 0 6px; }
.drow .meta { display: flex; gap: 6px 10px; flex-wrap: wrap; align-items: center; margin-top: 3px; font: 500 0.72rem var(--mono); color: var(--muted); }
details.more > summary { cursor: pointer; color: var(--accent); font-weight: 600; font-size: 0.9rem; padding: 6px 0; }
@media (max-width: 560px) { .drow { grid-template-columns: minmax(0, 1fr); } }
/* ---- Keyboard ---------------------------------------------------------- */
.layers { display: grid; gap: 14px; }
.tabs { display: flex; flex-wrap: wrap; gap: 6px; }
.tab { display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--line); background: var(--panel); border-radius: 8px; padding: 7px 13px; cursor: pointer; font-weight: 600; font-size: 0.92rem; }
.tab i { width: 10px; height: 10px; border-radius: 50%; background: var(--led); box-shadow: 0 0 8px var(--led); }
.tab[aria-selected="true"] { border-color: var(--led); background: color-mix(in oklab, var(--led) 16%, var(--panel)); }
.layer-meta { display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center; font-size: 0.95rem; }
.layer-meta .grow { flex: 1 1 280px; }
.legend { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: 0.85rem; }
.legend span { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); }
.legend span.c::before { content: ""; width: 12px; height: 12px; border-radius: 3px; background: color-mix(in oklab, var(--cat) 35%, var(--cap)); border: 1px solid var(--cat); }
.legend .mk { position: static; }
.board { overflow-x: auto; padding-bottom: 6px; -webkit-overflow-scrolling: touch; }
.case { min-width: 900px; background: var(--case); border-radius: 18px; padding: 1.2%; border: 1px solid var(--line);
box-shadow: inset 0 1px 0 color-mix(in oklab, #fff 50%, transparent), 0 12px 30px -16px rgba(0,0,0,.45); }
.kb { position: relative; container-type: inline-size; aspect-ratio: 18.25 / 6.25; background: var(--plate); border-radius: 8px; box-shadow: inset 0 1px 3px rgba(0,0,0,.14); }
.key { position: absolute; padding: 0.14%; margin: 0; border: 0; background: none; cursor: pointer; text-align: left; color: inherit; }
.key > .cap {
--cat: var(--h13);
position: relative; width: 100%; height: 100%; border-radius: 0.55cqw; background: var(--cap); color: var(--ink);
border: 1px solid var(--line); border-bottom-width: 0.35cqw; border-bottom-color: var(--cap-edge);
display: flex; flex-direction: column; justify-content: space-between; padding: 0.35cqw 0.45cqw 0.3cqw;
overflow: hidden; transition: opacity .15s, transform .08s;
}
.key .g { font: 700 1.3cqw/1.1 var(--mono); white-space: nowrap; }
.key .g small { font-size: 0.75em; color: var(--muted); font-weight: 500; }
.key .lb { font: 600 0.95cqw/1.12 var(--sans); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow-wrap: break-word; hyphens: auto; }
.key.tint > .cap { background: color-mix(in oklab, var(--cat) 24%, var(--cap)); border-color: color-mix(in oklab, var(--cat) 60%, transparent); border-bottom-color: color-mix(in oklab, var(--cat) 50%, var(--cap-edge)); }
.key.none > .cap { opacity: 0.4; }
.key.none .lb { display: none; }
.key.modkey > .cap { background: color-mix(in oklab, var(--muted) 22%, var(--cap)); justify-content: center; }
.key.modkey .g { font-size: 1.05cqw; color: var(--muted); }
.key.modkey[aria-pressed="true"] > .cap { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
.key.modkey[aria-pressed="true"] .g { color: var(--accent-ink); }
.key.dead .lb { text-decoration: line-through; }
.key:hover > .cap, .key:focus-visible > .cap, .key.cur > .cap { opacity: 1; outline: 2px solid var(--accent); outline-offset: -1px; }
.key:focus-visible { outline: none; }
.key:active > .cap { transform: translateY(1px); }
.mk { position: absolute; top: 0.35cqw; right: 0.4cqw; width: 0.85cqw; height: 0.85cqw; min-width: 7px; min-height: 7px; border-radius: 50%; display: inline-block; }
.mk.live { background: var(--mkc, var(--s-config)); box-shadow: 0 0 0 1px var(--cap); }
.mk.builtin { border: 1.5px solid var(--s-builtin); }
.mk.group { border-radius: 2px; background: transparent; border: 1.5px dashed var(--muted); }
.mk.wait { box-shadow: 0 0 0 2px var(--warn); }
.legend .mk { width: 10px; height: 10px; }
.keyinfo { min-height: 7em; background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; display: grid; gap: 10px; font-size: 0.95rem; }
.ki-head { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; }
.ki-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ki-list li { display: grid; gap: 4px; padding-top: 8px; border-top: 1px solid var(--line); }
.ki-list li:first-child { border-top: 0; padding-top: 0; }
.ki-list .top { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; }
.ki-list .was { text-decoration: line-through; color: var(--muted); }
.kids { display: flex; flex-wrap: wrap; gap: 6px; }
.kid { display: inline-flex; gap: 6px; align-items: center; border: 1px solid var(--line); border-radius: 8px; padding: 3px 8px 3px 4px; font-size: 0.82rem; background: var(--bg); }
.kid .keys kbd { font-size: 0.72rem; }
/* ---- Leader tree -------------------------------------------------------- */
.ltree { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 14px; align-items: start; }
.lcard { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 14px 16px; display: grid; grid-template-columns: max-content minmax(0, 1fr) auto; gap: 6px 10px; border-top: 4px solid var(--cat, var(--line)); min-width: 0; align-content: start; }
.lcard > header, .lcard > h4 { grid-column: 1 / -1; }
.lcard header { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 2px; }
.lcard header .keys kbd { font-size: 0.8rem; }
.lcard h3 { font-size: 1rem; }
.lcard h4 .keys { text-transform: none; }
.lcard h4 { margin: 6px 0 0; font: 600 0.72rem var(--mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); display: flex; gap: 6px; align-items: center; }
.litem { grid-column: 1 / -1; display: grid; grid-template-columns: subgrid; align-items: center; font-size: 0.9rem; padding: 1px 0; }
.litem .keys kbd { font-size: 0.72rem; }
.litem .ms { display: flex; gap: 3px; }
/* ---- Composer ----------------------------------------------------------- */
.composer { display: grid; gap: 14px; background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 16px; }
.crow { display: grid; grid-template-columns: 110px minmax(0, 1fr); gap: 8px 14px; align-items: start; }
.crow > .lbl { font: 600 0.75rem var(--mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); padding-top: 6px; }
.crow .chips { flex-wrap: wrap; overflow: visible; }
.crow .chip { font-family: var(--mono); }
.crow .chip.mini { border-style: dashed; }
.crow .chip small { font-family: var(--sans); opacity: 0.75; margin-left: 5px; }
.crow input[type="number"] { width: 5em; font: 500 1rem var(--mono); padding: 5px 8px; border-radius: 8px; border: 1px solid var(--line); background: var(--cap); color: var(--ink); }
.cout { display: grid; gap: 8px; padding: 16px; border-radius: 10px; background: var(--bg); border: 1px solid var(--line); }
.cout .keys kbd { font-size: 1.15rem; }
.cout .keys .ph { font-size: 1rem; }
.cout p.sent { font-size: 1.1rem; }
.cout p.sent b { color: var(--accent); }
@media (max-width: 560px) { .crow { grid-template-columns: minmax(0, 1fr); } .crow > .lbl { padding-top: 0; } }
/* ---- Plugin windows / commands ------------------------------------------ */
.wtools { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: center; }
.wtools .search { flex: 1 1 280px; }
.wtools .search input { font-size: 1rem; padding: 8px 0; }
.wtabs .tab span { font: 500 0.75rem var(--mono); color: var(--muted); font-variant-numeric: tabular-nums; }
.wsubs { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.wsubs .chip { font-size: 0.8rem; padding: 3px 10px; }
.wpanel { display: grid; gap: 22px; }
.wgroup { display: grid; gap: 6px; scroll-margin-top: 16px; }
.wgroup h3 { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.wgroup > .lede { font-size: 0.9rem; }
.wlist { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr)); gap: 0 28px; }
.witem { display: grid; grid-template-columns: 7.2em minmax(0, 1fr); gap: 10px; padding: 6px 0; border-top: 1px solid var(--line); font-size: 0.9rem; align-items: start; }
.witem .keys kbd { font-size: 0.72rem; }
.witem .act { display: grid; gap: 2px; min-width: 0; }
.witem .chain { font: 500 0.75rem var(--mono); color: var(--muted); overflow-wrap: anywhere; }
.witem .ms { display: inline-flex; gap: 3px; margin-left: 6px; vertical-align: 1px; }
.witem .rn { font-size: 0.82rem; }
.clist { display: grid; gap: 0; }
.crow2 { display: grid; grid-template-columns: minmax(120px, 220px) minmax(0, 1fr); gap: 4px 16px; padding: 8px 0; border-top: 1px solid var(--line); font-size: 0.92rem; }
.crow2 .cn { font: 700 0.92rem var(--mono); overflow-wrap: anywhere; }
.crow2 .meta { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; margin-top: 3px; font: 500 0.72rem var(--mono); color: var(--muted); }
@media (max-width: 560px) { .crow2, .witem { grid-template-columns: minmax(0, 1fr); } }
footer { font-size: 0.85rem; color: var(--muted); }
footer code { font-size: 0.8rem; }
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
*, *::before, *::after { transition: none !important; animation: none !important; }
}
</style>
</head>
<body>
<a class="skip" href="#find">Skip to the key finder</a>
<div class="wrap">
<header>
<div class="eyebrow" id="eyebrow">Rootiest Neovim</div>
<div class="titlebar">
<h1>Vim keys &amp; keymaps</h1>
<div class="seg" id="theme" role="group" aria-label="Colour theme">
<button type="button" data-theme-set="auto" aria-pressed="true">Auto</button>
<button type="button" data-theme-set="light" aria-pressed="false">Light</button>
<button type="button" data-theme-set="dark" aria-pressed="false">Dark</button>
</div>
</div>
<nav aria-label="Sections">
<a href="#different">What's different</a><a href="#keyboard">Keyboard</a><a href="#leader">Leader keys</a>
<a href="#find">Find any key</a><a href="#composer">Text objects</a><a href="#windows">Plugin windows</a><a href="#commands">Commands</a>
</nav>
<ul class="stats" id="stats"></ul>
</header>
<section id="different" class="stack" aria-labelledby="h-different">
<h2 id="h-different">What's different here</h2>
<p class="lede">How this config changes stock Vim. Cards first, then lists worked out from the live keymaps.</p>
<div class="chips" id="notechips" role="group" aria-label="Filter cards by kind"></div>
<div class="notes" id="notecards"></div>
<button type="button" class="btn big" id="notemore" hidden></button>
<div class="difflists" id="difflists"></div>
</section>
<section id="keyboard" class="layers" aria-labelledby="h-keyboard">
<h2 id="h-keyboard">Keyboard</h2>
<p class="lede">What every key does in each mode or after each prefix. Hover or focus a key for details; click it to look it up in the finder. Click <kbd>Shift</kbd> or <kbd>Ctrl</kbd> on the board to hold them.</p>
<div class="tabs" id="kbtabs" role="tablist" aria-label="Keyboard layers"></div>
<div class="layer-meta">
<p class="grow" id="layermeta"></p>
<div class="seg" id="aiswitch" role="group" aria-label="Text object scope" hidden>
<button type="button" data-ai="i" aria-pressed="true">i · inside</button>
<button type="button" data-ai="a" aria-pressed="false">a · around</button>
</div>
</div>
<div class="legend" id="kblegend"></div>
<div class="board"><div class="case"><div class="kb" id="kb" role="group" aria-label="Keyboard"></div></div></div>
<div class="keyinfo" id="keyinfo" aria-live="polite"></div>
</section>
<section id="leader" class="stack" aria-labelledby="h-leader">
<h2 id="h-leader">Leader keys</h2>
<p class="lede" id="leaderintro"></p>
<div class="ltree" id="ltree"></div>
</section>
<section id="find" class="stack" aria-labelledby="h-find">
<h2 id="h-find">Find any key</h2>
<p class="lede">Every built-in key, Neovim default, plugin map and your own maps in one list. Search by keys (<code>ctrl-w</code>, <code>&lt;C-w&gt;</code>, <code>^w</code>, <code>space f</code>, <code>leader f</code>) or by words. Start with <code>:</code> to search Ex commands.</p>
<div class="finder">
<div class="searchrow">
<label class="search" for="q">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-4-4"/></svg>
<input id="q" type="search" autocomplete="off" spellcheck="false" autocapitalize="off" placeholder="Keys or words — e.g. gU, ctrl-w v, leader f, delete word, :sort" aria-label="Search keys and keymaps" aria-controls="results">
<kbd title="Press / to focus">/</kbd>
</label>
<span class="count" id="count" aria-live="polite"></span>
</div>
<div class="chips" id="modechips" role="group" aria-label="Filter by mode"></div>
</div>
<div class="filters">
<div class="opts">
<div class="seg" id="scope" role="group" aria-label="Which keys to list">
<button type="button" data-scope="starter" aria-pressed="true" title="Essentials plus everything your config adds or changes. Typing a search looks through everything.">Essentials + my changes</button>
<button type="button" data-scope="ess" aria-pressed="false">Essentials</button>
<button type="button" data-scope="chg" aria-pressed="false">Changed by my config</button>
<button type="button" data-scope="all" aria-pressed="false">Everything</button>
</div>
<span class="scopehint" id="scopehint"></span>
<button type="button" class="btn" id="reset">Reset filters</button>
</div>
<div class="chips wrapwide" id="srcchips" role="group" aria-label="Filter by source"></div>
<div class="chips wrapwide" id="catchips" role="group" aria-label="Filter by category"></div>
</div>
<div class="results" id="results"></div>
<button type="button" class="btn big" id="more" hidden>Show more</button>
</section>
<section id="composer" class="stack" aria-labelledby="h-composer">
<h2 id="h-composer">Text-object composer</h2>
<p class="lede" id="composerintro">Pick an operator and a text object to see the keys and what they do.</p>
<div class="composer" id="comp"></div>
</section>
<section id="windows" class="stack" aria-labelledby="h-windows">
<h2 id="h-windows">Inside plugin windows</h2>
<p class="lede">Keys that only work inside a plugin's own window, menu or buffer, from your live config. Pick a group, then jump to one window with the chips below it, or search them all.</p>
<div class="wtools">
<label class="search" for="wq">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-4-4"/></svg>
<input id="wq" type="search" autocomplete="off" spellcheck="false" autocapitalize="off" placeholder="Search every plugin window — e.g. ctrl-q, split, stage" aria-label="Search keys in plugin windows">
</label>
<span class="count" id="wcount" aria-live="polite"></span>
</div>
<div class="tabs wtabs" id="wtabs" role="tablist" aria-label="Plugin window groups"></div>
<div class="wsubs" id="wsubs" role="group" aria-label="Windows in this group"></div>
<div class="wpanel" id="wpanel" role="tabpanel"></div>
</section>
<section id="commands" class="stack" aria-labelledby="h-commands">
<h2 id="h-commands">Commands</h2>
<p class="lede">User and plugin <code>:commands</code> defined by this config. Built-in Ex commands are in the finder (choose <b>Ex commands</b> or type <code>:</code>).</p>
<div class="searchrow">
<label class="search" for="cq">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-4-4"/></svg>
<input id="cq" type="search" autocomplete="off" spellcheck="false" autocapitalize="off" placeholder="Filter commands — e.g. git, box, Mason" aria-label="Filter commands">
</label>
<span class="count" id="ccount" aria-live="polite"></span>
</div>
<div class="chips wrapwide" id="cchips" role="group" aria-label="Filter commands by source"></div>
<div class="clist" id="clist"></div>
</section>
<footer>Generated from <code>index.txt</code>, your live config and <code>curated/*.json</code> by <code>gen_cheatsheet.py</code>.</footer>
</div>
<div class="toast" id="toast" role="status" hidden></div>
<script>
"use strict";
const DATA = {"meta":{"version":"0.12.5+v0.12.5","leader":" ","localleader":"\\","date":"2026-10-03","plugins":["blink-copilot","blink.cmp","blink.lib","catppuccin","comment-box","conform","flash","focusline.nvim","friendly-snippets","gitsigns","grug-far","gx","haunt","inc-rename","kitty-scrollback","lazydev","leap","lualine","mason","mason-lspconfig","mini.ai","mini.pairs","mini.surround","noice","nui","nvim-lspconfig","nvim-treesitter-context","nvim-web-devicons","obsidian.nvim","persistence","qalc","sidekick","snacks","snacks-tea","undotree","vim-wakatime","which-key"],"options":{"ignorecase":false,"shiftwidth":2,"relativenumber":true,"wrap":true,"undofile":true,"clipboard":"unnamedplus","timeoutlen":1000,"autowrite":true,"smartcase":false},"timeoutlen":1000},"builtins":[{"k":"<C-@>","m":["i"],"d":"Insert the text from the last Insert session and leave Insert","s":"builtin","t":"i_CTRL-@","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-A>","m":["i"],"d":"Insert the text from the last Insert session","s":"builtin","t":"i_CTRL-A","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-C>","m":["i"],"d":"Leave Insert mode without abbreviations or InsertLeave","s":"builtin","t":"i_CTRL-C","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"Skips InsertLeave autocmds, which plugins may rely on; prefer <kbd>&lt;Esc&gt;<\/kbd>"},{"k":"<C-D>","m":["i"],"d":"Dedent the current line one 'shiftwidth'","s":"builtin","t":"i_CTRL-D","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-E>","m":["i"],"d":"Insert the character below the cursor","s":"builtin","t":"i_CTRL-E","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G><C-J>","m":["i"],"d":"Down a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_j","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G>j","m":["i"],"d":"Down a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_j","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G><Down>","m":["i"],"d":"Down a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_j","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G><C-K>","m":["i"],"d":"Up a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_k","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G>k","m":["i"],"d":"Up a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_k","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G><Up>","m":["i"],"d":"Up a line, to the column where Insert started","s":"builtin","t":"i_CTRL-G_k","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G>u","m":["i"],"d":"Start a new undoable change (undo break)","s":"builtin","t":"i_CTRL-G_u","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-G>U","m":["i"],"d":"Don't start a new undo step for the next cursor movement","s":"builtin","t":"i_CTRL-G_U","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<BS>","m":["i"],"d":"Delete the character before the cursor","s":"builtin","t":"i_<BS>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"ov":[{"m":"i","by":224},{"m":"i","by":245}]},{"k":"{char1}<BS>{char2}","m":["i"],"d":"enter digraph (only when 'digraph' option set)","s":"builtin","t":"i_digraph","h":"digraph.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-H>","m":["i"],"d":"Delete the character before the cursor (same as <BS>)","s":"builtin","t":"i_CTRL-H","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Tab>","m":["i"],"d":"Insert a tab (or spaces with 'expandtab')","s":"builtin","t":"i_<Tab>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"In buffers where blink.cmp is attached, <kbd>&lt;Tab&gt;<\/kbd> tries in order: next snippet placeholder, Sidekick next-edit suggestion, accept Copilot ghost text, else a normal Tab (<code>lua/plugins.lua:331-340<\/code>)","ov":[{"m":"i","by":229}]},{"k":"<C-I>","m":["i"],"d":"Insert a tab (same as <Tab>)","s":"builtin","t":"i_CTRL-I","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<NL>","m":["i"],"d":"Start a new line (same as <CR>)","s":"builtin","t":"i_<NL>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-J>","m":["i"],"d":"Start a new line (same as <CR>)","s":"builtin","t":"i_CTRL-J","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-K>{char1}{char2}","m":["i"],"d":"Insert a digraph (e.g. <C-k>e: → ë, <C-k>Eu → €)","s":"builtin","t":"i_CTRL-K","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<CR>","m":["i"],"d":"Start a new line","s":"builtin","t":"i_<CR>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"ov":[{"m":"i","by":230}]},{"k":"<C-M>","m":["i"],"d":"Start a new line (same as <CR>)","s":"builtin","t":"i_CTRL-M","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-N>","m":["i"],"d":"Complete keyword: next match (sources from 'complete')","s":"builtin","t":"i_CTRL-N","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":null,"n":"With blink.cmp's menu closed, <kbd>&lt;C-n&gt;<\/kbd>/<kbd>&lt;C-p&gt;<\/kbd> open blink's menu instead (first / last item selected). <kbd>&lt;C-x&gt;&lt;C-n&gt;<\/kbd> still runs built-in keyword completion"},{"k":"<C-O>","m":["i"],"d":"Run one Normal-mode command, then return to Insert","s":"builtin","t":"i_CTRL-O","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"Handy for one-off moves: <kbd>&lt;C-o&gt;zz<\/kbd>, <kbd>&lt;C-o&gt;$<\/kbd>, <kbd>&lt;C-o&gt;p<\/kbd>","e":1},{"k":"<C-P>","m":["i"],"d":"Complete keyword: previous match","s":"builtin","t":"i_CTRL-P","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":null},{"k":"<C-Q>","m":["i"],"d":"Insert the next key literally (same as CTRL-V)","s":"builtin","t":"i_CTRL-Q","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-S-Q>{char}","m":["i"],"d":"like CTRL-Q unless |tui-modifyOtherKeys| is active","s":"builtin","t":"i_CTRL-SHIFT-Q","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-R>{register}","m":["i"],"d":"Insert the contents of register {reg}","s":"builtin","t":"i_CTRL-R","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"<kbd>&lt;C-r&gt;+<\/kbd> clipboard, <kbd>&lt;C-r&gt;\"<\/kbd> unnamed, <kbd>&lt;C-r&gt;=<\/kbd> expression (e.g. <code>=5*7<\/code>), <kbd>&lt;C-r&gt;/<\/kbd> last search","e":1},{"k":"<C-R><C-R>{register}","m":["i"],"d":"Insert register literally (keys like <BS> in it are not applied)","s":"builtin","t":"i_CTRL-R_CTRL-R","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-R><C-O>{register}","m":["i"],"d":"Insert register literally, without auto-indent","s":"builtin","t":"i_CTRL-R_CTRL-O","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-R><C-P>{register}","m":["i"],"d":"Insert register literally and fix the indent","s":"builtin","t":"i_CTRL-R_CTRL-P","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-T>","m":["i"],"d":"Indent the current line one 'shiftwidth'","s":"builtin","t":"i_CTRL-T","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-U>","m":["i"],"d":"Delete text typed before the cursor (if none, all text before it)","s":"builtin","t":"i_CTRL-U","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"Neovim default: sets an undo point first, so <kbd>u<\/kbd> can bring the text back","e":1,"ov":[{"m":"i","by":228}]},{"k":"<C-V>{char}","m":["i"],"d":"Insert the next key literally (e.g. a real <Tab>)","s":"builtin","t":"i_CTRL-V","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-S-V>{char}","m":["i"],"d":"like CTRL-V unless |tui-modifyOtherKeys| is active","s":"builtin","t":"i_CTRL-SHIFT-V","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-V>{number}","m":["i"],"d":"Insert a character by code: 065, x41, u20ac, o101","s":"builtin","t":"i_CTRL-V_digit","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-W>","m":["i"],"d":"Delete the word before the cursor","s":"builtin","t":"i_CTRL-W","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"n":"Neovim default: sets an undo point first, so <kbd>u<\/kbd> can bring the text back","e":1,"ov":[{"m":"i","by":227}]},{"k":"<C-X>{mode}","m":["i"],"d":"Enter CTRL-X completion mode (next key picks the source)","s":"builtin","t":"i_CTRL-X","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":null},{"k":"<C-Y>","m":["i"],"d":"Insert the character above the cursor","s":"builtin","t":"i_CTRL-Y","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Esc>","m":["i"],"d":"Leave Insert mode","s":"builtin","t":"i_<Esc>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-[>","m":["i"],"d":"Leave Insert mode (same as <Esc>)","s":"builtin","t":"i_CTRL-[","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-N>","m":["i"],"d":"Go to Normal mode","s":"builtin","t":"i_CTRL-\\_CTRL-N","h":"intro.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-G>","m":["i"],"d":"Go to Normal mode","s":"builtin","t":"i_CTRL-\\_CTRL-G","h":"intro.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-\\>a-z","m":["i"],"d":"reserved for extensions","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-]>","m":["i"],"d":"Expand an abbreviation without typing a character","s":"builtin","t":"i_CTRL-]","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-^>","m":["i"],"d":"toggle use of |:lmap| mappings","s":"builtin","t":"i_CTRL-^","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-_>","m":["i"],"d":"When 'allowrevins' set: toggle 'revins'","s":"builtin","t":"i_CTRL-_","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"0<C-D>","m":["i"],"d":"Delete all indent of the current line","s":"builtin","t":"i_0_CTRL-D","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"^<C-D>","m":["i"],"d":"delete all indent in the current line, restore it in the next line","s":"builtin","t":"i_^_CTRL-D","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Del>","m":["i"],"d":"Delete the character under the cursor","s":"builtin","t":"i_<Del>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"Meta","m":["i"],"d":"characters (0x80 to 0xff, 128 to 255) not used","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Left>","m":["i"],"d":"cursor one character left","s":"builtin","t":"i_<Left>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<S-Left>","m":["i"],"d":"cursor one word left","s":"builtin","t":"i_<S-Left>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-Left>","m":["i"],"d":"cursor one word left","s":"builtin","t":"i_<C-Left>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Right>","m":["i"],"d":"cursor one character right","s":"builtin","t":"i_<Right>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<S-Right>","m":["i"],"d":"cursor one word right","s":"builtin","t":"i_<S-Right>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-Right>","m":["i"],"d":"cursor one word right","s":"builtin","t":"i_<C-Right>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Up>","m":["i"],"d":"cursor one line up","s":"builtin","t":"i_<Up>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"ov":[{"m":"i","by":225}]},{"k":"<S-Up>","m":["i"],"d":"same as <PageUp>","s":"builtin","t":"i_<S-Up>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Down>","m":["i"],"d":"cursor one line down","s":"builtin","t":"i_<Down>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null,"ov":[{"m":"i","by":226}]},{"k":"<S-Down>","m":["i"],"d":"same as <PageDown>","s":"builtin","t":"i_<S-Down>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Home>","m":["i"],"d":"cursor to start of line","s":"builtin","t":"i_<Home>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-Home>","m":["i"],"d":"cursor to start of file","s":"builtin","t":"i_<C-Home>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<End>","m":["i"],"d":"cursor past end of line","s":"builtin","t":"i_<End>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<C-End>","m":["i"],"d":"cursor past end of file","s":"builtin","t":"i_<C-End>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<PageUp>","m":["i"],"d":"Scroll one screen back","s":"builtin","t":"i_<PageUp>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<PageDown>","m":["i"],"d":"Scroll one screen forward","s":"builtin","t":"i_<PageDown>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<F1>","m":["i"],"d":"same as <Help>","s":"builtin","t":"i_<F1>","h":"helphelp.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<Help>","m":["i"],"d":"Leave Insert mode and open the help window","s":"builtin","t":"i_<Help>","h":"helphelp.txt","sec":"Insert mode","cat":"Help","mo":null,"ch":null,"ctx":null},{"k":"<Insert>","m":["i"],"d":"Toggle Insert / Replace mode","s":"builtin","t":"i_<Insert>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<LeftMouse>","m":["i"],"d":"cursor at mouse click","s":"builtin","t":"i_<LeftMouse>","h":"insert.txt","sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":null},{"k":"<ScrollWheelDown>","m":["i"],"d":"move window three lines down","s":"builtin","t":"i_<ScrollWheelDown>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<S-ScrollWheelDown>","m":["i"],"d":"move window one page down","s":"builtin","t":"i_<S-ScrollWheelDown>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<ScrollWheelUp>","m":["i"],"d":"move window three lines up","s":"builtin","t":"i_<ScrollWheelUp>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<S-ScrollWheelUp>","m":["i"],"d":"move window one page up","s":"builtin","t":"i_<S-ScrollWheelUp>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<ScrollWheelLeft>","m":["i"],"d":"move window six columns left","s":"builtin","t":"i_<ScrollWheelLeft>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<S-ScrollWheelLeft>","m":["i"],"d":"move window one page left","s":"builtin","t":"i_<S-ScrollWheelLeft>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<ScrollWheelRight>","m":["i"],"d":"move window six columns right","s":"builtin","t":"i_<ScrollWheelRight>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<S-ScrollWheelRight>","m":["i"],"d":"move window one page right","s":"builtin","t":"i_<S-ScrollWheelRight>","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<C-X><C-D>","m":["i"],"d":"Complete defined identifiers (#define)","s":"builtin","t":"i_CTRL-X_CTRL-D","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-E>","m":["i"],"d":"Scroll the window one line down (like CTRL-E) in CTRL-X mode","s":"builtin","t":"i_CTRL-X_CTRL-E","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-F>","m":["i"],"d":"Complete file names","s":"builtin","t":"i_CTRL-X_CTRL-F","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode","e":1},{"k":"<C-X><C-I>","m":["i"],"d":"Complete keywords from current and included files","s":"builtin","t":"i_CTRL-X_CTRL-I","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-K>","m":["i"],"d":"Complete words from 'dictionary'","s":"builtin","t":"i_CTRL-X_CTRL-K","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-L>","m":["i"],"d":"Complete whole lines","s":"builtin","t":"i_CTRL-X_CTRL-L","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-N>","m":["i"],"d":"Complete keywords from the current buffer (forward)","s":"builtin","t":"i_CTRL-X_CTRL-N","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-O>","m":["i"],"d":"Omni completion ('omnifunc'; LSP when a client is attached)","s":"builtin","t":"i_CTRL-X_CTRL-O","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode","n":"Neovim sets 'omnifunc' to <code>vim.lsp.omnifunc<\/code> when an LSP attaches"},{"k":"<C-X><C-P>","m":["i"],"d":"Complete keywords from the current buffer (backward)","s":"builtin","t":"i_CTRL-X_CTRL-P","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-R>","m":["i"],"d":"Complete from register contents","s":"builtin","t":"i_CTRL-X_CTRL-R","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-S>","m":["i"],"d":"Spelling suggestions","s":"builtin","t":"i_CTRL-X_CTRL-S","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-T>","m":["i"],"d":"Complete words from 'thesaurus'","s":"builtin","t":"i_CTRL-X_CTRL-T","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-Y>","m":["i"],"d":"Scroll the window one line up (like CTRL-Y) in CTRL-X mode","s":"builtin","t":"i_CTRL-X_CTRL-Y","h":"insert.txt","sec":"Insert mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-U>","m":["i"],"d":"Complete with 'completefunc'","s":"builtin","t":"i_CTRL-X_CTRL-U","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-V>","m":["i"],"d":"Complete Vim command-line text","s":"builtin","t":"i_CTRL-X_CTRL-V","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-Z>","m":["i"],"d":"Stop completion, keep the typed text","s":"builtin","t":"i_CTRL-X_CTRL-Z","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X><C-]>","m":["i"],"d":"Complete tags","s":"builtin","t":"i_CTRL-X_CTRL-]","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-X>s","m":["i"],"d":"Spelling suggestions","s":"builtin","t":"i_CTRL-X_s","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in CTRL-X submode"},{"k":"<C-E>","m":["i"],"d":"Cancel completion, restore the text","s":"builtin","t":"complete_CTRL-E","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<C-Y>","m":["i"],"d":"Accept the selected completion","s":"builtin","t":"complete_CTRL-Y","h":"insert.txt","sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<C-L>","m":["i"],"d":"Completion menu: insert one more character from the current match","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<CR>","m":["i"],"d":"insert currently selected match","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)","ov":[{"m":"i","by":230}]},{"k":"<BS>","m":["i"],"d":"delete one character and redo search","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)","ov":[{"m":"i","by":224},{"m":"i","by":245}]},{"k":"<C-H>","m":["i"],"d":"same as <BS>","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<Up>","m":["i"],"d":"select the previous match","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)","ov":[{"m":"i","by":225}]},{"k":"<Down>","m":["i"],"d":"select the next match","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)","ov":[{"m":"i","by":226}]},{"k":"<PageUp>","m":["i"],"d":"select a match several entries back","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<PageDown>","m":["i"],"d":"select a match several entries forward","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Insert","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"other","m":["i"],"d":"Completion menu: any other key stops completion and inserts itself","s":"builtin","t":null,"h":null,"sec":"Insert mode","cat":"Completion & AI","mo":null,"ch":null,"ctx":"Commands in completion mode (see popupmenu-keys)"},{"k":"<C-A>","m":["n"],"d":"Increment the number at or after the cursor by N","s":"builtin","t":"CTRL-A","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Works on decimal, 0x hex, 0b binary and (with 'nrformats') letters; <kbd>g&lt;C-a&gt;<\/kbd> in Visual makes a sequence","e":1},{"k":"<C-B>","m":["n","x","o"],"d":"Scroll one screen back (page up)","s":"builtin","t":"CTRL-B","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null,"e":1},{"k":"<C-C>","m":["n"],"d":"Interrupt the current command or search","s":"builtin","t":"CTRL-C","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"<C-D>","m":["n"],"d":"Scroll half a screen down (N lines with a count)","s":"builtin","t":"CTRL-D","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"n":"focusline.nvim: scrolls, then puts the cursor line 30% from the top.","e":1,"ov":[{"m":"n","by":0}]},{"k":"<C-E>","m":["n"],"d":"Scroll the view N lines down (text moves up, cursor stays)","s":"builtin","t":"CTRL-E","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-F>","m":["n","x","o"],"d":"Scroll one screen forward (page down)","s":"builtin","t":"CTRL-F","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null,"e":1},{"k":"<C-G>","m":["n"],"d":"Show the file name, line count and cursor position","s":"builtin","t":"CTRL-G","h":"editing.txt","sec":"Normal mode","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"<BS>","m":["n","x","o"],"d":"Left N characters (same as h)","s":"builtin","t":"<BS>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-H>","m":["n","x","o"],"d":"Left N characters (same as h)","s":"builtin","t":"CTRL-H","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<Tab>","m":["n","x","o"],"d":"Jump to a newer position in the jump list (same as CTRL-I)","s":"builtin","t":"<Tab>","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"n":"This config maps Normal-mode <kbd>&lt;Tab&gt;<\/kbd> to Sidekick NES jump/apply (no fallback)","ov":[{"m":"n","by":1}]},{"k":"<C-I>","m":["n","x","o"],"d":"Jump to a newer position in the jump list","s":"builtin","t":"CTRL-I","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"n":"<b>Shadowed here:<\/b> this config maps <kbd>&lt;Tab&gt;<\/kbd> (Sidekick NES, no fallback) and <kbd>&lt;C-i&gt;<\/kbd> is not mapped separately, so per <code>:h CTRL-I<\/code> the <kbd>&lt;Tab&gt;<\/kbd> map also catches <kbd>&lt;C-i&gt;<\/kbd>, even in kitty or Neovide; use <kbd>&lt;leader&gt;sj<\/kbd>","e":1,"ov":[{"m":"n","by":181}]},{"k":"<NL>","m":["n","x","o"],"d":"Down N lines (same as j)","s":"builtin","t":"<NL>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<S-NL>","m":["n","x","o"],"d":"same as CTRL-F","s":"builtin","t":"<S-NL>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":"<C-J>","m":["n","x","o"],"d":"Down N lines (same as j)","s":"builtin","t":"CTRL-J","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-L>","m":["n"],"d":"Redraw the screen (Neovim default: also clears search highlight)","s":"builtin","t":"CTRL-L","h":"various.txt","sec":"Normal mode","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Neovim default mapping: <code>:nohlsearch | diffupdate | normal! &lt;C-L&gt;<\/code>","e":1,"ov":[{"m":"n","by":187}]},{"k":"<CR>","m":["n","x","o"],"d":"Down N lines, on first non-blank (same as +)","s":"builtin","t":"<CR>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now Leap (<code>&lt;Plug&gt;(leap)<\/code>) in Normal, Visual and Operator-pending mode. Use <code>+<\/code> or <code>j<\/code>.","ov":[{"m":"n","by":2},{"m":"x","by":2},{"m":"o","by":2}]},{"k":"<S-CR>","m":["n","x","o"],"d":"same as CTRL-F","s":"builtin","t":"<S-CR>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":"<C-M>","m":["n","x","o"],"d":"Same as <CR>: down N lines, first non-blank","s":"builtin","t":"CTRL-M","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-N>","m":["n","x","o"],"d":"Down N lines (same as j)","s":"builtin","t":"CTRL-N","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-O>","m":["n","x","o"],"d":"Jump to an older position in the jump list","s":"builtin","t":"CTRL-O","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"n":"Jumps are made by G, /, n, %, (, {, marks, etc. — not by j/k or w","e":1},{"k":"<C-P>","m":["n","x","o"],"d":"Up N lines (same as k)","s":"builtin","t":"CTRL-P","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-R>","m":["n"],"d":"Redo the last undone change","s":"builtin","t":"CTRL-R","h":"undo.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null,"e":1},{"k":"<C-T>","m":["n"],"d":"Jump back up the tag stack","s":"builtin","t":"CTRL-T","h":"tagsrch.txt","sec":"Normal mode","cat":"Tags","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-U>","m":["n"],"d":"Scroll half a screen up (N lines with a count)","s":"builtin","t":"CTRL-U","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"n":"focusline.nvim: scrolls, then puts the cursor line 30% from the top.","e":1,"ov":[{"m":"n","by":3}]},{"k":"<C-V>","m":["n"],"d":"Start blockwise Visual mode","s":"builtin","t":"CTRL-V","h":"visual.txt","sec":"Normal mode","cat":"Visual","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>{char}","m":["n"],"d":"Window command prefix (see the <C-w> keys)","s":"builtin","t":"CTRL-W","h":"index.txt","sec":"Normal mode","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-X>","m":["n"],"d":"Decrement the number at or after the cursor by N","s":"builtin","t":"CTRL-X","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"<C-Y>","m":["n"],"d":"Scroll the view N lines up (text moves down, cursor stays)","s":"builtin","t":"CTRL-Y","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-Z>","m":["n"],"d":"Suspend Neovim (resume with fg in the shell)","s":"builtin","t":"CTRL-Z","h":"starting.txt","sec":"Normal mode","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-N>","m":["n"],"d":"Go to Normal mode (no-op in Normal mode; useful in mappings)","s":"builtin","t":"CTRL-\\_CTRL-N","h":"intro.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-G>","m":["n"],"d":"Go to Normal mode (no-op in Normal mode)","s":"builtin","t":"CTRL-\\_CTRL-G","h":"intro.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"<C-\\>a-z","m":["n"],"d":"reserved for extensions","s":"builtin","t":null,"h":null,"sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"<C-]>","m":["n"],"d":"Jump to the definition (tag) of the word under the cursor","s":"builtin","t":"CTRL-]","h":"tagsrch.txt","sec":"Normal mode","cat":"Tags","mo":null,"ch":null,"ctx":null,"n":"When an LSP client attaches, Neovim sets 'tagfunc', so <kbd>&lt;C-]&gt;<\/kbd> goes to the LSP definition and <kbd>&lt;C-t&gt;<\/kbd> comes back","e":1},{"k":"<C-^>","m":["n"],"d":"Switch to the alternate (previous) buffer; with N: buffer N","s":"builtin","t":"CTRL-^","h":"editing.txt","sec":"Normal mode","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null,"n":"The quickest way to toggle between two files","e":1},{"k":"<C-Tab>","m":["n"],"d":"Go to the last accessed tab page","s":"builtin","t":"CTRL-<Tab>","h":"tabpage.txt","sec":"Normal mode","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null},{"k":"<Space>","m":["n","x","o"],"d":"Right N characters (same as l)","s":"builtin","t":"<Space>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"wait":[{"m":"n","ext":["<Space>,","<Space>.","<Space>/","<Space>:","<Space><Space>","<Space>N"],"n":82},{"m":"x","ext":["<Space>cbb","<Space>cbd","<Space>cbl","<Space>cf","<Space>gB","<Space>sw"],"n":6}]},{"k":"!{motion}{filter}","m":["n"],"d":"Filter {motion} lines through an external command","s":"builtin","t":"!","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":null,"ctx":null},{"k":"!!{filter}","m":["n"],"d":"Filter N lines through an external command","s":"builtin","t":"!!","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"\"{register}","m":["n"],"d":"Use register {x} for the next delete, yank or put","s":"builtin","t":"quote","h":"change.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":null,"ctx":null,"n":"<code>\"\"<\/code> unnamed, <code>\"0<\/code> last yank, <code>\"1-9<\/code> deletes, <code>\"+<\/code> clipboard, <code>\"_<\/code> black hole, <code>\"/<\/code> search, <code>\":<\/code> last command. In this config d/c/x default to <code>\"d<\/code> but honour a register you type (except <code>\"+<\/code>)","e":1},{"k":"#","m":["n","x","o"],"d":"Search backward for the whole word under the cursor","s":"builtin","t":"#","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"e":1,"ov":[{"m":"x","by":188}]},{"k":"$","m":["n","x","o"],"d":"To end of line (with N: end of line N-1 lines down)","s":"builtin","t":"$","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"In Visual block mode <kbd>$<\/kbd> extends every line to its own end","e":1},{"k":"%","m":["n","x","o"],"d":"Jump to the matching bracket, or to the next bracket on the line","s":"builtin","t":"%","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"matchit (loaded by default) also jumps between if/else/endif, HTML tags and similar pairs; see <kbd>g%<\/kbd>, <kbd>[%<\/kbd>, <kbd>]%<\/kbd>","e":1,"ov":[{"m":"n","by":86},{"m":"x","by":189},{"m":"o","by":217}]},{"k":"{count}%","m":["n","x","o"],"d":"To N percent through the file","s":"builtin","t":"N%","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"ov":[{"m":"n","by":86},{"m":"x","by":189},{"m":"o","by":217}]},{"k":"&","m":["n"],"d":"Repeat last :s on the current line (Neovim: same flags, :&&)","s":"builtin","t":"&","h":"change.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null,"n":"Neovim default mapping <code>&amp;<\/code> → <code>:&amp;&amp;&lt;CR&gt;<\/code> keeps the last flags (Vim's plain & drops them)","e":1,"ov":[{"m":"n","by":87}]},{"k":"'{a-zA-Z0-9}","m":["n","x","o"],"d":"Jump to the line of mark {a-zA-Z0-9} (first non-blank)","s":"builtin","t":"'","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"e":1},{"k":"''","m":["n","x","o"],"d":"Jump back to the line before the latest jump","s":"builtin","t":"''","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"e":1},{"k":"'(","m":["n","x","o"],"d":"cursor to the first CHAR on the line of the start of the current sentence","s":"builtin","t":"'(","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"')","m":["n","x","o"],"d":"cursor to the first CHAR on the line of the end of the current sentence","s":"builtin","t":"')","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"'<","m":["n","x","o"],"d":"To first line of the last Visual selection","s":"builtin","t":"'<","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"'>","m":["n","x","o"],"d":"To last line of the last Visual selection","s":"builtin","t":"'>","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"'[","m":["n","x","o"],"d":"To first line of the last changed, yanked or put text","s":"builtin","t":"'[","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"']","m":["n","x","o"],"d":"To last line of the last changed, yanked or put text","s":"builtin","t":"']","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"'{","m":["n","x","o"],"d":"cursor to the first CHAR on the line of the start of the current paragraph","s":"builtin","t":"'{","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"'}","m":["n","x","o"],"d":"cursor to the first CHAR on the line of the end of the current paragraph","s":"builtin","t":"'}","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"(","m":["n","x","o"],"d":"Back N sentences","s":"builtin","t":"(","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":")","m":["n","x","o"],"d":"Forward N sentences","s":"builtin","t":")","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"*","m":["n","x","o"],"d":"Search forward for the whole word under the cursor","s":"builtin","t":"star","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"Whole-word match (<code>\\&lt;word\\&gt;<\/code>); 'ignorecase' applies, 'smartcase' does not. In Visual mode Neovim's default <kbd>*<\/kbd> searches for the selected text instead","e":1,"ov":[{"m":"x","by":190}]},{"k":"+","m":["n","x","o"],"d":"Down N lines, on first non-blank","s":"builtin","t":"+","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<S-+>","m":["n","x","o"],"d":"same as CTRL-F","s":"builtin","t":"<S-Plus>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":",","m":["n","x","o"],"d":"Repeat last f/t/F/T in the opposite direction","s":"builtin","t":",","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim's reverse repeat (same semantics).","e":1,"ov":[{"m":"n","by":88},{"m":"x","by":88},{"m":"o","by":88}]},{"k":"-","m":["n","x","o"],"d":"Up N lines, on first non-blank","s":"builtin","t":"-","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<S-->","m":["n","x","o"],"d":"same as CTRL-B","s":"builtin","t":"<S-Minus>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":".","m":["n"],"d":"Repeat the last change (a count replaces the original count)","s":"builtin","t":".","h":"repeat.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null,"n":"Repeats inserts too: <kbd>A;&lt;Esc&gt;<\/kbd> then <kbd>j.<\/kbd> appends ; to the next line","e":1},{"k":"/{pattern}<CR>","m":["n","x","o"],"d":"Search forward for {pattern}","s":"builtin","t":"/","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"Case-sensitive in this config ('ignorecase' off); add <code>\\c<\/code> to the pattern to ignore case. Search offsets: <code>/foo/e<\/code> end, <code>/foo/+1<\/code> next line","e":1},{"k":"/<CR>","m":["n","x","o"],"d":"Search forward again with the last pattern","s":"builtin","t":"/<CR>","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null},{"k":"0","m":["n","x","o"],"d":"To first column of the line","s":"builtin","t":"0","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"1","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"2","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"3","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"4","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"5","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"6","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"7","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"8","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"9","m":["n"],"d":"Count: repeat or scale the next command (3w, 5dd, 2p)","s":"builtin","t":"count","h":"helphelp.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":":","m":["n","x","o"],"d":"Start an Ex command (command-line mode)","s":"builtin","t":":","h":"cmdline.txt","sec":"Normal mode","cat":"Command line","mo":1,"ch":null,"ctx":null},{"k":"{count}:","m":["n"],"d":"Start an Ex command with the range .,.+(N-1)","s":"builtin","t":"N:","h":"cmdline.txt","sec":"Normal mode","cat":"Command line","mo":null,"ch":null,"ctx":null,"n":"<kbd>5:<\/kbd> pre-fills <code>:.,.+4<\/code>"},{"k":";","m":["n","x","o"],"d":"Repeat last f/t/F/T in the same direction","s":"builtin","t":";","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim's repeat (same semantics).","e":1,"ov":[{"m":"n","by":89},{"m":"x","by":89},{"m":"o","by":89}]},{"k":"<{motion}","m":["n"],"d":"Dedent {motion} lines one 'shiftwidth'","s":"builtin","t":"<","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"e":1},{"k":"<<","m":["n"],"d":"Dedent N lines one 'shiftwidth'","s":"builtin","t":"<<","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"={motion}","m":["n"],"d":"Re-indent {motion} lines (indent rules or 'equalprg')","s":"builtin","t":"=","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"Doubled operators act on lines: <kbd>==<\/kbd>, <kbd>dd<\/kbd>, <kbd>yy<\/kbd>, <kbd>gUU<\/kbd>, <kbd>gqq<\/kbd>","e":1},{"k":"==","m":["n"],"d":"Re-indent N lines","s":"builtin","t":"==","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":">{motion}","m":["n"],"d":"Indent {motion} lines one 'shiftwidth'","s":"builtin","t":">","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"e":1},{"k":">>","m":["n"],"d":"Indent N lines one 'shiftwidth'","s":"builtin","t":">>","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"?{pattern}<CR>","m":["n","x","o"],"d":"Search backward for {pattern}","s":"builtin","t":"?","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"e":1},{"k":"?<CR>","m":["n","x","o"],"d":"Search backward again with the last pattern","s":"builtin","t":"?<CR>","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null},{"k":"@{a-z}","m":["n"],"d":"Run the macro in register {a-z} N times","s":"builtin","t":"@","h":"repeat.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":1,"ctx":null,"n":"Macros are just registers: <kbd>\"ap<\/kbd> pastes one to edit, <kbd>\"ayy<\/kbd> stores it back","e":1},{"k":"@:","m":["n"],"d":"Repeat the last command-line command N times","s":"builtin","t":"@:","h":"repeat.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":null,"ctx":null,"n":"After the first <kbd>@:<\/kbd>, <kbd>@@<\/kbd> repeats it again"},{"k":"@@","m":["n"],"d":"Repeat the last executed macro (or @:) N times","s":"builtin","t":"@@","h":"repeat.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":1,"ctx":null,"e":1},{"k":"A","m":["n"],"d":"Append at end of line","s":"builtin","t":"A","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"B","m":["n","x","o"],"d":"Back to start of WORD","s":"builtin","t":"B","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"[\"x]C","m":["n"],"d":"Change to end of line (and N-1 more lines)","s":"builtin","t":"C","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1,"ov":[{"m":"n","by":90}]},{"k":"[\"x]D","m":["n"],"d":"Delete to end of line (and N-1 more lines)","s":"builtin","t":"D","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1,"ov":[{"m":"n","by":91}]},{"k":"E","m":["n","x","o"],"d":"Forward to end of WORD","s":"builtin","t":"E","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"F{char}","m":["n","x","o"],"d":"To Nth {char} to the left on this line","s":"builtin","t":"F","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim: same line only, highlights matches, <kbd>F<\/kbd> again = reverse.","e":1,"ov":[{"m":"n","by":92},{"m":"x","by":92},{"m":"o","by":92}]},{"k":"G","m":["n","x","o"],"d":"To last line, or to line N","s":"builtin","t":"G","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"H","m":["n","x","o"],"d":"To top line of the window (Nth line from top)","s":"builtin","t":"H","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"I","m":["n"],"d":"Insert at first non-blank of the line","s":"builtin","t":"I","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"J","m":["n"],"d":"Join N lines (default 2) with one space","s":"builtin","t":"J","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"In Visual mode joins the selected lines","e":1},{"k":"K","m":["n"],"d":"Look up the keyword under the cursor with 'keywordprg'","s":"builtin","t":"K","h":"various.txt","sec":"Normal mode","cat":"Help","mo":null,"ch":null,"ctx":null,"n":"This config maps <kbd>K<\/kbd> to LSP hover","ov":[{"m":"n","by":93}]},{"k":"L","m":["n","x","o"],"d":"To bottom line of the window (Nth line from bottom)","s":"builtin","t":"L","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"M","m":["n","x","o"],"d":"To middle line of the window","s":"builtin","t":"M","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"N","m":["n","x","o"],"d":"Repeat last search in the opposite direction","s":"builtin","t":"N","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"Opposite of the last search direction, not always 'backward'","e":1},{"k":"O","m":["n"],"d":"Open a new line above and start Insert","s":"builtin","t":"O","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"[\"x]P","m":["n"],"d":"Put (paste) before the cursor N times","s":"builtin","t":"P","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Unlike <kbd>p<\/kbd>, <kbd>P<\/kbd> in Visual mode keeps the register, so you can paste repeatedly","e":1},{"k":"R","m":["n"],"d":"Enter Replace mode (overtype)","s":"builtin","t":"R","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"[\"x]S","m":["n"],"d":"Delete N lines and start Insert (same as cc)","s":"builtin","t":"S","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Now Leap from window (Normal mode). Use <code>cc<\/code>.","ov":[{"m":"n","by":94}]},{"k":"T{char}","m":["n","x","o"],"d":"Till after Nth {char} to the left","s":"builtin","t":"T","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim: same line only, highlights matches, <kbd>T<\/kbd> again = reverse.","e":1,"ov":[{"m":"n","by":95},{"m":"x","by":95},{"m":"o","by":95}]},{"k":"U","m":["n"],"d":"Undo all recent changes on the last changed line (is itself undoable)","s":"builtin","t":"U","h":"undo.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null},{"k":"V","m":["n"],"d":"Start linewise Visual mode","s":"builtin","t":"V","h":"visual.txt","sec":"Normal mode","cat":"Visual","mo":null,"ch":null,"ctx":null,"e":1},{"k":"W","m":["n","x","o"],"d":"Forward to start of next WORD (blank-delimited)","s":"builtin","t":"W","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"WORD = any run of non-blank characters, e.g. <code>foo.bar(baz)<\/code> is one WORD","e":1},{"k":"[\"x]X","m":["n"],"d":"Delete N characters before the cursor","s":"builtin","t":"X","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"ov":[{"m":"n","by":96}]},{"k":"[\"x]Y","m":["n"],"d":"Yank N lines (Neovim maps Y to y$: yank to end of line)","s":"builtin","t":"Y","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":null,"ctx":null,"n":"Neovim default mapping <code>Y<\/code> → <code>y$<\/code> (like D and C); use <kbd>yy<\/kbd> for whole lines","e":1,"ov":[{"m":"n","by":97}]},{"k":"ZZ","m":["n"],"d":"Write if changed and close the window (like :x)","s":"builtin","t":"ZZ","h":"editing.txt","sec":"Normal mode","cat":"Files","mo":null,"ch":null,"ctx":null,"e":1},{"k":"ZQ","m":["n"],"d":"Close the window without writing (like :q!)","s":"builtin","t":"ZQ","h":"editing.txt","sec":"Normal mode","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"[{char}","m":["n"],"d":"Square-bracket command prefix ([( [{ [s [c [d …)","s":"builtin","t":"[","h":"index.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"]{char}","m":["n"],"d":"Square-bracket command prefix (]) ]} ]s ]c ]d …)","s":"builtin","t":"]","h":"index.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"^","m":["n","x","o"],"d":"To first non-blank character of the line","s":"builtin","t":"^","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"_","m":["n","x","o"],"d":"To first non-blank, N-1 lines down (linewise)","s":"builtin","t":"_","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"`{a-zA-Z0-9}","m":["n","x","o"],"d":"Jump to the exact position of mark {a-zA-Z0-9}","s":"builtin","t":"`","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"e":1},{"k":"`(","m":["n","x","o"],"d":"cursor to the start of the current sentence","s":"builtin","t":"`(","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`)","m":["n","x","o"],"d":"cursor to the end of the current sentence","s":"builtin","t":"`)","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`<","m":["n","x","o"],"d":"To start of the last Visual selection","s":"builtin","t":"`<","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`>","m":["n","x","o"],"d":"To end of the last Visual selection","s":"builtin","t":"`>","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`[","m":["n","x","o"],"d":"To start of the last changed, yanked or put text","s":"builtin","t":"`[","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`]","m":["n","x","o"],"d":"To end of the last changed, yanked or put text","s":"builtin","t":"`]","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"``","m":["n","x","o"],"d":"Jump back to the position before the latest jump","s":"builtin","t":"``","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`{","m":["n","x","o"],"d":"cursor to the start of the current paragraph","s":"builtin","t":"`{","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"`}","m":["n","x","o"],"d":"cursor to the end of the current paragraph","s":"builtin","t":"`}","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"a","m":["n"],"d":"Append after the cursor","s":"builtin","t":"a","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"b","m":["n","x","o"],"d":"Back to start of word","s":"builtin","t":"b","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"[\"x]c{motion}","m":["n"],"d":"Change: delete {motion} text and start Insert","s":"builtin","t":"c","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"Deleted text goes to register <code>d<\/code> in this config (see <kbd>d<\/kbd>)","e":1,"ov":[{"m":"n","by":136}]},{"k":"[\"x]cc","m":["n"],"d":"Change N whole lines","s":"builtin","t":"cc","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"[\"x]d{motion}","m":["n"],"d":"Delete {motion} text [into register x]","s":"builtin","t":"d","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"This config maps <kbd>d<\/kbd>, <kbd>D<\/kbd>, <kbd>c<\/kbd>, <kbd>C<\/kbd>, <kbd>x<\/kbd>, <kbd>X<\/kbd> to <code>\"d<\/code>…: deleted text goes to register <code>d<\/code>, not the clipboard. Paste it with <kbd>\"dp<\/kbd>","e":1,"ov":[{"m":"n","by":137}]},{"k":"[\"x]dd","m":["n"],"d":"Delete N lines","s":"builtin","t":"dd","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"do","m":["n"],"d":"Diff: obtain the change from the other window (:diffget)","s":"builtin","t":"do","h":"diff.txt","sec":"Normal mode","cat":"Diff","mo":null,"ch":1,"ctx":null},{"k":"dp","m":["n"],"d":"Diff: put the change into the other window (:diffput)","s":"builtin","t":"dp","h":"diff.txt","sec":"Normal mode","cat":"Diff","mo":null,"ch":1,"ctx":null},{"k":"e","m":["n","x","o"],"d":"Forward to end of word","s":"builtin","t":"e","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"f{char}","m":["n","x","o"],"d":"To Nth {char} to the right on this line","s":"builtin","t":"f","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim: same line only, highlights matches, <kbd>f<\/kbd> again = next match.","e":1,"ov":[{"m":"n","by":138},{"m":"x","by":138},{"m":"o","by":138}]},{"k":"g{char}","m":["n"],"d":"Extended command prefix (gg, gu, gq, gv, gx …)","s":"builtin","t":"g","h":"index.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"h","m":["n","x","o"],"d":"Left N characters","s":"builtin","t":"h","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"i","m":["n"],"d":"Insert before the cursor","s":"builtin","t":"i","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"n":"A count repeats the inserted text: <kbd>3ihey&lt;Esc&gt;<\/kbd> → heyheyhey","e":1},{"k":"j","m":["n","x","o"],"d":"Down N lines","s":"builtin","t":"j","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"This config maps count-less <kbd>j<\/kbd>/<kbd>k<\/kbd> to <kbd>gj<\/kbd>/<kbd>gk<\/kbd> (display lines); <kbd>5j<\/kbd> still moves 5 real lines","e":1,"ov":[{"m":"n","by":158},{"m":"x","by":158}]},{"k":"k","m":["n","x","o"],"d":"Up N lines","s":"builtin","t":"k","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1,"ov":[{"m":"n","by":159},{"m":"x","by":159}]},{"k":"l","m":["n","x","o"],"d":"Right N characters","s":"builtin","t":"l","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"m{A-Za-z}","m":["n"],"d":"Set mark {a-zA-Z} at the cursor (A-Z are global, across files)","s":"builtin","t":"m","h":"motion.txt","sec":"Normal mode","cat":"Mark & jump","mo":null,"ch":null,"ctx":null,"n":"Special marks: <code>.<\/code> last change, <code>^<\/code> last insert, <code>\"<\/code> last exit, <code>[ ]<\/code> last change/yank, <code>&lt; &gt;<\/code> last selection","e":1},{"k":"n","m":["n","x","o"],"d":"Repeat last search in the same direction","s":"builtin","t":"n","h":"pattern.txt","sec":"Normal mode","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"<kbd>n<\/kbd> follows the direction of the last / or ?, so after <kbd>?<\/kbd> it goes backward","e":1},{"k":"o","m":["n"],"d":"Open a new line below and start Insert","s":"builtin","t":"o","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"[\"x]p","m":["n"],"d":"Put (paste) after the cursor N times","s":"builtin","t":"p","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"With 'clipboard' = unnamedplus, <kbd>p<\/kbd> pastes the system clipboard. Deletes go to <code>\"d<\/code> in this config, so use <kbd>\"dp<\/kbd> to paste deleted text","e":1},{"k":"q{0-9a-zA-Z\"}","m":["n"],"d":"Record keystrokes into register {a-z} (A-Z appends)","s":"builtin","t":"q","h":"repeat.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":null,"ctx":null,"n":"Press <kbd>q<\/kbd> again to stop; then <kbd>@a<\/kbd> plays it, <kbd>@@<\/kbd> / <kbd>Q<\/kbd> repeat","e":1},{"k":"q","m":["n"],"d":"Stop recording (while recording a macro)","s":"builtin","t":"q","h":"repeat.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":null,"ctx":null,"e":1},{"k":"Q","m":["n"],"d":"Replay the last recorded macro N times","s":"builtin","t":"Q","h":"repeat.txt","sec":"Normal mode","cat":"Register & macro","mo":null,"ch":1,"ctx":null,"n":"Neovim: <kbd>Q<\/kbd> replays the last recorded register (Vim's Ex mode is <kbd>gQ<\/kbd>). In linewise Visual it runs on every selected line","e":1},{"k":"q:","m":["n"],"d":"Open the command-line window with : history (edit and re-run)","s":"builtin","t":"q:","h":"cmdline.txt","sec":"Normal mode","cat":"Command line","mo":null,"ch":null,"ctx":null,"n":"In this config <kbd>&lt;CR&gt;<\/kbd> in Normal mode starts Leap here; press <kbd>i<\/kbd> then <kbd>&lt;CR&gt;<\/kbd> to run the line"},{"k":"q/","m":["n"],"d":"Open the command-line window with / search history","s":"builtin","t":"q/","h":"cmdline.txt","sec":"Normal mode","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"q?","m":["n"],"d":"Open the command-line window with ? search history","s":"builtin","t":"q?","h":"cmdline.txt","sec":"Normal mode","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"r{char}","m":["n"],"d":"Replace N characters with {char}","s":"builtin","t":"r","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"[\"x]s","m":["n"],"d":"Delete N characters and start Insert","s":"builtin","t":"s","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Disabled: <code>s<\/code> is mini.surround's prefix (<code>&lt;Nop&gt;<\/code>). Use <code>cl<\/code>.","ov":[{"m":"n","by":175}]},{"k":"t{char}","m":["n","x","o"],"d":"Till before Nth {char} to the right","s":"builtin","t":"t","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Now flash.nvim: same line only, highlights matches, <kbd>t<\/kbd> again = next match.","e":1,"ov":[{"m":"n","by":177},{"m":"x","by":177},{"m":"o","by":177}]},{"k":"u","m":["n"],"d":"Undo the last change","s":"builtin","t":"u","h":"undo.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null,"n":"'undofile' is on in this config, so undo history survives closing the file","e":1},{"k":"v","m":["n"],"d":"Start charwise Visual mode","s":"builtin","t":"v","h":"visual.txt","sec":"Normal mode","cat":"Visual","mo":null,"ch":null,"ctx":null,"e":1},{"k":"w","m":["n","x","o"],"d":"Forward to start of next word","s":"builtin","t":"w","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"word = letters, digits, underscore (or a run of other non-blanks); WORD = anything up to whitespace","e":1},{"k":"[\"x]x","m":["n"],"d":"Delete N characters under and after the cursor","s":"builtin","t":"x","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Mapped to <code>\"dx<\/code> here: the character goes to register <code>d<\/code>","e":1,"ov":[{"m":"n","by":178}]},{"k":"[\"x]y{motion}","m":["n"],"d":"Yank (copy) {motion} text [into register x]","s":"builtin","t":"y","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":null,"ctx":null,"n":"With 'clipboard' = unnamedplus, yanks go to the system clipboard (<code>\"+<\/code>)","e":1},{"k":"[\"x]yy","m":["n"],"d":"Yank N lines","s":"builtin","t":"yy","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":null,"ctx":null,"e":1},{"k":"z{char}","m":["n"],"d":"Fold / scroll / spell command prefix (za, zz, z= …)","s":"builtin","t":"z","h":"index.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"{","m":["n","x","o"],"d":"Back to previous blank line (paragraph)","s":"builtin","t":"{","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"|","m":["n","x","o"],"d":"To column N of the line","s":"builtin","t":"bar","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"}","m":["n","x","o"],"d":"Forward to next blank line (paragraph)","s":"builtin","t":"}","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"~","m":["n"],"d":"Toggle case of N characters and move right","s":"builtin","t":"~","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"e":1},{"k":"~{motion}","m":["n"],"d":"Toggle case of {motion} text (only when 'tildeop' is set)","s":"builtin","t":"~","h":"change.txt","sec":"Normal mode","cat":"Operator","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-End>","m":["n","x","o"],"d":"same as \"G\"","s":"builtin","t":"<C-End>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-Home>","m":["n","x","o"],"d":"same as \"gg\"","s":"builtin","t":"<C-Home>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-Left>","m":["n","x","o"],"d":"same as \"b\"","s":"builtin","t":"<C-Left>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-LeftMouse>","m":["n"],"d":"Jump to the tag of the word at the mouse click","s":"builtin","t":"<C-LeftMouse>","h":"tagsrch.txt","sec":"Normal mode","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"<C-Right>","m":["n","x","o"],"d":"same as \"w\"","s":"builtin","t":"<C-Right>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<C-RightMouse>","m":["n"],"d":"Jump back up the tag stack (same as CTRL-T)","s":"builtin","t":"<C-RightMouse>","h":"tagsrch.txt","sec":"Normal mode","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"<C-Tab>","m":["n"],"d":"Go to the last accessed tab page","s":"builtin","t":"<C-Tab>","h":"tabpage.txt","sec":"Normal mode","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null},{"k":"[\"x]<Del>","m":["n"],"d":"Delete N characters under the cursor (same as x)","s":"builtin","t":"<Del>","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"{count}<Del>","m":["n"],"d":"While typing a count: remove its last digit","s":"builtin","t":"N<Del>","h":"various.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"<Down>","m":["n","x","o"],"d":"same as \"j\"","s":"builtin","t":"<Down>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"ov":[{"m":"n","by":184},{"m":"x","by":184}]},{"k":"<End>","m":["n","x","o"],"d":"same as \"$\"","s":"builtin","t":"<End>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<F1>","m":["n"],"d":"Open the help window","s":"builtin","t":"<F1>","h":"helphelp.txt","sec":"Normal mode","cat":"Help","mo":null,"ch":null,"ctx":null},{"k":"<Help>","m":["n"],"d":"Open the help window","s":"builtin","t":"<Help>","h":"helphelp.txt","sec":"Normal mode","cat":"Help","mo":null,"ch":null,"ctx":null},{"k":"<Home>","m":["n","x","o"],"d":"same as \"0\"","s":"builtin","t":"<Home>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<Insert>","m":["n"],"d":"Start Insert mode (same as i)","s":"builtin","t":"<Insert>","h":"insert.txt","sec":"Normal mode","cat":"Insert","mo":null,"ch":1,"ctx":null},{"k":"<Left>","m":["n","x","o"],"d":"same as \"h\"","s":"builtin","t":"<Left>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<LeftMouse>","m":["n","x","o"],"d":"Move the cursor to the mouse click","s":"builtin","t":"<LeftMouse>","h":"visual.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<MiddleMouse>","m":["n"],"d":"Paste at the mouse position (like gP)","s":"builtin","t":"<MiddleMouse>","h":"change.txt","sec":"Normal mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<PageDown>","m":["n"],"d":"Scroll one screen forward (same as CTRL-F)","s":"builtin","t":"<PageDown>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<PageUp>","m":["n"],"d":"Scroll one screen back (same as CTRL-B)","s":"builtin","t":"<PageUp>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"<Right>","m":["n","x","o"],"d":"same as \"l\"","s":"builtin","t":"<Right>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<RightMouse>","m":["n"],"d":"Open the right-click popup menu (moves the cursor to the click)","s":"builtin","t":"<RightMouse>","h":"visual.txt","sec":"Normal mode","cat":"Misc","mo":null,"ch":null,"ctx":null,"n":"Neovim's default 'mousemodel' is <code>popup_setpos<\/code>; with <code>extend<\/code> it starts or extends Visual mode instead"},{"k":"<S-Down>","m":["n","x","o"],"d":"same as CTRL-F","s":"builtin","t":"<S-Down>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":"<S-Left>","m":["n","x","o"],"d":"same as \"b\"","s":"builtin","t":"<S-Left>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<S-LeftMouse>","m":["n"],"d":"Extend the selection to the mouse click","s":"builtin","t":"<S-LeftMouse>","h":"gui.txt","sec":"Normal mode","cat":"Visual","mo":null,"ch":null,"ctx":null,"n":"Neovim's default 'mousemodel' is <code>popup_setpos<\/code>; only with <code>extend<\/code> does it search the clicked word like <kbd>*<\/kbd>"},{"k":"<S-Right>","m":["n","x","o"],"d":"same as \"w\"","s":"builtin","t":"<S-Right>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"<S-RightMouse>","m":["n"],"d":"Search backward for the word at the mouse click (like #)","s":"builtin","t":"<S-RightMouse>","h":"gui.txt","sec":"Normal mode","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"<S-Up>","m":["n","x","o"],"d":"same as CTRL-B","s":"builtin","t":"<S-Up>","h":"scroll.txt","sec":"Normal mode","cat":"Scroll & view","mo":1,"ch":null,"ctx":null},{"k":"<Undo>","m":["n"],"d":"Undo (same as u)","s":"builtin","t":"<Undo>","h":"undo.txt","sec":"Normal mode","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null},{"k":"<Up>","m":["n","x","o"],"d":"same as \"k\"","s":"builtin","t":"<Up>","h":"motion.txt","sec":"Normal mode","cat":"Motion","mo":1,"ch":null,"ctx":null,"ov":[{"m":"n","by":183},{"m":"x","by":183}]},{"k":"a\"","m":["x","o"],"d":"Double-quoted string including the quotes","s":"builtin","t":"v_aquote","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quotes searched over 50 lines; does not include the trailing whitespace.","e":1},{"k":"a'","m":["x","o"],"d":"Single-quoted string including the quotes","s":"builtin","t":"v_a'","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quotes searched over 50 lines; does not include the trailing whitespace."},{"k":"a(","m":["x","o"],"d":"( ) block including the parentheses (same as ab)","s":"builtin","t":"v_a(","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one (within 50 lines).","e":1},{"k":"a)","m":["x","o"],"d":"( ) block including the parentheses (same as ab)","s":"builtin","t":"v_a)","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one (within 50 lines)."},{"k":"a<","m":["x","o"],"d":"< > block including the angle brackets","s":"builtin","t":"v_a<","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a>","m":["x","o"],"d":"< > block including the angle brackets","s":"builtin","t":"v_a>","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"aB","m":["x","o"],"d":"{ } block including the braces","s":"builtin","t":"v_aB","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Still Vim's built-in: mini.ai passes letters it doesn't define through.","e":1},{"k":"aW","m":["x","o"],"d":"A WORD, plus surrounding white space","s":"builtin","t":"v_aW","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"a[","m":["x","o"],"d":"[ ] block including the brackets","s":"builtin","t":"v_a[","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a]","m":["x","o"],"d":"[ ] block including the brackets","s":"builtin","t":"v_a]","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a`","m":["x","o"],"d":"Backtick string including the backticks","s":"builtin","t":"v_a`","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced backticks searched over 50 lines; does not include the trailing whitespace."},{"k":"ab","m":["x","o"],"d":"( ) block including the parentheses","s":"builtin","t":"v_ab","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai here: <code>b<\/code> matches any of <code>()<\/code>, <code>[]<\/code>, <code>{}<\/code>, and it works from outside the pair (cover-or-next search)."},{"k":"ap","m":["x","o"],"d":"A paragraph, plus the following blank lines","s":"builtin","t":"v_ap","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"e":1},{"k":"as","m":["x","o"],"d":"A sentence, plus white space","s":"builtin","t":"v_as","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"at","m":["x","o"],"d":"XML/HTML tag pair including the tags","s":"builtin","t":"v_at","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai's pattern-based tag textobject; same-name nested tags can mis-match.","e":1},{"k":"aw","m":["x","o"],"d":"A word, plus surrounding white space","s":"builtin","t":"v_aw","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"<kbd>daw<\/kbd> deletes the word and one space, so the sentence stays tidy","e":1},{"k":"a{","m":["x","o"],"d":"{ } block including the braces (same as aB)","s":"builtin","t":"v_a{","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a}","m":["x","o"],"d":"{ } block including the braces (same as aB)","s":"builtin","t":"v_a}","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"i\"","m":["x","o"],"d":"Inside double quotes","s":"builtin","t":"v_iquote","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quote pairs, cover-or-next search over 50 lines.","e":1},{"k":"i'","m":["x","o"],"d":"Inside single quotes","s":"builtin","t":"v_i'","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quote pairs, cover-or-next search over 50 lines.","e":1},{"k":"i(","m":["x","o"],"d":"Inside ( ) parentheses (same as ib)","s":"builtin","t":"v_i(","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i(<\/code> leaves out the whitespace just inside the brackets, <code>i)<\/code> includes it; searches forward if not inside a pair.","e":1},{"k":"i)","m":["x","o"],"d":"Inside ( ) parentheses (same as ib)","s":"builtin","t":"v_i)","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes the whitespace just inside the brackets (<code>i(<\/code> leaves it out); searches forward if not inside a pair."},{"k":"i<","m":["x","o"],"d":"Inside < > angle brackets","s":"builtin","t":"v_i<","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i&lt;<\/code> leaves out inner edge whitespace, <code>i&gt;<\/code> includes it."},{"k":"i>","m":["x","o"],"d":"Inside < > angle brackets","s":"builtin","t":"v_i>","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i&lt;<\/code> leaves it out)."},{"k":"iB","m":["x","o"],"d":"Inside { } braces","s":"builtin","t":"v_iB","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Still Vim's built-in: mini.ai passes letters it doesn't define through.","e":1},{"k":"iW","m":["x","o"],"d":"Inner WORD","s":"builtin","t":"v_iW","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"i[","m":["x","o"],"d":"Inside [ ] brackets","s":"builtin","t":"v_i[","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i[<\/code> leaves out inner edge whitespace, <code>i]<\/code> includes it.","e":1},{"k":"i]","m":["x","o"],"d":"Inside [ ] brackets","s":"builtin","t":"v_i]","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i[<\/code> leaves it out)."},{"k":"i`","m":["x","o"],"d":"Inside backticks","s":"builtin","t":"v_i`","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced backtick pairs, cover-or-next search over 50 lines."},{"k":"ib","m":["x","o"],"d":"Inside ( ) parentheses","s":"builtin","t":"v_ib","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai here: <code>b<\/code> matches any of <code>()<\/code>, <code>[]<\/code>, <code>{}<\/code>, and it works from outside the pair (cover-or-next search)."},{"k":"ip","m":["x","o"],"d":"Inner paragraph","s":"builtin","t":"v_ip","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"e":1},{"k":"is","m":["x","o"],"d":"Inner sentence","s":"builtin","t":"v_is","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"it","m":["x","o"],"d":"Inside an XML/HTML tag pair","s":"builtin","t":"v_it","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai's pattern-based tag textobject; same-name nested tags can mis-match.","e":1},{"k":"iw","m":["x","o"],"d":"Inner word","s":"builtin","t":"v_iw","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Text objects work after an operator (<kbd>diw<\/kbd>, <kbd>ci\"<\/kbd>, <kbd>yap<\/kbd>) or in Visual mode; <kbd>i<\/kbd> = inner, <kbd>a<\/kbd> = around","e":1},{"k":"i{","m":["x","o"],"d":"Inside { } braces (same as iB)","s":"builtin","t":"v_i{","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i{<\/code> leaves out inner edge whitespace, <code>i}<\/code> includes it."},{"k":"i}","m":["x","o"],"d":"Inside { } braces (same as iB)","s":"builtin","t":"v_i}","h":"motion.txt","sec":"Text objects","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i{<\/code> leaves it out)."},{"k":"<C-W><C-B>","m":["n"],"d":"same as \"CTRL-W b\"","s":"builtin","t":"CTRL-W_CTRL-B","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-C>","m":["n"],"d":"Does nothing (cancels a pending CTRL-W)","s":"builtin","t":"CTRL-W_CTRL-C","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-D>","m":["n"],"d":"same as \"CTRL-W d\"","s":"builtin","t":"CTRL-W_CTRL-D","h":"tagsrch.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"ov":[{"m":"n","by":185}]},{"k":"<C-W><C-F>","m":["n"],"d":"same as \"CTRL-W f\"","s":"builtin","t":"CTRL-W_CTRL-F","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-G>","m":["n"],"d":"same as \"CTRL-W g ..\"","s":"builtin","t":null,"h":null,"sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-H>","m":["n"],"d":"same as \"CTRL-W h\"","s":"builtin","t":"CTRL-W_CTRL-H","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-I>","m":["n"],"d":"same as \"CTRL-W i\"","s":"builtin","t":"CTRL-W_CTRL-I","h":"tagsrch.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-J>","m":["n"],"d":"same as \"CTRL-W j\"","s":"builtin","t":"CTRL-W_CTRL-J","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-K>","m":["n"],"d":"same as \"CTRL-W k\"","s":"builtin","t":"CTRL-W_CTRL-K","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-L>","m":["n"],"d":"same as \"CTRL-W l\"","s":"builtin","t":"CTRL-W_CTRL-L","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-N>","m":["n"],"d":"same as \"CTRL-W n\"","s":"builtin","t":"CTRL-W_CTRL-N","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-O>","m":["n"],"d":"same as \"CTRL-W o\"","s":"builtin","t":"CTRL-W_CTRL-O","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-P>","m":["n"],"d":"same as \"CTRL-W p\"","s":"builtin","t":"CTRL-W_CTRL-P","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-Q>","m":["n"],"d":"same as \"CTRL-W q\"","s":"builtin","t":"CTRL-W_CTRL-Q","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-R>","m":["n"],"d":"same as \"CTRL-W r\"","s":"builtin","t":"CTRL-W_CTRL-R","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-S>","m":["n"],"d":"same as \"CTRL-W s\"","s":"builtin","t":"CTRL-W_CTRL-S","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-T>","m":["n"],"d":"same as \"CTRL-W t\"","s":"builtin","t":"CTRL-W_CTRL-T","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-V>","m":["n"],"d":"same as \"CTRL-W v\"","s":"builtin","t":"CTRL-W_CTRL-V","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-W>","m":["n"],"d":"same as \"CTRL-W w\"","s":"builtin","t":"CTRL-W_CTRL-W","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-X>","m":["n"],"d":"same as \"CTRL-W x\"","s":"builtin","t":"CTRL-W_CTRL-X","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-Z>","m":["n"],"d":"same as \"CTRL-W z\"","s":"builtin","t":"CTRL-W_CTRL-Z","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-]>","m":["n"],"d":"same as \"CTRL-W ]\"","s":"builtin","t":"CTRL-W_CTRL-]","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-^>","m":["n"],"d":"same as \"CTRL-W ^\"","s":"builtin","t":"CTRL-W_CTRL-^","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><C-_>","m":["n"],"d":"same as \"CTRL-W _\"","s":"builtin","t":"CTRL-W_CTRL-_","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>+","m":["n"],"d":"Increase window height by N lines","s":"builtin","t":"CTRL-W_+","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>-","m":["n"],"d":"Decrease window height by N lines","s":"builtin","t":"CTRL-W_-","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><","m":["n"],"d":"Decrease window width by N columns","s":"builtin","t":"CTRL-W_<","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>=","m":["n"],"d":"Make all windows (almost) the same size","s":"builtin","t":"CTRL-W_=","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>>","m":["n"],"d":"Increase window width by N columns","s":"builtin","t":"CTRL-W_>","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>H","m":["n"],"d":"Move the window to the far left (full height)","s":"builtin","t":"CTRL-W_H","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>J","m":["n"],"d":"Move the window to the very bottom (full width)","s":"builtin","t":"CTRL-W_J","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>K","m":["n"],"d":"Move the window to the very top (full width)","s":"builtin","t":"CTRL-W_K","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>L","m":["n"],"d":"Move the window to the far right (full height)","s":"builtin","t":"CTRL-W_L","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>P","m":["n"],"d":"Go to the preview window","s":"builtin","t":"CTRL-W_P","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>R","m":["n"],"d":"Rotate windows upwards / leftwards","s":"builtin","t":"CTRL-W_R","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>S","m":["n"],"d":"Split the window horizontally (same as s)","s":"builtin","t":"CTRL-W_S","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>T","m":["n"],"d":"Move the window to a new tab page","s":"builtin","t":"CTRL-W_T","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>W","m":["n"],"d":"Go to the previous window (wraps)","s":"builtin","t":"CTRL-W_W","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>]","m":["n"],"d":"Split and jump to the tag under the cursor","s":"builtin","t":"CTRL-W_]","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>^","m":["n"],"d":"Split and edit the alternate file (or buffer N)","s":"builtin","t":"CTRL-W_^","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>_","m":["n"],"d":"Maximize window height (or set it to N)","s":"builtin","t":"CTRL-W__","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>b","m":["n"],"d":"Go to the bottom-right window","s":"builtin","t":"CTRL-W_b","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>c","m":["n"],"d":"Close the window (like :close; never closes the last one)","s":"builtin","t":"CTRL-W_c","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"n":"<kbd>&lt;C-w&gt;c<\/kbd> rather than <kbd>&lt;C-w&gt;&lt;C-c&gt;<\/kbd> (CTRL-C cancels)"},{"k":"<C-W>d","m":["n"],"d":"Split and jump to the #define of the word under the cursor","s":"builtin","t":"CTRL-W_d","h":"tagsrch.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"n":"Neovim remaps <kbd>&lt;C-w&gt;d<\/kbd> / <kbd>&lt;C-w&gt;&lt;C-d&gt;<\/kbd> to show diagnostics in a float","ov":[{"m":"n","by":186}]},{"k":"<C-W>f","m":["n"],"d":"Split and edit the file name under the cursor","s":"builtin","t":"CTRL-W_f","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>F","m":["n"],"d":"Split, edit the file under the cursor and go to its line number","s":"builtin","t":"CTRL-W_F","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>g<C-]>","m":["n"],"d":"split window and do |:tjump| to tag under cursor","s":"builtin","t":"CTRL-W_g_CTRL-]","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>g]","m":["n"],"d":"split window and do |:tselect| for tag under cursor","s":"builtin","t":"CTRL-W_g]","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>g}","m":["n"],"d":"do a |:ptjump| to the tag under the cursor","s":"builtin","t":"CTRL-W_g}","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>gf","m":["n"],"d":"Edit the file name under the cursor in a new tab","s":"builtin","t":"CTRL-W_gf","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>gF","m":["n"],"d":"edit file name under the cursor in a new tabpage and jump to the line number following the file name.","s":"builtin","t":"CTRL-W_gF","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>gt","m":["n"],"d":"same as `gt`: go to next tabpage","s":"builtin","t":"CTRL-W_gt","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>gT","m":["n"],"d":"same as `gT`: go to previous tabpage","s":"builtin","t":"CTRL-W_gT","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>g<Tab>","m":["n"],"d":"same as |g<Tab>|: go to last accessed tab page","s":"builtin","t":"CTRL-W_g<Tab>","h":"tabpage.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>h","m":["n"],"d":"Go to the window on the left","s":"builtin","t":"CTRL-W_h","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>i","m":["n"],"d":"Split and jump to the declaration of the word under the cursor","s":"builtin","t":"CTRL-W_i","h":"tagsrch.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>j","m":["n"],"d":"Go to the window below","s":"builtin","t":"CTRL-W_j","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>k","m":["n"],"d":"Go to the window above","s":"builtin","t":"CTRL-W_k","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>l","m":["n"],"d":"Go to the window on the right","s":"builtin","t":"CTRL-W_l","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>n","m":["n"],"d":"Open a new window with an empty buffer","s":"builtin","t":"CTRL-W_n","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>o","m":["n"],"d":"Close all other windows (like :only)","s":"builtin","t":"CTRL-W_o","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>p","m":["n"],"d":"Go to the previous (last accessed) window","s":"builtin","t":"CTRL-W_p","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>q","m":["n"],"d":"Quit the window (like :quit; quits Neovim if it is the last)","s":"builtin","t":"CTRL-W_q","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>r","m":["n"],"d":"Rotate windows downwards / rightwards","s":"builtin","t":"CTRL-W_r","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>s","m":["n"],"d":"Split the window horizontally","s":"builtin","t":"CTRL-W_s","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>t","m":["n"],"d":"Go to the top-left window","s":"builtin","t":"CTRL-W_t","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>v","m":["n"],"d":"Split the window vertically","s":"builtin","t":"CTRL-W_v","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-W>w","m":["n"],"d":"Go to the next window (wraps); with N: go to window N","s":"builtin","t":"CTRL-W_w","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null,"n":"Most CTRL-W keys also work with CTRL held for the second key: <kbd>&lt;C-w&gt;&lt;C-w&gt;<\/kbd>","e":1},{"k":"<C-W>x","m":["n"],"d":"Swap with the next window (or window N)","s":"builtin","t":"CTRL-W_x","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>z","m":["n"],"d":"Close the preview window","s":"builtin","t":"CTRL-W_z","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>|","m":["n"],"d":"Maximize window width (or set it to N columns)","s":"builtin","t":"CTRL-W_bar","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W>}","m":["n"],"d":"Show the tag under the cursor in the preview window","s":"builtin","t":"CTRL-W_}","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><Down>","m":["n"],"d":"same as \"CTRL-W j\"","s":"builtin","t":"CTRL-W_<Down>","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><Up>","m":["n"],"d":"same as \"CTRL-W k\"","s":"builtin","t":"CTRL-W_<Up>","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><Left>","m":["n"],"d":"same as \"CTRL-W h\"","s":"builtin","t":"CTRL-W_<Left>","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"<C-W><Right>","m":["n"],"d":"same as \"CTRL-W l\"","s":"builtin","t":"CTRL-W_<Right>","h":"windows.txt","sec":"Window commands","cat":"Window","mo":null,"ch":null,"ctx":null},{"k":"[<C-D>","m":["n"],"d":"Jump to first #define matching the word under cursor","s":"builtin","t":"[_CTRL-D","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"[<C-I>","m":["n"],"d":"Jump to first line containing the word under cursor","s":"builtin","t":"[_CTRL-I","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"[#","m":["n","x","o"],"d":"Back to unmatched #if / #else","s":"builtin","t":"[#","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"['","m":["n","x","o"],"d":"To previous line with a lowercase mark","s":"builtin","t":"['","h":"motion.txt","sec":"Square bracket commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"[(","m":["n","x","o"],"d":"Back to unmatched '('","s":"builtin","t":"[(","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[*","m":["n","x","o"],"d":"same as \"[/\"","s":"builtin","t":"[star","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[`","m":["n","x","o"],"d":"To previous lowercase mark","s":"builtin","t":"[`","h":"motion.txt","sec":"Square bracket commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"[/","m":["n","x","o"],"d":"Back to start of a C comment /*","s":"builtin","t":"[/","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[D","m":["n"],"d":"List #defines matching the word under cursor","s":"builtin","t":"[D","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Neovim remaps this key to diagnostic navigation; the #define search is only reachable via <code>:normal!<\/code>","ov":[{"m":"n","by":115}]},{"k":"[I","m":["n"],"d":"List lines containing the word under cursor (also in included files)","s":"builtin","t":"[I","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"[P","m":["n"],"d":"Put before, adjusting indent (same as [p)","s":"builtin","t":"[P","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"[[","m":["n","x","o"],"d":"Back to previous section ('{' in column 1)","s":"builtin","t":"[[","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Normal mode: Snacks words <em>previous LSP reference<\/em>; Markdown: previous heading.","ov":[{"m":"n","by":100},{"m":"n","by":240},{"m":"x","by":243}]},{"k":"[]","m":["n","x","o"],"d":"Back to previous section end ('}' in column 1)","s":"builtin","t":"[]","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[c","m":["n","x","o"],"d":"Diff: previous change","s":"builtin","t":"[c","h":"diff.txt","sec":"Square bracket commands","cat":"Diff","mo":1,"ch":null,"ctx":null},{"k":"[d","m":["n"],"d":"Show first #define matching the word under cursor","s":"builtin","t":"[d","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Neovim remaps this key to diagnostic navigation; the #define search is only reachable via <code>:normal!<\/code>","ov":[{"m":"n","by":116}]},{"k":"[f","m":["n"],"d":"Edit the file under the cursor (same as gf)","s":"builtin","t":"[f","h":"deprecated.txt","sec":"Square bracket commands","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"[i","m":["n"],"d":"Show first line containing the word under cursor (incl. included files)","s":"builtin","t":"[i","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"ov":[{"m":"n","by":98}]},{"k":"[m","m":["n","x","o"],"d":"Back to start of a method (Java/C++ style class)","s":"builtin","t":"[m","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[p","m":["n"],"d":"Put before, adjusting indent to the current line","s":"builtin","t":"[p","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"[s","m":["n","x","o"],"d":"Move to the previous misspelled word","s":"builtin","t":"[s","h":"spell.txt","sec":"Square bracket commands","cat":"Spell","mo":1,"ch":null,"ctx":null},{"k":"[z","m":["n","x","o"],"d":"Move to the start of the current open fold","s":"builtin","t":"[z","h":"fold.txt","sec":"Square bracket commands","cat":"Fold","mo":1,"ch":null,"ctx":null},{"k":"[{","m":["n","x","o"],"d":"Back to unmatched '{' (start of block)","s":"builtin","t":"[{","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[<MiddleMouse>","m":["n"],"d":"same as \"[p\"","s":"builtin","t":"[<MiddleMouse>","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"]<C-D>","m":["n"],"d":"Jump to first #define below the cursor matching the word","s":"builtin","t":"]_CTRL-D","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"]<C-I>","m":["n"],"d":"Jump to first line below the cursor containing the word","s":"builtin","t":"]_CTRL-I","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"]#","m":["n","x","o"],"d":"Forward to unmatched #else / #endif","s":"builtin","t":"]#","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]'","m":["n","x","o"],"d":"To next line with a lowercase mark","s":"builtin","t":"]'","h":"motion.txt","sec":"Square bracket commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"])","m":["n","x","o"],"d":"Forward to unmatched ')'","s":"builtin","t":"])","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]*","m":["n","x","o"],"d":"same as \"]/\"","s":"builtin","t":"]star","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]`","m":["n","x","o"],"d":"To next lowercase mark","s":"builtin","t":"]`","h":"motion.txt","sec":"Square bracket commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"]/","m":["n","x","o"],"d":"Forward to end of a C comment */","s":"builtin","t":"]/","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]D","m":["n"],"d":"List #defines matching the word under cursor, starting at the cursor","s":"builtin","t":"]D","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Neovim remaps this key to diagnostic navigation; the #define search is only reachable via <code>:normal!<\/code>","ov":[{"m":"n","by":134}]},{"k":"]I","m":["n"],"d":"List lines containing the word under cursor, starting at the cursor","s":"builtin","t":"]I","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"]P","m":["n"],"d":"Put before, adjusting indent (same as [p)","s":"builtin","t":"]P","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"][","m":["n","x","o"],"d":"Forward to next section end ('}' in column 1)","s":"builtin","t":"][","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]]","m":["n","x","o"],"d":"Forward to next section ('{' in column 1)","s":"builtin","t":"]]","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"n":"Normal mode: Snacks words <em>next LSP reference<\/em>; Markdown: next heading.","ov":[{"m":"n","by":119},{"m":"n","by":241},{"m":"x","by":244}]},{"k":"]c","m":["n","x","o"],"d":"Diff: next change","s":"builtin","t":"]c","h":"diff.txt","sec":"Square bracket commands","cat":"Diff","mo":1,"ch":null,"ctx":null,"n":"Not remapped here: gitsigns is set up without keymaps, so <kbd>]c<\/kbd>/<kbd>[c<\/kbd> only move between diff changes"},{"k":"]d","m":["n"],"d":"Show first #define below the cursor matching the word","s":"builtin","t":"]d","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Neovim remaps this key to diagnostic navigation; the #define search is only reachable via <code>:normal!<\/code>","ov":[{"m":"n","by":135}]},{"k":"]f","m":["n"],"d":"Edit the file under the cursor (same as gf)","s":"builtin","t":"]f","h":"deprecated.txt","sec":"Square bracket commands","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"]i","m":["n"],"d":"Show first line below the cursor containing the word","s":"builtin","t":"]i","h":"tagsrch.txt","sec":"Square bracket commands","cat":"Search","mo":null,"ch":null,"ctx":null,"ov":[{"m":"n","by":117}]},{"k":"]m","m":["n","x","o"],"d":"Forward to start of the next method (Java/C++ style class)","s":"builtin","t":"]m","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]p","m":["n"],"d":"Put after, adjusting indent to the current line","s":"builtin","t":"]p","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"]s","m":["n","x","o"],"d":"Move to the next misspelled word","s":"builtin","t":"]s","h":"spell.txt","sec":"Square bracket commands","cat":"Spell","mo":1,"ch":null,"ctx":null,"e":1},{"k":"]z","m":["n","x","o"],"d":"Move to the end of the current open fold","s":"builtin","t":"]z","h":"fold.txt","sec":"Square bracket commands","cat":"Fold","mo":1,"ch":null,"ctx":null},{"k":"]}","m":["n","x","o"],"d":"Forward to unmatched '}' (end of block)","s":"builtin","t":"]}","h":"motion.txt","sec":"Square bracket commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"]<MiddleMouse>","m":["n"],"d":"same as \"]p\"","s":"builtin","t":"]<MiddleMouse>","h":"change.txt","sec":"Square bracket commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"g<C-G>","m":["n"],"d":"Show cursor position plus word, character and byte counts","s":"builtin","t":"g_CTRL-G","h":"editing.txt","sec":"g commands","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"g<C-H>","m":["n"],"d":"Start Select mode (blockwise)","s":"builtin","t":"g_CTRL-H","h":"visual.txt","sec":"g commands","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"g<C-]>","m":["n"],"d":"Jump to the tag, or list matches if there are several (:tjump)","s":"builtin","t":"g_CTRL-]","h":"tagsrch.txt","sec":"g commands","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"g#","m":["n","x","o"],"d":"Like # but also matches inside longer words","s":"builtin","t":"g#","h":"pattern.txt","sec":"g commands","cat":"Search","mo":1,"ch":null,"ctx":null},{"k":"g$","m":["n","x","o"],"d":"To last character of the screen line","s":"builtin","t":"g$","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g&","m":["n"],"d":"Repeat last :s on all lines with the same pattern and flags","s":"builtin","t":"g&","h":"change.txt","sec":"g commands","cat":"Undo & repeat","mo":null,"ch":1,"ctx":null},{"k":"g'{mark}","m":["n","x","o"],"d":"Jump to mark without adding to the jump list (line)","s":"builtin","t":"g'","h":"motion.txt","sec":"g commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"g`{mark}","m":["n","x","o"],"d":"Jump to mark without adding to the jump list (exact position)","s":"builtin","t":"g`","h":"motion.txt","sec":"g commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"g*","m":["n","x","o"],"d":"Like * but also matches inside longer words","s":"builtin","t":"gstar","h":"pattern.txt","sec":"g commands","cat":"Search","mo":1,"ch":null,"ctx":null},{"k":"g+","m":["n"],"d":"Go to newer text state (walks undo branches by time)","s":"builtin","t":"g+","h":"undo.txt","sec":"g commands","cat":"Undo & repeat","mo":null,"ch":null,"ctx":null},{"k":"g,","m":["n","x","o"],"d":"Go to a newer position in the change list","s":"builtin","t":"g,","h":"motion.txt","sec":"g commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null},{"k":"g-","m":["n"],"d":"Go to older text state (walks undo branches by time)","s":"builtin","t":"g-","h":"undo.txt","sec":"g commands","cat":"Undo & repeat","mo":null,"ch":null,"ctx":null},{"k":"g0","m":["n","x","o"],"d":"To first character of the screen line","s":"builtin","t":"g0","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g8","m":["n"],"d":"Show the UTF-8 bytes of the character under the cursor","s":"builtin","t":"g8","h":"various.txt","sec":"g commands","cat":"Help","mo":null,"ch":null,"ctx":null},{"k":"g;","m":["n","x","o"],"d":"Go to an older position in the change list","s":"builtin","t":"g;","h":"motion.txt","sec":"g commands","cat":"Mark & jump","mo":1,"ch":null,"ctx":null,"n":"Change list = positions of your edits; <kbd>:changes<\/kbd> lists them","e":1},{"k":"g<","m":["n"],"d":"Show the output of the previous command again","s":"builtin","t":"g<","h":"message.txt","sec":"g commands","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"g?","m":["n"],"d":"ROT13-encode {motion} text","s":"builtin","t":"g?","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":"g??","m":["n"],"d":"ROT13-encode the current line","s":"builtin","t":"g?g?","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"g?g?","m":["n"],"d":"ROT13-encode the current line","s":"builtin","t":"g?g?","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gD","m":["n","x","o"],"d":"Go to global declaration of the word (searches from top of file)","s":"builtin","t":"gD","h":"pattern.txt","sec":"g commands","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"This config maps <kbd>gD<\/kbd> to the Snacks LSP declarations picker","ov":[{"m":"n","by":146}]},{"k":"gE","m":["n","x","o"],"d":"Back to end of previous WORD","s":"builtin","t":"gE","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"gH","m":["n"],"d":"Start Select mode (linewise)","s":"builtin","t":"gH","h":"visual.txt","sec":"g commands","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"gI","m":["n"],"d":"Insert at column 1","s":"builtin","t":"gI","h":"insert.txt","sec":"g commands","cat":"Insert","mo":null,"ch":1,"ctx":null,"n":"This config maps <kbd>gI<\/kbd> to the Snacks LSP implementations picker","ov":[{"m":"n","by":145}]},{"k":"gJ","m":["n"],"d":"Join lines without inserting or removing spaces","s":"builtin","t":"gJ","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gN","m":["n"],"d":"Select previous match of the last search","s":"builtin","t":"gN","h":"visual.txt","sec":"g commands","cat":"Search","mo":null,"ch":null,"ctx":null},{"k":"[\"x]gP","m":["n"],"d":"Put before the cursor and leave the cursor after the pasted text","s":"builtin","t":"gP","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gQ","m":["n"],"d":"Enter Ex mode (keep entering : commands; :vi to return)","s":"builtin","t":"gQ","h":"intro.txt","sec":"g commands","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"gR","m":["n"],"d":"Enter Virtual Replace mode (overtype screen cells, tabs stay intact)","s":"builtin","t":"gR","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gT","m":["n"],"d":"Go to the previous tab page","s":"builtin","t":"gT","h":"tabpage.txt","sec":"g commands","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null},{"k":"gU{motion}","m":["n"],"d":"Uppercase {motion} text","s":"builtin","t":"gU","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null,"e":1},{"k":"gV","m":["n"],"d":"In a Select-mode mapping: don't reselect the area afterwards","s":"builtin","t":"gV","h":"visual.txt","sec":"g commands","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"g]","m":["n"],"d":"List all tags matching the word under the cursor (:tselect)","s":"builtin","t":"g]","h":"tagsrch.txt","sec":"g commands","cat":"Tags","mo":null,"ch":null,"ctx":null,"n":"Now mini.ai's <em>move to right edge of textobject<\/em>. Use <code>:tselect<\/code> or <code>g&lt;C-]&gt;<\/code>.","ov":[{"m":"n","by":139}]},{"k":"g^","m":["n","x","o"],"d":"To first non-blank of the screen line","s":"builtin","t":"g^","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g_","m":["n","x","o"],"d":"To last non-blank character of the line (N-1 lines down)","s":"builtin","t":"g_","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"ga","m":["n"],"d":"Show the character code under the cursor (decimal, hex, octal)","s":"builtin","t":"ga","h":"various.txt","sec":"g commands","cat":"Help","mo":null,"ch":null,"ctx":null,"n":"This config's <kbd>gai<\/kbd>/<kbd>gao<\/kbd> (LSP calls) make <kbd>ga<\/kbd> wait for 'timeoutlen'","wait":[{"m":"n","ext":["gai","gao"],"n":2}]},{"k":"gd","m":["n","x","o"],"d":"Go to local declaration of the word (searches back in the function)","s":"builtin","t":"gd","h":"pattern.txt","sec":"g commands","cat":"Search","mo":1,"ch":null,"ctx":null,"n":"This config maps <kbd>gd<\/kbd> to the Snacks LSP definitions picker","ov":[{"m":"n","by":147}]},{"k":"ge","m":["n","x","o"],"d":"Back to end of previous word","s":"builtin","t":"ge","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"gf","m":["n"],"d":"Edit the file whose name is under the cursor","s":"builtin","t":"gf","h":"editing.txt","sec":"g commands","cat":"Files","mo":null,"ch":null,"ctx":null,"e":1},{"k":"gF","m":["n"],"d":"Edit the file under the cursor and jump to the line number after it","s":"builtin","t":"gF","h":"editing.txt","sec":"g commands","cat":"Files","mo":null,"ch":null,"ctx":null},{"k":"gg","m":["n","x","o"],"d":"To first line, or to line N","s":"builtin","t":"gg","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"gh","m":["n"],"d":"Start Select mode (charwise)","s":"builtin","t":"gh","h":"visual.txt","sec":"g commands","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"gi","m":["n"],"d":"Insert where Insert mode was last stopped","s":"builtin","t":"gi","h":"insert.txt","sec":"g commands","cat":"Insert","mo":null,"ch":1,"ctx":null,"e":1},{"k":"gj","m":["n","x","o"],"d":"Down N display (wrapped) lines","s":"builtin","t":"gj","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"gk","m":["n","x","o"],"d":"Up N display (wrapped) lines","s":"builtin","t":"gk","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null,"e":1},{"k":"gm","m":["n","x","o"],"d":"To middle of the screen width","s":"builtin","t":"gm","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"gM","m":["n","x","o"],"d":"To middle of the text line (N percent with a count)","s":"builtin","t":"gM","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"gn","m":["n"],"d":"Select next match of the last search (cgn + . changes them one by one)","s":"builtin","t":"gn","h":"visual.txt","sec":"g commands","cat":"Search","mo":null,"ch":null,"ctx":null,"n":"Works as a text object: <kbd>cgn<\/kbd> changes the next match, then <kbd>.<\/kbd> repeats on the next one","e":1},{"k":"go","m":["n","x","o"],"d":"To byte N in the buffer","s":"builtin","t":"go","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"[\"x]gp","m":["n"],"d":"Put after the cursor and leave the cursor after the pasted text","s":"builtin","t":"gp","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gq{motion}","m":["n"],"d":"Format {motion} lines ('textwidth' / 'formatexpr'); cursor moves","s":"builtin","t":"gq","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"When an LSP attaches, Neovim sets 'formatexpr' to the LSP formatter if it was empty","e":1},{"k":"gr{char}","m":["n"],"d":"Virtual-replace N characters with {char}","s":"builtin","t":"gr","h":"change.txt","sec":"g commands","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Neovim's <kbd>grn<\/kbd>/<kbd>gra<\/kbd>/<kbd>grr<\/kbd>/<kbd>gri<\/kbd>/<kbd>grt<\/kbd>/<kbd>grx<\/kbd> LSP maps extend <kbd>gr<\/kbd>, so it waits for 'timeoutlen' before acting"},{"k":"gs","m":["n"],"d":"Sleep N seconds (default 1)","s":"builtin","t":"gs","h":"various.txt","sec":"g commands","cat":"Misc","mo":null,"ch":null,"ctx":null},{"k":"gt","m":["n"],"d":"Go to the next tab page (with N: tab page N)","s":"builtin","t":"gt","h":"tabpage.txt","sec":"g commands","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null,"e":1},{"k":"gu{motion}","m":["n"],"d":"Lowercase {motion} text","s":"builtin","t":"gu","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null,"e":1},{"k":"gv","m":["n"],"d":"Reselect the previous Visual area","s":"builtin","t":"gv","h":"visual.txt","sec":"g commands","cat":"Visual","mo":null,"ch":null,"ctx":null,"e":1},{"k":"gw{motion}","m":["n"],"d":"Format {motion} lines and keep the cursor where it was","s":"builtin","t":"gw","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":"gx","m":["n"],"d":"Open the file path or URL under the cursor with the system handler","s":"builtin","t":"gx","h":"various.txt","sec":"g commands","cat":"Files","mo":null,"ch":null,"ctx":null,"n":"Neovim maps <kbd>gx<\/kbd> (Normal and Visual) to <code>vim.ui.open()<\/code>: URLs, paths, LSP document links; in help files, help tags","e":1,"ov":[{"m":"n","by":157}]},{"k":"g@{motion}","m":["n"],"d":"Run 'operatorfunc' on {motion} (custom operators)","s":"builtin","t":"g@","h":"map.txt","sec":"g commands","cat":"Operator","mo":null,"ch":null,"ctx":null},{"k":"g~{motion}","m":["n"],"d":"Toggle case of {motion} text","s":"builtin","t":"g~","h":"change.txt","sec":"g commands","cat":"Operator","mo":null,"ch":1,"ctx":null,"e":1},{"k":"g<Down>","m":["n","x","o"],"d":"same as \"gj\"","s":"builtin","t":"g<Down>","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g<End>","m":["n","x","o"],"d":"same as \"g$\" but go to the rightmost non-blank character instead","s":"builtin","t":"g<End>","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g<Home>","m":["n","x","o"],"d":"same as \"g0\"","s":"builtin","t":"g<Home>","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"g<LeftMouse>","m":["n"],"d":"same as <C-LeftMouse>","s":"builtin","t":"g<LeftMouse>","h":"tagsrch.txt","sec":"g commands","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"g<MiddleMouse>","m":["n"],"d":"Paste at the mouse click (same as <C-MiddleMouse>)","s":"builtin","t":null,"h":null,"sec":"g commands","cat":"Edit","mo":null,"ch":null,"ctx":null},{"k":"g<RightMouse>","m":["n"],"d":"same as <C-RightMouse>","s":"builtin","t":"g<RightMouse>","h":"tagsrch.txt","sec":"g commands","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"g<Tab>","m":["n"],"d":"Go to the last accessed tab page","s":"builtin","t":"g<Tab>","h":"tabpage.txt","sec":"g commands","cat":"Buffer & tab","mo":null,"ch":null,"ctx":null},{"k":"g<Up>","m":["n","x","o"],"d":"same as \"gk\"","s":"builtin","t":"g<Up>","h":"motion.txt","sec":"g commands","cat":"Motion","mo":1,"ch":null,"ctx":null},{"k":"z<CR>","m":["n"],"d":"Cursor line to top of window, cursor on first non-blank","s":"builtin","t":"z<CR>","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z{height}<CR>","m":["n"],"d":"redraw, make window {height} lines high","s":"builtin","t":"zN<CR>","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z+","m":["n"],"d":"cursor on line N (default line below window), otherwise like \"z<CR>\"","s":"builtin","t":"z+","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z-","m":["n"],"d":"Cursor line to bottom of window, cursor on first non-blank","s":"builtin","t":"z-","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z.","m":["n"],"d":"Cursor line to center of window, cursor on first non-blank","s":"builtin","t":"z.","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z=","m":["n"],"d":"Spelling suggestions for the word under the cursor","s":"builtin","t":"z=","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null,"n":"Needs 'spell' on (<code>:set spell<\/code>); a count picks suggestion N directly","e":1},{"k":"zA","m":["n"],"d":"Toggle the fold under the cursor recursively","s":"builtin","t":"zA","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zC","m":["n"],"d":"Close all folds under the cursor recursively","s":"builtin","t":"zC","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zD","m":["n"],"d":"Delete folds under the cursor recursively","s":"builtin","t":"zD","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zE","m":["n"],"d":"Delete all folds in the window","s":"builtin","t":"zE","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zF","m":["n"],"d":"Create a fold for N lines","s":"builtin","t":"zF","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zG","m":["n"],"d":"Mark the word correct for this session only","s":"builtin","t":"zG","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zH","m":["n"],"d":"Scroll the view half a screen width left (nowrap only)","s":"builtin","t":"zH","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zL","m":["n"],"d":"Scroll the view half a screen width right (nowrap only)","s":"builtin","t":"zL","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zM","m":["n"],"d":"Close all folds (set 'foldlevel' to 0)","s":"builtin","t":"zM","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zN","m":["n"],"d":"Re-enable folding","s":"builtin","t":"zN","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zO","m":["n"],"d":"Open all folds under the cursor recursively","s":"builtin","t":"zO","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zR","m":["n"],"d":"Open all folds (set 'foldlevel' to the deepest)","s":"builtin","t":"zR","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zW","m":["n"],"d":"Mark the word wrong for this session only","s":"builtin","t":"zW","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zX","m":["n"],"d":"Reset folds to 'foldlevel'","s":"builtin","t":"zX","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"z^","m":["n"],"d":"cursor on line N (default line above window), otherwise like \"z-\"","s":"builtin","t":"z^","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"za","m":["n"],"d":"Toggle the fold under the cursor","s":"builtin","t":"za","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zb","m":["n"],"d":"Scroll so the cursor line is at the bottom","s":"builtin","t":"zb","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zc","m":["n"],"d":"Close the fold under the cursor","s":"builtin","t":"zc","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zd","m":["n"],"d":"Delete the fold under the cursor","s":"builtin","t":"zd","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"ze","m":["n"],"d":"Scroll horizontally so the cursor is at the right edge (nowrap only)","s":"builtin","t":"ze","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zf{motion}","m":["n"],"d":"Create a fold over {motion} (manual / marker folding)","s":"builtin","t":"zf","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zg","m":["n"],"d":"Add the word to the spell file as correct","s":"builtin","t":"zg","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zh","m":["n"],"d":"Scroll the view N characters left (nowrap only)","s":"builtin","t":"zh","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zi","m":["n"],"d":"Toggle folding on/off ('foldenable')","s":"builtin","t":"zi","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zj","m":["n","x","o"],"d":"Move down to the start of the next fold","s":"builtin","t":"zj","h":"fold.txt","sec":"z commands","cat":"Fold","mo":1,"ch":null,"ctx":null},{"k":"zk","m":["n","x","o"],"d":"Move up to the end of the previous fold","s":"builtin","t":"zk","h":"fold.txt","sec":"z commands","cat":"Fold","mo":1,"ch":null,"ctx":null},{"k":"zl","m":["n"],"d":"Scroll the view N characters right (nowrap only)","s":"builtin","t":"zl","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zm","m":["n"],"d":"Close one more fold level everywhere ('foldlevel' - 1)","s":"builtin","t":"zm","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zn","m":["n"],"d":"Disable folding (open everything)","s":"builtin","t":"zn","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zo","m":["n"],"d":"Open the fold under the cursor","s":"builtin","t":"zo","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zp","m":["n"],"d":"Put block without trailing spaces (after)","s":"builtin","t":"zp","h":"change.txt","sec":"z commands","cat":"Edit","mo":null,"ch":null,"ctx":null},{"k":"zP","m":["n"],"d":"Put block without trailing spaces (before)","s":"builtin","t":"zP","h":"change.txt","sec":"z commands","cat":"Edit","mo":null,"ch":null,"ctx":null},{"k":"zr","m":["n"],"d":"Open one more fold level everywhere ('foldlevel' + 1)","s":"builtin","t":"zr","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zs","m":["n"],"d":"Scroll horizontally so the cursor is at the left edge (nowrap only)","s":"builtin","t":"zs","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"zt","m":["n"],"d":"Scroll so the cursor line is at the top","s":"builtin","t":"zt","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"e":1},{"k":"zuw","m":["n"],"d":"Undo zw","s":"builtin","t":"zuw","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zug","m":["n"],"d":"Undo zg (remove the word from the spell file)","s":"builtin","t":"zug","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zuW","m":["n"],"d":"Undo zW","s":"builtin","t":"zuW","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zuG","m":["n"],"d":"Undo zG","s":"builtin","t":"zuG","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zv","m":["n"],"d":"Open just enough folds to show the cursor line","s":"builtin","t":"zv","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zw","m":["n"],"d":"Add the word to the spell file as wrong","s":"builtin","t":"zw","h":"spell.txt","sec":"z commands","cat":"Spell","mo":null,"ch":null,"ctx":null},{"k":"zx","m":["n"],"d":"Reset folds to 'foldlevel', then show the cursor line","s":"builtin","t":"zx","h":"fold.txt","sec":"z commands","cat":"Fold","mo":null,"ch":null,"ctx":null},{"k":"zy","m":["n"],"d":"Yank {motion} without trailing spaces (block mode)","s":"builtin","t":"zy","h":"change.txt","sec":"z commands","cat":"Edit","mo":null,"ch":null,"ctx":null},{"k":"zz","m":["n"],"d":"Scroll so the cursor line is centered","s":"builtin","t":"zz","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null,"n":"focusline.nvim: puts the line 30% from the top instead of the centre.","e":1,"ov":[{"m":"n","by":180}]},{"k":"z<Left>","m":["n"],"d":"same as \"zh\"","s":"builtin","t":"z<Left>","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"z<Right>","m":["n"],"d":"same as \"zl\"","s":"builtin","t":"z<Right>","h":"scroll.txt","sec":"z commands","cat":"Scroll & view","mo":null,"ch":null,"ctx":null},{"k":"v","m":["o"],"d":"Force the operator to work charwise (e.g. dvj)","s":"builtin","t":"o_v","h":"motion.txt","sec":"Operator-pending mode","cat":"Operator","mo":null,"ch":null,"ctx":null,"n":"Also toggles inclusive/exclusive for charwise motions: <kbd>dve<\/kbd> leaves the last char"},{"k":"V","m":["o"],"d":"Force the operator to work linewise (e.g. dVw)","s":"builtin","t":"o_V","h":"motion.txt","sec":"Operator-pending mode","cat":"Operator","mo":null,"ch":null,"ctx":null},{"k":"<C-V>","m":["o"],"d":"Force the operator to work blockwise","s":"builtin","t":"o_CTRL-V","h":"motion.txt","sec":"Operator-pending mode","cat":"Operator","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-N>","m":["x"],"d":"Stop Visual mode","s":"builtin","t":"v_CTRL-\\_CTRL-N","h":"intro.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-G>","m":["x"],"d":"Stop Visual mode (go to Normal)","s":"builtin","t":"v_CTRL-\\_CTRL-G","h":"intro.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-A>","m":["x"],"d":"Increment numbers in the selection by N","s":"builtin","t":"v_CTRL-A","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<C-C>","m":["x"],"d":"Stop Visual mode","s":"builtin","t":"v_CTRL-C","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-G>","m":["x"],"d":"Toggle between Visual and Select mode","s":"builtin","t":"v_CTRL-G","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<BS>","m":["x"],"d":"Select mode: delete the selection","s":"builtin","t":"v_<BS>","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<C-H>","m":["x"],"d":"Select mode: delete the selection","s":"builtin","t":"v_CTRL-H","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<C-O>","m":["x"],"d":"Select mode: switch to Visual mode for one command","s":"builtin","t":"v_CTRL-O","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-V>","m":["x"],"d":"Switch to blockwise Visual, or stop Visual mode","s":"builtin","t":"v_CTRL-V","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-X>","m":["x"],"d":"Decrement numbers in the selection by N","s":"builtin","t":"v_CTRL-X","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<Esc>","m":["x"],"d":"Stop Visual mode","s":"builtin","t":"v_<Esc>","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"<C-]>","m":["x"],"d":"Jump to the tag of the selected text","s":"builtin","t":"v_CTRL-]","h":"tagsrch.txt","sec":"Visual mode","cat":"Tags","mo":null,"ch":null,"ctx":null},{"k":"!{filter}","m":["x"],"d":"Filter the selected lines through an external command","s":"builtin","t":"v_!","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":":","m":["x"],"d":"Start a command line with the range '<,'> of the selection","s":"builtin","t":"v_:","h":"cmdline.txt","sec":"Visual mode","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<","m":["x"],"d":"Dedent the selected lines (N times)","s":"builtin","t":"v_<","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":"=","m":["x"],"d":"Re-indent the selected lines","s":"builtin","t":"v_=","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":">","m":["x"],"d":"Indent the selected lines (N times)","s":"builtin","t":"v_>","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":"A","m":["x"],"d":"Block mode: append the same text after the block on every line","s":"builtin","t":"v_b_A","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":1,"ctx":null,"e":1},{"k":"C","m":["x"],"d":"Change the selected lines (block: to end of each line)","s":"builtin","t":"v_C","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"ov":[{"m":"x","by":90}]},{"k":"D","m":["x"],"d":"Delete the selected lines (block: to end of each line)","s":"builtin","t":"v_D","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"ov":[{"m":"x","by":91}]},{"k":"I","m":["x"],"d":"Block mode: insert the same text before the block on every line","s":"builtin","t":"v_b_I","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":1,"ctx":null,"n":"Type the text, then <kbd>&lt;Esc&gt;<\/kbd>: it appears on every line of the block","e":1},{"k":"J","m":["x"],"d":"Join the selected lines","s":"builtin","t":"v_J","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"K","m":["x"],"d":"Look up the selected text with 'keywordprg'","s":"builtin","t":"v_K","h":"various.txt","sec":"Visual mode","cat":"Help","mo":null,"ch":null,"ctx":null},{"k":"O","m":["x"],"d":"Block mode: move to the other corner on the same line","s":"builtin","t":"v_O","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"P","m":["x"],"d":"Replace the selection with the register (registers unchanged)","s":"builtin","t":"v_P","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":null,"ctx":null,"e":1},{"k":"R","m":["x"],"d":"Change the selected lines","s":"builtin","t":"v_R","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"S","m":["x"],"d":"Change the selected lines","s":"builtin","t":"v_S","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"U","m":["x"],"d":"Uppercase the selection","s":"builtin","t":"v_U","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"V","m":["x"],"d":"Switch to linewise Visual, or stop Visual mode","s":"builtin","t":"v_V","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"X","m":["x"],"d":"Delete the selected lines","s":"builtin","t":"v_X","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"ov":[{"m":"x","by":96}]},{"k":"Y","m":["x"],"d":"Yank the selected lines","s":"builtin","t":"v_Y","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":null,"ctx":null},{"k":"a\"","m":["x"],"d":"Double-quoted string including the quotes","s":"builtin","t":"v_aquote","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quotes searched over 50 lines; does not include the trailing whitespace.","e":1},{"k":"a'","m":["x"],"d":"Single-quoted string including the quotes","s":"builtin","t":"v_a'","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quotes searched over 50 lines; does not include the trailing whitespace."},{"k":"a(","m":["x"],"d":"( ) block including the parentheses (same as ab)","s":"builtin","t":"v_a(","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one (within 50 lines).","e":1},{"k":"a)","m":["x"],"d":"( ) block including the parentheses (same as ab)","s":"builtin","t":"v_a)","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one (within 50 lines)."},{"k":"a<","m":["x"],"d":"< > block including the angle brackets","s":"builtin","t":"v_a<","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a>","m":["x"],"d":"< > block including the angle brackets","s":"builtin","t":"v_a>","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"aB","m":["x"],"d":"{ } block including the braces","s":"builtin","t":"v_aB","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Still Vim's built-in: mini.ai passes letters it doesn't define through.","e":1},{"k":"aW","m":["x"],"d":"A WORD, plus surrounding white space","s":"builtin","t":"v_aW","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"a[","m":["x"],"d":"[ ] block including the brackets","s":"builtin","t":"v_a[","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a]","m":["x"],"d":"[ ] block including the brackets","s":"builtin","t":"v_a]","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a`","m":["x"],"d":"Backtick string including the backticks","s":"builtin","t":"v_a`","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced backticks searched over 50 lines; does not include the trailing whitespace."},{"k":"ab","m":["x"],"d":"( ) block including the parentheses","s":"builtin","t":"v_ab","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai here: <code>b<\/code> matches any of <code>()<\/code>, <code>[]<\/code>, <code>{}<\/code>, and it works from outside the pair (cover-or-next search)."},{"k":"ap","m":["x"],"d":"A paragraph, plus the following blank lines","s":"builtin","t":"v_ap","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"e":1},{"k":"as","m":["x"],"d":"A sentence, plus white space","s":"builtin","t":"v_as","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"at","m":["x"],"d":"XML/HTML tag pair including the tags","s":"builtin","t":"v_at","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai's pattern-based tag textobject; same-name nested tags can mis-match.","e":1},{"k":"aw","m":["x"],"d":"A word, plus surrounding white space","s":"builtin","t":"v_aw","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"<kbd>daw<\/kbd> deletes the word and one space, so the sentence stays tidy","e":1},{"k":"a{","m":["x"],"d":"{ } block including the braces (same as aB)","s":"builtin","t":"v_a{","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"a}","m":["x"],"d":"{ } block including the braces (same as aB)","s":"builtin","t":"v_a}","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: also finds the next pair when the cursor isn't inside one."},{"k":"c","m":["x"],"d":"Change the selection (delete and start Insert)","s":"builtin","t":"v_c","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"Mapped to <code>\"dc<\/code> in this config (register <code>d<\/code>)","ov":[{"m":"x","by":136}]},{"k":"d","m":["x"],"d":"Delete the selection","s":"builtin","t":"v_d","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null,"n":"Mapped to <code>\"dd<\/code> in this config (register <code>d<\/code>)","ov":[{"m":"x","by":137}]},{"k":"g<C-A>","m":["x"],"d":"Increment numbers progressively (+N, +2N, … per line)","s":"builtin","t":"v_g_CTRL-A","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Select a column of 0s and press <kbd>g&lt;C-a&gt;<\/kbd> to number them 1, 2, 3…"},{"k":"g<C-X>","m":["x"],"d":"Decrement numbers progressively (-N, -2N, … per line)","s":"builtin","t":"v_g_CTRL-X","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gJ","m":["x"],"d":"Join the selected lines without spaces","s":"builtin","t":"v_gJ","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"gq","m":["x"],"d":"Format the selected lines","s":"builtin","t":"v_gq","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":1,"ctx":null},{"k":"gv","m":["x"],"d":"Swap the current and previous Visual areas","s":"builtin","t":"v_gv","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"i\"","m":["x"],"d":"Inside double quotes","s":"builtin","t":"v_iquote","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quote pairs, cover-or-next search over 50 lines.","e":1},{"k":"i'","m":["x"],"d":"Inside single quotes","s":"builtin","t":"v_i'","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced quote pairs, cover-or-next search over 50 lines.","e":1},{"k":"i(","m":["x"],"d":"Inside ( ) parentheses (same as ib)","s":"builtin","t":"v_i(","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i(<\/code> leaves out the whitespace just inside the brackets, <code>i)<\/code> includes it; searches forward if not inside a pair.","e":1},{"k":"i)","m":["x"],"d":"Inside ( ) parentheses (same as ib)","s":"builtin","t":"v_i)","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes the whitespace just inside the brackets (<code>i(<\/code> leaves it out); searches forward if not inside a pair."},{"k":"i<","m":["x"],"d":"Inside < > angle brackets","s":"builtin","t":"v_i<","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i&lt;<\/code> leaves out inner edge whitespace, <code>i&gt;<\/code> includes it."},{"k":"i>","m":["x"],"d":"Inside < > angle brackets","s":"builtin","t":"v_i>","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i&lt;<\/code> leaves it out)."},{"k":"iB","m":["x"],"d":"Inside { } braces","s":"builtin","t":"v_iB","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Still Vim's built-in: mini.ai passes letters it doesn't define through.","e":1},{"k":"iW","m":["x"],"d":"Inner WORD","s":"builtin","t":"v_iW","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"i[","m":["x"],"d":"Inside [ ] brackets","s":"builtin","t":"v_i[","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i[<\/code> leaves out inner edge whitespace, <code>i]<\/code> includes it.","e":1},{"k":"i]","m":["x"],"d":"Inside [ ] brackets","s":"builtin","t":"v_i]","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i[<\/code> leaves it out)."},{"k":"i`","m":["x"],"d":"Inside backticks","s":"builtin","t":"v_i`","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: balanced backtick pairs, cover-or-next search over 50 lines."},{"k":"ib","m":["x"],"d":"Inside ( ) parentheses","s":"builtin","t":"v_ib","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai here: <code>b<\/code> matches any of <code>()<\/code>, <code>[]<\/code>, <code>{}<\/code>, and it works from outside the pair (cover-or-next search)."},{"k":"ip","m":["x"],"d":"Inner paragraph","s":"builtin","t":"v_ip","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"e":1},{"k":"is","m":["x"],"d":"Inner sentence","s":"builtin","t":"v_is","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null},{"k":"it","m":["x"],"d":"Inside an XML/HTML tag pair","s":"builtin","t":"v_it","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai's pattern-based tag textobject; same-name nested tags can mis-match.","e":1},{"k":"iw","m":["x"],"d":"Inner word","s":"builtin","t":"v_iw","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Text objects work after an operator (<kbd>diw<\/kbd>, <kbd>ci\"<\/kbd>, <kbd>yap<\/kbd>) or in Visual mode; <kbd>i<\/kbd> = inner, <kbd>a<\/kbd> = around","e":1},{"k":"i{","m":["x"],"d":"Inside { } braces (same as iB)","s":"builtin","t":"v_i{","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: <code>i{<\/code> leaves out inner edge whitespace, <code>i}<\/code> includes it."},{"k":"i}","m":["x"],"d":"Inside { } braces (same as iB)","s":"builtin","t":"v_i}","h":"motion.txt","sec":"Visual mode","cat":"Text object","mo":null,"ch":null,"ctx":null,"n":"Handled by mini.ai: includes inner edge whitespace (<code>i{<\/code> leaves it out)."},{"k":"o","m":["x"],"d":"Move the cursor to the other end of the selection","s":"builtin","t":"v_o","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null,"e":1},{"k":"p","m":["x"],"d":"Replace the selection with the register (old text goes to the unnamed register)","s":"builtin","t":"v_p","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":null,"ctx":null,"n":"The replaced text goes to the unnamed register, so a second <kbd>p<\/kbd> pastes the old text; use <kbd>P<\/kbd> to keep pasting the same thing"},{"k":"r","m":["x"],"d":"Replace every selected character with {char}","s":"builtin","t":"v_r","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"s","m":["x"],"d":"Change the selection (same as c)","s":"builtin","t":"v_s","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Disabled: <code>s<\/code> is mini.surround's prefix in Visual mode too. Use <code>c<\/code>.","ov":[{"m":"x","by":175}]},{"k":"u","m":["x"],"d":"Lowercase the selection","s":"builtin","t":"v_u","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"v","m":["x"],"d":"Switch to charwise Visual, or stop Visual mode","s":"builtin","t":"v_v","h":"visual.txt","sec":"Visual mode","cat":"Visual","mo":null,"ch":null,"ctx":null},{"k":"x","m":["x"],"d":"Delete the selection (same as d)","s":"builtin","t":"v_x","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null,"n":"Mapped to <code>\"dx<\/code> in this config (register <code>d<\/code>)","ov":[{"m":"x","by":178}]},{"k":"y","m":["x"],"d":"Yank the selection","s":"builtin","t":"v_y","h":"change.txt","sec":"Visual mode","cat":"Operator","mo":null,"ch":null,"ctx":null},{"k":"~","m":["x"],"d":"Toggle case of the selection","s":"builtin","t":"v_~","h":"change.txt","sec":"Visual mode","cat":"Edit","mo":null,"ch":1,"ctx":null},{"k":"<C-A>","m":["c"],"d":"Insert all completion matches","s":"builtin","t":"c_CTRL-A","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-B>","m":["c"],"d":"Cursor to start of the command line","s":"builtin","t":"c_CTRL-B","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-C>","m":["c"],"d":"Abandon the command line","s":"builtin","t":"c_CTRL-C","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-D>","m":["c"],"d":"List completions matching the text before the cursor","s":"builtin","t":"c_CTRL-D","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-E>","m":["c"],"d":"Cursor to end of the command line","s":"builtin","t":"c_CTRL-E","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-F>","m":["c"],"d":"Open the command-line window to edit the command","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null,"n":"Edit the command with Normal-mode keys. In this config <kbd>&lt;CR&gt;<\/kbd> in Normal mode starts Leap, so press <kbd>i<\/kbd> then <kbd>&lt;CR&gt;<\/kbd> to run the line"},{"k":"<C-G>","m":["c"],"d":"While typing a search: go to the next match ('incsearch')","s":"builtin","t":"c_CTRL-G","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<BS>","m":["c"],"d":"delete the character in front of the cursor","s":"builtin","t":"c_<BS>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"{char1}<BS>{char2}","m":["c"],"d":"enter digraph when 'digraph' is on","s":"builtin","t":"c_digraph","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-H>","m":["c"],"d":"same as <BS>","s":"builtin","t":"c_CTRL-H","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Tab>","m":["c"],"d":"Complete the command or argument before the cursor","s":"builtin","t":"c_<Tab>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null,"n":"In this config blink.cmp handles command-line completion: <kbd>&lt;Tab&gt;<\/kbd> opens its menu and inserts the first match (accepts a lone match), then cycles; <kbd>&lt;C-n&gt;<\/kbd>/<kbd>&lt;C-p&gt;<\/kbd> move, <kbd>&lt;C-y&gt;<\/kbd> accepts","e":1},{"k":"<S-Tab>","m":["c"],"d":"Previous completion match","s":"builtin","t":"c_<S-Tab>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"'wildchar'","m":["c"],"d":"Complete before the cursor ('wildchar', <Tab>)","s":"builtin","t":"c_wildchar","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-I>","m":["c"],"d":"Complete before the cursor (same as <Tab>)","s":"builtin","t":"c_CTRL-I","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<NL>","m":["c"],"d":"same as <CR>","s":"builtin","t":"c_<NL>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-J>","m":["c"],"d":"same as <CR>","s":"builtin","t":"c_CTRL-J","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-K>{char1}{char2}","m":["c"],"d":"Insert a digraph","s":"builtin","t":"c_CTRL-K","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-L>","m":["c"],"d":"Insert the longest common part of the matches","s":"builtin","t":"c_CTRL-L","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<CR>","m":["c"],"d":"Execute the command","s":"builtin","t":"c_<CR>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-M>","m":["c"],"d":"same as <CR>","s":"builtin","t":"c_CTRL-M","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-N>","m":["c"],"d":"Next completion match, else next (newer) history entry","s":"builtin","t":"c_CTRL-N","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-P>","m":["c"],"d":"Previous completion match, else older history entry","s":"builtin","t":"c_CTRL-P","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-Q>","m":["c"],"d":"same as CTRL-V, unless it's used for terminal control flow","s":"builtin","t":"c_CTRL-Q","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-R>{regname}","m":["c"],"d":"Insert a register; <C-r><C-w> word, <C-r><C-a> WORD, <C-r><C-l> line","s":"builtin","t":"c_CTRL-R","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null,"n":"<kbd>:%s/&lt;C-r&gt;&lt;C-w&gt;/<\/kbd> pre-fills a substitute for the word under the cursor","e":1},{"k":"<C-R><C-O>{regname}","m":["c"],"d":"Insert a register or cursor object literally","s":"builtin","t":"c_CTRL-R_CTRL-O","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-T>","m":["c"],"d":"While typing a search: go to the previous match ('incsearch')","s":"builtin","t":"c_CTRL-T","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-U>","m":["c"],"d":"Delete everything before the cursor","s":"builtin","t":"c_CTRL-U","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<C-V>","m":["c"],"d":"Insert the next key literally (or a character code)","s":"builtin","t":"c_CTRL-V","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-W>","m":["c"],"d":"Delete the word before the cursor","s":"builtin","t":"c_CTRL-W","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-Y>","m":["c"],"d":"copy (yank) modeless selection","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Esc>","m":["c"],"d":"Abandon the command line","s":"builtin","t":"c_<Esc>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-[>","m":["c"],"d":"same as <Esc>","s":"builtin","t":"c_CTRL-[","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-N>","m":["c"],"d":"go to Normal mode, abandon command-line","s":"builtin","t":"c_CTRL-\\_CTRL-N","h":"intro.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-\\><C-G>","m":["c"],"d":"go to Normal mode, abandon command-line","s":"builtin","t":"c_CTRL-\\_CTRL-G","h":"intro.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-\\>a-d","m":["c"],"d":"reserved for extensions","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-\\>e{expr}","m":["c"],"d":"Replace the command line with the result of {expr}","s":"builtin","t":"c_CTRL-\\_e","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-\\>f-z","m":["c"],"d":"reserved for extensions","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-]>","m":["c"],"d":"Expand an abbreviation","s":"builtin","t":"c_CTRL-]","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-^>","m":["c"],"d":"toggle use of |:lmap| mappings","s":"builtin","t":"c_CTRL-^","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Del>","m":["c"],"d":"delete the character under the cursor","s":"builtin","t":"c_<Del>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Left>","m":["c"],"d":"cursor left","s":"builtin","t":"c_<Left>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<S-Left>","m":["c"],"d":"cursor one word left","s":"builtin","t":"c_<S-Left>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-Left>","m":["c"],"d":"cursor one word left","s":"builtin","t":"c_<C-Left>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Right>","m":["c"],"d":"cursor right","s":"builtin","t":"c_<Right>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<S-Right>","m":["c"],"d":"cursor one word right","s":"builtin","t":"c_<S-Right>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<C-Right>","m":["c"],"d":"cursor one word right","s":"builtin","t":"c_<C-Right>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Up>","m":["c"],"d":"Older history entry starting with the typed text","s":"builtin","t":"c_<Up>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null,"e":1},{"k":"<S-Up>","m":["c"],"d":"Older history entry","s":"builtin","t":"c_<S-Up>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Down>","m":["c"],"d":"Newer history entry starting with the typed text","s":"builtin","t":"c_<Down>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<S-Down>","m":["c"],"d":"Newer history entry","s":"builtin","t":"c_<S-Down>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Home>","m":["c"],"d":"cursor to start of command-line","s":"builtin","t":"c_<Home>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<End>","m":["c"],"d":"cursor to end of command-line","s":"builtin","t":"c_<End>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<PageDown>","m":["c"],"d":"same as <S-Down>","s":"builtin","t":"c_<PageDown>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<PageUp>","m":["c"],"d":"same as <S-Up>","s":"builtin","t":"c_<PageUp>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Insert>","m":["c"],"d":"toggle insert/overstrike mode","s":"builtin","t":"c_<Insert>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<LeftMouse>","m":["c"],"d":"cursor at mouse click","s":"builtin","t":"c_<LeftMouse>","h":"cmdline.txt","sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":null},{"k":"<Up>","m":["c"],"d":"move up to parent","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<Down>","m":["c"],"d":"move down to submenu","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<Left>","m":["c"],"d":"select the previous match","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<Right>","m":["c"],"d":"select the next match","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<CR>","m":["c"],"d":"move into submenu when doing menu completion","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<C-E>","m":["c"],"d":"stop completion and go back to original text","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<C-Y>","m":["c"],"d":"accept selected match and stop completion","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"other","m":["c"],"d":"stop completion and insert the typed character","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode (see 'wildmenu')"},{"k":"<PageUp>","m":["c"],"d":"select a match several entries back","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode with 'wildoptions' set to \"pum\""},{"k":"<PageDown>","m":["c"],"d":"select a match several entries forward","s":"builtin","t":null,"h":null,"sec":"Command-line editing","cat":"Command line","mo":null,"ch":null,"ctx":"Commands in wildmenu mode with 'wildoptions' set to \"pum\""},{"k":":","m":[":"],"d":"Start an Ex command (command-line mode)","s":"builtin","t":":","h":"cmdline.txt","sec":"Ex commands","cat":"Command line","ex":1},{"k":":{range}","m":[":"],"d":"go to last line in {range}","s":"builtin","t":":range","h":"cmdline.txt","sec":"Ex commands","cat":"Command line","ex":1},{"k":":!","m":[":"],"d":"Run a shell command; with a range, filter the lines through it","s":"builtin","t":":!","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1,"e":1},{"k":":!!","m":[":"],"d":"repeat last \":!\" command","s":"builtin","t":":!!","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":#","m":[":"],"d":"same as \":number\"","s":"builtin","t":":#","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":&","m":[":"],"d":"Repeat the last :substitute (:&& keeps the flags)","s":"builtin","t":":&","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":*","m":[":"],"d":"use the last Visual area, like \":'<,'>\"","s":"builtin","t":":star","h":"cmdline.txt","sec":"Ex commands","cat":"Command line","ex":1},{"k":":<","m":[":"],"d":"shift lines one 'shiftwidth' left","s":"builtin","t":":<","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":=","m":[":"],"d":"Print the last line number; := {expr} evaluates Lua (like :lua =)","s":"builtin","t":":=","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":>","m":[":"],"d":"shift lines one 'shiftwidth' right","s":"builtin","t":":>","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":@","m":[":"],"d":"execute contents of a register","s":"builtin","t":":@","h":"repeat.txt","sec":"Ex commands","cat":"Register & macro","ex":1},{"k":":@@","m":[":"],"d":"repeat the previous \":@\"","s":"builtin","t":":@@","h":"repeat.txt","sec":"Ex commands","cat":"Register & macro","ex":1},{"k":":2mat[ch]","m":[":"],"d":"define a second match to highlight","s":"builtin","t":":2match","h":"pattern.txt","sec":"Ex commands","cat":"Search","ex":1},{"k":":3mat[ch]","m":[":"],"d":"define a third match to highlight","s":"builtin","t":":3match","h":"pattern.txt","sec":"Ex commands","cat":"Search","ex":1},{"k":":N[ext]","m":[":"],"d":"go to previous file in the argument list","s":"builtin","t":":Next","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":a[ppend]","m":[":"],"d":"append text","s":"builtin","t":":append","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":ab[breviate]","m":[":"],"d":"enter abbreviation","s":"builtin","t":":abbreviate","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":abc[lear]","m":[":"],"d":"remove all abbreviations","s":"builtin","t":":abclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":abo[veleft]","m":[":"],"d":"make split window appear left or above","s":"builtin","t":":aboveleft","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":al[l]","m":[":"],"d":"open a window for each file in the argument list","s":"builtin","t":":all","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":am[enu]","m":[":"],"d":"enter new menu item for all modes","s":"builtin","t":":amenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":an[oremenu]","m":[":"],"d":"enter a new menu for all modes that will not be remapped","s":"builtin","t":":anoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ar[gs]","m":[":"],"d":"print the argument list","s":"builtin","t":":args","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":arga[dd]","m":[":"],"d":"add items to the argument list","s":"builtin","t":":argadd","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argded[upe]","m":[":"],"d":"remove duplicates from the argument list","s":"builtin","t":":argdedupe","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argd[elete]","m":[":"],"d":"delete items from the argument list","s":"builtin","t":":argdelete","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":arge[dit]","m":[":"],"d":"add item to the argument list and edit it","s":"builtin","t":":argedit","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argdo","m":[":"],"d":"Run a command on every file in the argument list","s":"builtin","t":":argdo","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argg[lobal]","m":[":"],"d":"define the global argument list","s":"builtin","t":":argglobal","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argl[ocal]","m":[":"],"d":"define a local argument list","s":"builtin","t":":arglocal","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":argu[ment]","m":[":"],"d":"go to specific file in the argument list","s":"builtin","t":":argument","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":as[cii]","m":[":"],"d":"print ascii value of character under the cursor","s":"builtin","t":":ascii","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":au[tocmd]","m":[":"],"d":"enter or show autocommands","s":"builtin","t":":autocmd","h":"autocmd.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":aug[roup]","m":[":"],"d":"select the autocommand group to use","s":"builtin","t":":augroup","h":"autocmd.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":aun[menu]","m":[":"],"d":"remove menu for all modes","s":"builtin","t":":aunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":b[uffer]","m":[":"],"d":"Go to buffer N, or by (partial) name with Tab completion","s":"builtin","t":":buffer","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1,"e":1},{"k":":bN[ext]","m":[":"],"d":"go to previous buffer in the buffer list","s":"builtin","t":":bNext","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":ba[ll]","m":[":"],"d":"open a window for each buffer in the buffer list","s":"builtin","t":":ball","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bad[d]","m":[":"],"d":"add buffer to the buffer list","s":"builtin","t":":badd","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":balt","m":[":"],"d":"like \":badd\" but also set the alternate file","s":"builtin","t":":balt","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bd[elete]","m":[":"],"d":"Unload a buffer and remove it from the list (closes its windows)","s":"builtin","t":":bdelete","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1,"n":"This config's <kbd>&lt;leader&gt;bd<\/kbd> uses Snacks.bufdelete, which keeps the window layout"},{"k":":bel[owright]","m":[":"],"d":"make split window appear right or below","s":"builtin","t":":belowright","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":bf[irst]","m":[":"],"d":"Go to the first buffer","s":"builtin","t":":bfirst","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bl[ast]","m":[":"],"d":"Go to the last buffer","s":"builtin","t":":blast","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bm[odified]","m":[":"],"d":"go to next buffer in the buffer list that has been modified","s":"builtin","t":":bmodified","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bn[ext]","m":[":"],"d":"Go to the next buffer","s":"builtin","t":":bnext","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bo[tright]","m":[":"],"d":"make split window appear at bottom or far right","s":"builtin","t":":botright","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":bp[revious]","m":[":"],"d":"Go to the previous buffer","s":"builtin","t":":bprevious","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":br[ewind]","m":[":"],"d":"go to first buffer in the buffer list","s":"builtin","t":":brewind","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":brea[k]","m":[":"],"d":"break out of while loop","s":"builtin","t":":break","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":breaka[dd]","m":[":"],"d":"add a debugger breakpoint","s":"builtin","t":":breakadd","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":breakd[el]","m":[":"],"d":"delete a debugger breakpoint","s":"builtin","t":":breakdel","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":breakl[ist]","m":[":"],"d":"list debugger breakpoints","s":"builtin","t":":breaklist","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":bro[wse]","m":[":"],"d":"use file selection dialog","s":"builtin","t":":browse","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":bufd[o]","m":[":"],"d":"Run a command in every listed buffer","s":"builtin","t":":bufdo","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":buffers","m":[":"],"d":"List buffers (same as :ls)","s":"builtin","t":":buffers","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bun[load]","m":[":"],"d":"unload a specific buffer","s":"builtin","t":":bunload","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":bw[ipeout]","m":[":"],"d":"Wipe a buffer completely (marks, options, everything)","s":"builtin","t":":bwipeout","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":c[hange]","m":[":"],"d":"replace a line or series of lines","s":"builtin","t":":change","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":cN[ext]","m":[":"],"d":"go to previous error","s":"builtin","t":":cNext","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cNf[ile]","m":[":"],"d":"go to last error in previous file","s":"builtin","t":":cNfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ca[bbrev]","m":[":"],"d":"like \":abbreviate\" but for Command-line mode","s":"builtin","t":":cabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cabc[lear]","m":[":"],"d":"clear all abbreviations for Command-line mode","s":"builtin","t":":cabclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cabo[ve]","m":[":"],"d":"go to error above current line","s":"builtin","t":":cabove","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cad[dbuffer]","m":[":"],"d":"add errors from buffer","s":"builtin","t":":caddbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cadde[xpr]","m":[":"],"d":"add errors from expr","s":"builtin","t":":caddexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":caddf[ile]","m":[":"],"d":"add error message to current quickfix list","s":"builtin","t":":caddfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":caf[ter]","m":[":"],"d":"go to error after current cursor","s":"builtin","t":":cafter","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cal[l]","m":[":"],"d":"call a function","s":"builtin","t":":call","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cat[ch]","m":[":"],"d":"part of a :try command","s":"builtin","t":":catch","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cbe[fore]","m":[":"],"d":"go to error before current cursor","s":"builtin","t":":cbefore","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cbel[ow]","m":[":"],"d":"go to error below current line","s":"builtin","t":":cbelow","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cbo[ttom]","m":[":"],"d":"scroll to the bottom of the quickfix window","s":"builtin","t":":cbottom","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cb[uffer]","m":[":"],"d":"parse error messages and jump to first error","s":"builtin","t":":cbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cc","m":[":"],"d":"go to specific error","s":"builtin","t":":cc","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ccl[ose]","m":[":"],"d":"Close the quickfix window","s":"builtin","t":":cclose","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cd","m":[":"],"d":"Change the global working directory","s":"builtin","t":":cd","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":cdo","m":[":"],"d":"Run a command on each quickfix entry: :cdo s/a/b/ | update","s":"builtin","t":":cdo","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1,"e":1},{"k":":cfd[o]","m":[":"],"d":"Run a command once per file in the quickfix list","s":"builtin","t":":cfdo","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ce[nter]","m":[":"],"d":"Center lines in [range]","s":"builtin","t":":center","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":cex[pr]","m":[":"],"d":"read errors from expr and jump to first","s":"builtin","t":":cexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cf[ile]","m":[":"],"d":"read file with error messages and jump to first","s":"builtin","t":":cfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cfir[st]","m":[":"],"d":"go to the specified error, default first one","s":"builtin","t":":cfirst","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cgetb[uffer]","m":[":"],"d":"get errors from buffer","s":"builtin","t":":cgetbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cgete[xpr]","m":[":"],"d":"get errors from expr","s":"builtin","t":":cgetexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cg[etfile]","m":[":"],"d":"read file with error messages","s":"builtin","t":":cgetfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":changes","m":[":"],"d":"Show the change list","s":"builtin","t":":changes","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":chd[ir]","m":[":"],"d":"change directory","s":"builtin","t":":chdir","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":che[ckhealth]","m":[":"],"d":"Run health checks (:checkhealth vim.lsp)","s":"builtin","t":":checkhealth","h":"health.txt","sec":"Ex commands","cat":"Misc","ex":1,"e":1},{"k":":checkp[ath]","m":[":"],"d":"list included files","s":"builtin","t":":checkpath","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":checkt[ime]","m":[":"],"d":"check timestamp of loaded buffers","s":"builtin","t":":checktime","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":chi[story]","m":[":"],"d":"list the error lists","s":"builtin","t":":chistory","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cla[st]","m":[":"],"d":"go to the specified error, default last one","s":"builtin","t":":clast","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cle[arjumps]","m":[":"],"d":"Clear the jump list","s":"builtin","t":":clearjumps","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":cl[ist]","m":[":"],"d":"list all errors","s":"builtin","t":":clist","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":clo[se]","m":[":"],"d":"Close the current window","s":"builtin","t":":close","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":cm[ap]","m":[":"],"d":"like \":map\" but for Command-line mode","s":"builtin","t":":cmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cmapc[lear]","m":[":"],"d":"clear all mappings for Command-line mode","s":"builtin","t":":cmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cme[nu]","m":[":"],"d":"add menu for Command-line mode","s":"builtin","t":":cmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cn[ext]","m":[":"],"d":"Go to the next quickfix entry","s":"builtin","t":":cnext","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cnew[er]","m":[":"],"d":"Go to the newer quickfix list","s":"builtin","t":":cnewer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cnf[ile]","m":[":"],"d":"go to first error in next file","s":"builtin","t":":cnfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cno[remap]","m":[":"],"d":"like \":noremap\" but for Command-line mode","s":"builtin","t":":cnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cnorea[bbrev]","m":[":"],"d":"like \":noreabbrev\" but for Command-line mode","s":"builtin","t":":cnoreabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cnoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Command-line mode","s":"builtin","t":":cnoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":co[py]","m":[":"],"d":"Copy [range] lines below line {address}","s":"builtin","t":":copy","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1,"e":1},{"k":":col[der]","m":[":"],"d":"Go to the older quickfix list","s":"builtin","t":":colder","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":colo[rscheme]","m":[":"],"d":"load a specific color scheme","s":"builtin","t":":colorscheme","h":"syntax.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":com[mand]","m":[":"],"d":"create user-defined command","s":"builtin","t":":command","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":comc[lear]","m":[":"],"d":"clear all user-defined commands","s":"builtin","t":":comclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":comp[iler]","m":[":"],"d":"do settings for a specific compiler","s":"builtin","t":":compiler","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":con[tinue]","m":[":"],"d":"go back to :while","s":"builtin","t":":continue","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":conf[irm]","m":[":"],"d":"prompt user when confirmation required","s":"builtin","t":":confirm","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":cons[t]","m":[":"],"d":"create a variable as a constant","s":"builtin","t":":const","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cope[n]","m":[":"],"d":"Open the quickfix window","s":"builtin","t":":copen","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1,"e":1},{"k":":cp[revious]","m":[":"],"d":"Go to the previous quickfix entry","s":"builtin","t":":cprevious","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cpf[ile]","m":[":"],"d":"go to last error in previous file","s":"builtin","t":":cpfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cq[uit]","m":[":"],"d":"quit Vim with an error code","s":"builtin","t":":cquit","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cr[ewind]","m":[":"],"d":"go to the specified error, default first one","s":"builtin","t":":crewind","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":cu[nmap]","m":[":"],"d":"like \":unmap\" but for Command-line mode","s":"builtin","t":":cunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cuna[bbrev]","m":[":"],"d":"like \":unabbrev\" but for Command-line mode","s":"builtin","t":":cunabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cunme[nu]","m":[":"],"d":"remove menu for Command-line mode","s":"builtin","t":":cunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":cw[indow]","m":[":"],"d":"Open the quickfix window only if there are entries","s":"builtin","t":":cwindow","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":d[elete]","m":[":"],"d":"Delete [range] lines [into register]","s":"builtin","t":":delete","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":deb[ug]","m":[":"],"d":"run a command in debugging mode","s":"builtin","t":":debug","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":debugg[reedy]","m":[":"],"d":"read debug mode commands from normal input","s":"builtin","t":":debuggreedy","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":defe[r]","m":[":"],"d":"call function when current function is done","s":"builtin","t":":defer","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":delc[ommand]","m":[":"],"d":"delete user-defined command","s":"builtin","t":":delcommand","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":delf[unction]","m":[":"],"d":"delete a user function","s":"builtin","t":":delfunction","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":delm[arks]","m":[":"],"d":"Delete marks (:delm a b, :delm! for all lowercase)","s":"builtin","t":":delmarks","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":detach","m":[":"],"d":"detach the current UI","s":"builtin","t":":detach","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":dif[fupdate]","m":[":"],"d":"Recompute the diff","s":"builtin","t":":diffupdate","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":diffg[et]","m":[":"],"d":"Get the change from the other diff buffer","s":"builtin","t":":diffget","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":diffo[ff]","m":[":"],"d":"Leave diff mode","s":"builtin","t":":diffoff","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":diffp[atch]","m":[":"],"d":"apply a patch and show differences","s":"builtin","t":":diffpatch","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":diffpu[t]","m":[":"],"d":"Put the change into the other diff buffer","s":"builtin","t":":diffput","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":diffs[plit]","m":[":"],"d":"show differences with another file","s":"builtin","t":":diffsplit","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":difft[his]","m":[":"],"d":"Add this window to the diff","s":"builtin","t":":diffthis","h":"diff.txt","sec":"Ex commands","cat":"Diff","ex":1},{"k":":dig[raphs]","m":[":"],"d":"show or enter digraphs","s":"builtin","t":":digraphs","h":"digraph.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":di[splay]","m":[":"],"d":"Show register contents (same as :registers)","s":"builtin","t":":display","h":"change.txt","sec":"Ex commands","cat":"Register & macro","ex":1},{"k":":dj[ump]","m":[":"],"d":"jump to #define","s":"builtin","t":":djump","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":dl","m":[":"],"d":"short for |:delete| with the 'l' flag","s":"builtin","t":":dl","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":dli[st]","m":[":"],"d":"list #defines","s":"builtin","t":":dlist","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":do[autocmd]","m":[":"],"d":"apply autocommands to current buffer","s":"builtin","t":":doautocmd","h":"autocmd.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":doautoa[ll]","m":[":"],"d":"apply autocommands for all loaded buffers","s":"builtin","t":":doautoall","h":"autocmd.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":d[elete]p","m":[":"],"d":"short for |:delete| with the 'p' flag","s":"builtin","t":":dp","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":dr[op]","m":[":"],"d":"jump to window editing file or edit file in current window","s":"builtin","t":":drop","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":ds[earch]","m":[":"],"d":"list one #define","s":"builtin","t":":dsearch","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":dsp[lit]","m":[":"],"d":"split window and jump to #define","s":"builtin","t":":dsplit","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":e[dit]","m":[":"],"d":"Edit {file}; with no argument, reload the current file","s":"builtin","t":":edit","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":ea[rlier]","m":[":"],"d":"Go back in undo time: :earlier 10m, :earlier 3f (file writes)","s":"builtin","t":":earlier","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1,"n":"'undofile' is on in this config, so this reaches back across sessions","e":1},{"k":":ec[ho]","m":[":"],"d":"echoes the result of expressions","s":"builtin","t":":echo","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":echoe[rr]","m":[":"],"d":"like :echo, show like an error and use history","s":"builtin","t":":echoerr","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":echoh[l]","m":[":"],"d":"set highlighting for echo commands","s":"builtin","t":":echohl","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":echom[sg]","m":[":"],"d":"same as :echo, put message in history","s":"builtin","t":":echomsg","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":echon","m":[":"],"d":"same as :echo, but without <EOL>","s":"builtin","t":":echon","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":el[se]","m":[":"],"d":"part of an :if command","s":"builtin","t":":else","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":elsei[f]","m":[":"],"d":"part of an :if command","s":"builtin","t":":elseif","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":em[enu]","m":[":"],"d":"execute a menu by name","s":"builtin","t":":emenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":en[dif]","m":[":"],"d":"end previous :if","s":"builtin","t":":endif","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":endfo[r]","m":[":"],"d":"end previous :for","s":"builtin","t":":endfor","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":endf[unction]","m":[":"],"d":"end of a user function started with :function","s":"builtin","t":":endfunction","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":endt[ry]","m":[":"],"d":"end previous :try","s":"builtin","t":":endtry","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":endw[hile]","m":[":"],"d":"end previous :while","s":"builtin","t":":endwhile","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ene[w]","m":[":"],"d":"Edit a new unnamed buffer","s":"builtin","t":":enew","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":ev[al]","m":[":"],"d":"evaluate an expression and discard the result","s":"builtin","t":":eval","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ex","m":[":"],"d":"same as \":edit\"","s":"builtin","t":":ex","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":exe[cute]","m":[":"],"d":"execute result of expressions","s":"builtin","t":":execute","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":exi[t]","m":[":"],"d":"same as \":xit\"","s":"builtin","t":":exit","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":exu[sage]","m":[":"],"d":"overview of Ex commands","s":"builtin","t":":exusage","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":fc[lose]","m":[":"],"d":"close floating window","s":"builtin","t":":fclose","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":f[ile]","m":[":"],"d":"show or set the current file name","s":"builtin","t":":file","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":files","m":[":"],"d":"List buffers (same as :ls)","s":"builtin","t":":files","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":filet[ype]","m":[":"],"d":"switch file type detection on/off","s":"builtin","t":":filetype","h":"filetype.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":filt[er]","m":[":"],"d":"Filter the output of a listing command: :filter /pat/ ls","s":"builtin","t":":filter","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":fin[d]","m":[":"],"d":"find file in 'path' and edit it","s":"builtin","t":":find","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":fina[lly]","m":[":"],"d":"part of a :try command","s":"builtin","t":":finally","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":fini[sh]","m":[":"],"d":"quit sourcing a Vim script","s":"builtin","t":":finish","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":fir[st]","m":[":"],"d":"go to the first file in the argument list","s":"builtin","t":":first","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":fo[ld]","m":[":"],"d":"create a fold","s":"builtin","t":":fold","h":"fold.txt","sec":"Ex commands","cat":"Fold","ex":1},{"k":":foldc[lose]","m":[":"],"d":"close folds","s":"builtin","t":":foldclose","h":"fold.txt","sec":"Ex commands","cat":"Fold","ex":1},{"k":":foldd[oopen]","m":[":"],"d":"execute command on lines not in a closed fold","s":"builtin","t":":folddoopen","h":"fold.txt","sec":"Ex commands","cat":"Fold","ex":1},{"k":":folddoc[losed]","m":[":"],"d":"execute command on lines in a closed fold","s":"builtin","t":":folddoclosed","h":"fold.txt","sec":"Ex commands","cat":"Fold","ex":1},{"k":":foldo[pen]","m":[":"],"d":"open folds","s":"builtin","t":":foldopen","h":"fold.txt","sec":"Ex commands","cat":"Fold","ex":1},{"k":":for","m":[":"],"d":"for loop","s":"builtin","t":":for","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":fu[nction]","m":[":"],"d":"define a user function","s":"builtin","t":":function","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":g[lobal]","m":[":"],"d":"Run an Ex command on every line matching {pattern}: :g/pat/cmd","s":"builtin","t":":global","h":"repeat.txt","sec":"Ex commands","cat":"Edit","ex":1,"n":"<code>:g/TODO/d<\/code> deletes matching lines; <code>:g/^/m0<\/code> reverses the file","e":1},{"k":":go[to]","m":[":"],"d":"go to byte in the buffer","s":"builtin","t":":goto","h":"motion.txt","sec":"Ex commands","cat":"Motion","ex":1},{"k":":gr[ep]","m":[":"],"d":"Run 'grepprg' and load matches into the quickfix list","s":"builtin","t":":grep","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":grepa[dd]","m":[":"],"d":"like :grep, but append to current list","s":"builtin","t":":grepadd","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":gu[i]","m":[":"],"d":"start the GUI","s":"builtin","t":":gui","h":"vim_diff.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":gv[im]","m":[":"],"d":"start the GUI","s":"builtin","t":":gvim","h":"vim_diff.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":h[elp]","m":[":"],"d":"Open help for {subject} (:h i_CTRL-R, :h :s, :h 'wrap')","s":"builtin","t":":help","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1,"e":1},{"k":":helpc[lose]","m":[":"],"d":"close one help window","s":"builtin","t":":helpclose","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":helpg[rep]","m":[":"],"d":"like \":grep\" but searches help files","s":"builtin","t":":helpgrep","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":helpt[ags]","m":[":"],"d":"generate help tags for a directory","s":"builtin","t":":helptags","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":hi[ghlight]","m":[":"],"d":"specify highlighting methods","s":"builtin","t":":highlight","h":"syntax.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":hid[e]","m":[":"],"d":"hide current buffer for a command","s":"builtin","t":":hide","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":his[tory]","m":[":"],"d":"print a history list","s":"builtin","t":":history","h":"cmdline.txt","sec":"Ex commands","cat":"Command line","ex":1},{"k":":hor[izontal]","m":[":"],"d":"following window command work horizontally","s":"builtin","t":":horizontal","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":i[nsert]","m":[":"],"d":"insert text","s":"builtin","t":":insert","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":ia[bbrev]","m":[":"],"d":"like \":abbrev\" but for Insert mode","s":"builtin","t":":iabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":iabc[lear]","m":[":"],"d":"like \":abclear\" but for Insert mode","s":"builtin","t":":iabclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":if","m":[":"],"d":"execute commands when condition met","s":"builtin","t":":if","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ij[ump]","m":[":"],"d":"jump to definition of identifier","s":"builtin","t":":ijump","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":il[ist]","m":[":"],"d":"list lines where identifier matches","s":"builtin","t":":ilist","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":im[ap]","m":[":"],"d":"like \":map\" but for Insert mode","s":"builtin","t":":imap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":imapc[lear]","m":[":"],"d":"like \":mapclear\" but for Insert mode","s":"builtin","t":":imapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ime[nu]","m":[":"],"d":"add menu for Insert mode","s":"builtin","t":":imenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ino[remap]","m":[":"],"d":"like \":noremap\" but for Insert mode","s":"builtin","t":":inoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":inorea[bbrev]","m":[":"],"d":"like \":noreabbrev\" but for Insert mode","s":"builtin","t":":inoreabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":inoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Insert mode","s":"builtin","t":":inoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":int[ro]","m":[":"],"d":"print the introductory message","s":"builtin","t":":intro","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":ip[ut]","m":[":"],"d":"like |:put|, but adjust the indent to the current line","s":"builtin","t":":iput","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":is[earch]","m":[":"],"d":"list one line where identifier matches","s":"builtin","t":":isearch","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":isp[lit]","m":[":"],"d":"split window and jump to definition of identifier","s":"builtin","t":":isplit","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":iu[nmap]","m":[":"],"d":"like \":unmap\" but for Insert mode","s":"builtin","t":":iunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":iuna[bbrev]","m":[":"],"d":"like \":unabbrev\" but for Insert mode","s":"builtin","t":":iunabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":iunme[nu]","m":[":"],"d":"remove menu for Insert mode","s":"builtin","t":":iunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":j[oin]","m":[":"],"d":"Join [range] lines","s":"builtin","t":":join","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":ju[mps]","m":[":"],"d":"Show the jump list","s":"builtin","t":":jumps","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":k","m":[":"],"d":"set a mark","s":"builtin","t":":k","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":keepa[lt]","m":[":"],"d":"following command keeps the alternate file","s":"builtin","t":":keepalt","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":kee[pmarks]","m":[":"],"d":"following command keeps marks where they are","s":"builtin","t":":keepmarks","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":keepj[umps]","m":[":"],"d":"Run a command without changing the jump list","s":"builtin","t":":keepjumps","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":keepp[atterns]","m":[":"],"d":"following command keeps search pattern history","s":"builtin","t":":keeppatterns","h":"cmdline.txt","sec":"Ex commands","cat":"Command line","ex":1},{"k":":lN[ext]","m":[":"],"d":"go to previous entry in location list","s":"builtin","t":":lNext","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lNf[ile]","m":[":"],"d":"go to last entry in previous file","s":"builtin","t":":lNfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":l[ist]","m":[":"],"d":"print lines","s":"builtin","t":":list","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lab[ove]","m":[":"],"d":"go to location above current line","s":"builtin","t":":labove","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lad[dexpr]","m":[":"],"d":"add locations from expr","s":"builtin","t":":laddexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":laddb[uffer]","m":[":"],"d":"add locations from buffer","s":"builtin","t":":laddbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":laddf[ile]","m":[":"],"d":"add locations to current location list","s":"builtin","t":":laddfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":laf[ter]","m":[":"],"d":"go to location after current cursor","s":"builtin","t":":lafter","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":la[st]","m":[":"],"d":"go to the last file in the argument list","s":"builtin","t":":last","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":lan[guage]","m":[":"],"d":"set the language (locale)","s":"builtin","t":":language","h":"mlang.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lat[er]","m":[":"],"d":"Go forward in undo time (counterpart of :earlier)","s":"builtin","t":":later","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":lbe[fore]","m":[":"],"d":"go to location before current cursor","s":"builtin","t":":lbefore","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lbel[ow]","m":[":"],"d":"go to location below current line","s":"builtin","t":":lbelow","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lbo[ttom]","m":[":"],"d":"scroll to the bottom of the location window","s":"builtin","t":":lbottom","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lb[uffer]","m":[":"],"d":"parse locations and jump to first location","s":"builtin","t":":lbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lc[d]","m":[":"],"d":"Change the working directory for this window","s":"builtin","t":":lcd","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":lch[dir]","m":[":"],"d":"change directory locally","s":"builtin","t":":lchdir","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":lcl[ose]","m":[":"],"d":"close location window","s":"builtin","t":":lclose","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ld[o]","m":[":"],"d":"Run a command on each location-list entry","s":"builtin","t":":ldo","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lfd[o]","m":[":"],"d":"Run a command once per file in the location list","s":"builtin","t":":lfdo","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":le[ft]","m":[":"],"d":"Left-align lines","s":"builtin","t":":left","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":lefta[bove]","m":[":"],"d":"make split window appear left or above","s":"builtin","t":":leftabove","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":let","m":[":"],"d":"assign a value to a variable or option","s":"builtin","t":":let","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lex[pr]","m":[":"],"d":"read locations from expr and jump to first","s":"builtin","t":":lexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lf[ile]","m":[":"],"d":"read file with locations and jump to first","s":"builtin","t":":lfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lfir[st]","m":[":"],"d":"go to the specified location, default first one","s":"builtin","t":":lfirst","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lgetb[uffer]","m":[":"],"d":"get locations from buffer","s":"builtin","t":":lgetbuffer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lgete[xpr]","m":[":"],"d":"get locations from expr","s":"builtin","t":":lgetexpr","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lg[etfile]","m":[":"],"d":"read file with locations","s":"builtin","t":":lgetfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lgr[ep]","m":[":"],"d":"run 'grepprg' and jump to first match","s":"builtin","t":":lgrep","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lgrepa[dd]","m":[":"],"d":"like :grep, but append to current list","s":"builtin","t":":lgrepadd","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lh[elpgrep]","m":[":"],"d":"like \":helpgrep\" but uses location list","s":"builtin","t":":lhelpgrep","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":lhi[story]","m":[":"],"d":"list the location lists","s":"builtin","t":":lhistory","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ll","m":[":"],"d":"go to specific location","s":"builtin","t":":ll","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lla[st]","m":[":"],"d":"go to the specified location, default last one","s":"builtin","t":":llast","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lli[st]","m":[":"],"d":"list all locations","s":"builtin","t":":llist","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lmak[e]","m":[":"],"d":"execute external command 'makeprg' and parse error messages","s":"builtin","t":":lmake","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lm[ap]","m":[":"],"d":"like \":map!\" but includes Lang-Arg mode","s":"builtin","t":":lmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lmapc[lear]","m":[":"],"d":"like \":mapclear!\" but includes Lang-Arg mode","s":"builtin","t":":lmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lne[xt]","m":[":"],"d":"go to next location","s":"builtin","t":":lnext","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lnew[er]","m":[":"],"d":"go to newer location list","s":"builtin","t":":lnewer","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lnf[ile]","m":[":"],"d":"go to first location in next file","s":"builtin","t":":lnfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ln[oremap]","m":[":"],"d":"like \":noremap!\" but includes Lang-Arg mode","s":"builtin","t":":lnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":loadk[eymap]","m":[":"],"d":"load the following keymaps until EOF","s":"builtin","t":":loadkeymap","h":"mbyte.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lo[adview]","m":[":"],"d":"load view for current window from a file","s":"builtin","t":":loadview","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":loc[kmarks]","m":[":"],"d":"following command keeps marks where they are","s":"builtin","t":":lockmarks","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":lockv[ar]","m":[":"],"d":"lock variables","s":"builtin","t":":lockvar","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lol[der]","m":[":"],"d":"go to older location list","s":"builtin","t":":lolder","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lop[en]","m":[":"],"d":"open location window","s":"builtin","t":":lopen","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lp[revious]","m":[":"],"d":"go to previous location","s":"builtin","t":":lprevious","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lpf[ile]","m":[":"],"d":"go to last location in previous file","s":"builtin","t":":lpfile","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lr[ewind]","m":[":"],"d":"go to the specified location, default first one","s":"builtin","t":":lrewind","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":ls","m":[":"],"d":"List buffers (% current, # alternate, + modified)","s":"builtin","t":":ls","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1,"e":1},{"k":":lsp","m":[":"],"d":"Manage LSP: :lsp enable/disable/restart/stop [name]","s":"builtin","t":":lsp","h":"lsp.txt","sec":"Ex commands","cat":"LSP & diagnostics","ex":1},{"k":":lt[ag]","m":[":"],"d":"jump to tag and add matching tags to the location list","s":"builtin","t":":ltag","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":lu[nmap]","m":[":"],"d":"like \":unmap!\" but includes Lang-Arg mode","s":"builtin","t":":lunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lua","m":[":"],"d":"Run Lua code: :lua print(vim.bo.filetype)","s":"builtin","t":":lua","h":"lua.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":luad[o]","m":[":"],"d":"execute Lua command for each line","s":"builtin","t":":luado","h":"lua.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":luaf[ile]","m":[":"],"d":"execute |Lua| script file","s":"builtin","t":":luafile","h":"lua.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":lv[imgrep]","m":[":"],"d":"search for pattern in files","s":"builtin","t":":lvimgrep","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lvimgrepa[dd]","m":[":"],"d":"like :vimgrep, but append to current list","s":"builtin","t":":lvimgrepadd","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":lw[indow]","m":[":"],"d":"open or close location window","s":"builtin","t":":lwindow","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":m[ove]","m":[":"],"d":"Move [range] lines below line {address}: :m+1, :m0","s":"builtin","t":":move","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1,"e":1},{"k":":ma[rk]","m":[":"],"d":"set a mark","s":"builtin","t":":mark","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1},{"k":":mak[e]","m":[":"],"d":"Run 'makeprg' and load errors into the quickfix list","s":"builtin","t":":make","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":map","m":[":"],"d":"Show or create mappings (:map with no args lists them)","s":"builtin","t":":map","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":mapc[lear]","m":[":"],"d":"clear all mappings for Normal and Visual mode","s":"builtin","t":":mapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":marks","m":[":"],"d":"List marks","s":"builtin","t":":marks","h":"motion.txt","sec":"Ex commands","cat":"Mark & jump","ex":1,"e":1},{"k":":mat[ch]","m":[":"],"d":"define a match to highlight","s":"builtin","t":":match","h":"pattern.txt","sec":"Ex commands","cat":"Search","ex":1},{"k":":me[nu]","m":[":"],"d":"enter a new menu item","s":"builtin","t":":menu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":menut[ranslate]","m":[":"],"d":"add a menu translation item","s":"builtin","t":":menutranslate","h":"mlang.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":mes[sages]","m":[":"],"d":"Show the message history","s":"builtin","t":":messages","h":"message.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":mk[exrc]","m":[":"],"d":"write current mappings and settings to a file","s":"builtin","t":":mkexrc","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":mks[ession]","m":[":"],"d":"Save the session (windows, buffers) to a file","s":"builtin","t":":mksession","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":mksp[ell]","m":[":"],"d":"produce .spl spell file","s":"builtin","t":":mkspell","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":mkv[imrc]","m":[":"],"d":"write current mappings and settings to a file","s":"builtin","t":":mkvimrc","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":mkvie[w]","m":[":"],"d":"write view of current window to a file","s":"builtin","t":":mkview","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":mod[e]","m":[":"],"d":"show or change the screen mode","s":"builtin","t":":mode","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":n[ext]","m":[":"],"d":"go to next file in the argument list","s":"builtin","t":":next","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":new","m":[":"],"d":"Open a new window with an empty buffer","s":"builtin","t":":new","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":nm[ap]","m":[":"],"d":"like \":map\" but for Normal mode","s":"builtin","t":":nmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nmapc[lear]","m":[":"],"d":"clear all mappings for Normal mode","s":"builtin","t":":nmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nme[nu]","m":[":"],"d":"add menu for Normal mode","s":"builtin","t":":nmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nn[oremap]","m":[":"],"d":"like \":noremap\" but for Normal mode","s":"builtin","t":":nnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nnoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Normal mode","s":"builtin","t":":nnoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":noa[utocmd]","m":[":"],"d":"Run a command without triggering autocommands","s":"builtin","t":":noautocmd","h":"autocmd.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":no[remap]","m":[":"],"d":"enter a mapping that will not be remapped","s":"builtin","t":":noremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":noh[lsearch]","m":[":"],"d":"Clear search highlighting until the next search","s":"builtin","t":":nohlsearch","h":"pattern.txt","sec":"Ex commands","cat":"Search","ex":1,"e":1},{"k":":norea[bbrev]","m":[":"],"d":"enter an abbreviation that will not be remapped","s":"builtin","t":":noreabbrev","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":noreme[nu]","m":[":"],"d":"enter a menu that will not be remapped","s":"builtin","t":":noremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":norm[al]","m":[":"],"d":"Run Normal-mode keys, on each line of [range]: :%norm A;","s":"builtin","t":":normal","h":"various.txt","sec":"Ex commands","cat":"Edit","ex":1,"n":"Use <code>:normal!<\/code> to ignore mappings (this config remaps d, c, x, j, k, s …)","e":1},{"k":":nos[wapfile]","m":[":"],"d":"following commands don't create a swap file","s":"builtin","t":":noswapfile","h":"recover.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nu[mber]","m":[":"],"d":"print lines with line number","s":"builtin","t":":number","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nun[map]","m":[":"],"d":"like \":unmap\" but for Normal mode","s":"builtin","t":":nunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":nunme[nu]","m":[":"],"d":"remove menu for Normal mode","s":"builtin","t":":nunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ol[dfiles]","m":[":"],"d":"List recently edited files","s":"builtin","t":":oldfiles","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":om[ap]","m":[":"],"d":"like \":map\" but for Operator-pending mode","s":"builtin","t":":omap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":omapc[lear]","m":[":"],"d":"remove all mappings for Operator-pending mode","s":"builtin","t":":omapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ome[nu]","m":[":"],"d":"add menu for Operator-pending mode","s":"builtin","t":":omenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":on[ly]","m":[":"],"d":"Close all other windows","s":"builtin","t":":only","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":ono[remap]","m":[":"],"d":"like \":noremap\" but for Operator-pending mode","s":"builtin","t":":onoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":onoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Operator-pending mode","s":"builtin","t":":onoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":opt[ions]","m":[":"],"d":"open the options-window","s":"builtin","t":":options","h":"options.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ou[nmap]","m":[":"],"d":"like \":unmap\" but for Operator-pending mode","s":"builtin","t":":ounmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ounme[nu]","m":[":"],"d":"remove menu for Operator-pending mode","s":"builtin","t":":ounmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pa[ckadd]","m":[":"],"d":"add a plugin from 'packpath'","s":"builtin","t":":packadd","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":packl[oadall]","m":[":"],"d":"load all packages under 'packpath'","s":"builtin","t":":packloadall","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pb[uffer]","m":[":"],"d":"edit buffer in the preview window","s":"builtin","t":":pbuffer","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":pc[lose]","m":[":"],"d":"close preview window","s":"builtin","t":":pclose","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":ped[it]","m":[":"],"d":"edit file in the preview window","s":"builtin","t":":pedit","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":pe[rl]","m":[":"],"d":"execute perl command","s":"builtin","t":":perl","h":"if_perl.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":perld[o]","m":[":"],"d":"execute perl command for each line","s":"builtin","t":":perldo","h":"if_perl.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":perlf[ile]","m":[":"],"d":"execute perl script file","s":"builtin","t":":perlfile","h":"if_perl.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":p[rint]","m":[":"],"d":"print lines","s":"builtin","t":":print","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":profd[el]","m":[":"],"d":"stop profiling a function or script","s":"builtin","t":":profdel","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":prof[ile]","m":[":"],"d":"profiling functions and scripts","s":"builtin","t":":profile","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":po[p]","m":[":"],"d":"jump to older entry in tag stack","s":"builtin","t":":pop","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":popu[p]","m":[":"],"d":"popup a menu by name","s":"builtin","t":":popup","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pp[op]","m":[":"],"d":"\":pop\" in preview window","s":"builtin","t":":ppop","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":pre[serve]","m":[":"],"d":"write all text to swap file","s":"builtin","t":":preserve","h":"recover.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":prev[ious]","m":[":"],"d":"go to previous file in argument list","s":"builtin","t":":previous","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":ps[earch]","m":[":"],"d":"like \":ijump\" but shows match in preview window","s":"builtin","t":":psearch","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":pt[ag]","m":[":"],"d":"show tag in preview window","s":"builtin","t":":ptag","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":ptN[ext]","m":[":"],"d":"|:tNext| in preview window","s":"builtin","t":":ptNext","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptf[irst]","m":[":"],"d":"|:trewind| in preview window","s":"builtin","t":":ptfirst","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptj[ump]","m":[":"],"d":"|:tjump| and show tag in preview window","s":"builtin","t":":ptjump","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptl[ast]","m":[":"],"d":"|:tlast| in preview window","s":"builtin","t":":ptlast","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptn[ext]","m":[":"],"d":"|:tnext| in preview window","s":"builtin","t":":ptnext","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptp[revious]","m":[":"],"d":"|:tprevious| in preview window","s":"builtin","t":":ptprevious","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":ptr[ewind]","m":[":"],"d":"|:trewind| in preview window","s":"builtin","t":":ptrewind","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":pts[elect]","m":[":"],"d":"|:tselect| and show tag in preview window","s":"builtin","t":":ptselect","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":pu[t]","m":[":"],"d":"Put a register linewise below the line (above with :put!)","s":"builtin","t":":put","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":pw[d]","m":[":"],"d":"Show the working directory","s":"builtin","t":":pwd","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":py3","m":[":"],"d":"execute Python 3 command","s":"builtin","t":":py3","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":python3","m":[":"],"d":"same as :py3","s":"builtin","t":":python3","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":py3d[o]","m":[":"],"d":"execute Python 3 command for each line","s":"builtin","t":":py3do","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":py3f[ile]","m":[":"],"d":"execute Python 3 script file","s":"builtin","t":":py3file","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":py[thon]","m":[":"],"d":"execute Python command","s":"builtin","t":":python","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pyd[o]","m":[":"],"d":"execute Python command for each line","s":"builtin","t":":pydo","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pyf[ile]","m":[":"],"d":"execute Python script file","s":"builtin","t":":pyfile","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pyx","m":[":"],"d":"execute |python_x| command","s":"builtin","t":":pyx","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pythonx","m":[":"],"d":"same as :pyx","s":"builtin","t":":pythonx","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pyxd[o]","m":[":"],"d":"execute |python_x| command for each line","s":"builtin","t":":pyxdo","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":pyxf[ile]","m":[":"],"d":"execute |python_x| script file","s":"builtin","t":":pyxfile","h":"if_pyth.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":q[uit]","m":[":"],"d":"Close the window; exits Neovim when it is the last one","s":"builtin","t":":quit","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":quita[ll]","m":[":"],"d":"quit Vim","s":"builtin","t":":quitall","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":qa[ll]","m":[":"],"d":"Quit Neovim (:qa! discards all changes)","s":"builtin","t":":qall","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":r[ead]","m":[":"],"d":"Insert {file} (or :r !cmd output) below the cursor","s":"builtin","t":":read","h":"insert.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":rec[over]","m":[":"],"d":"recover a file from a swap file","s":"builtin","t":":recover","h":"recover.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":red[o]","m":[":"],"d":"redo one undone change","s":"builtin","t":":redo","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":redi[r]","m":[":"],"d":"Redirect messages to a file, register or variable","s":"builtin","t":":redir","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":redr[aw]","m":[":"],"d":"force a redraw of the display","s":"builtin","t":":redraw","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":redraws[tatus]","m":[":"],"d":"force a redraw of the status line(s) and window bar(s)","s":"builtin","t":":redrawstatus","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":redrawt[abline]","m":[":"],"d":"force a redraw of the tabline","s":"builtin","t":":redrawtabline","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":reg[isters]","m":[":"],"d":"Show register contents (:reg a b for specific ones)","s":"builtin","t":":registers","h":"change.txt","sec":"Ex commands","cat":"Register & macro","ex":1,"n":"Register <code>d<\/code> holds deletes in this config","e":1},{"k":":res[ize]","m":[":"],"d":"change current window height","s":"builtin","t":":resize","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":restart","m":[":"],"d":"Restart Neovim, restoring the session (:restart! does not)","s":"builtin","t":":restart","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ret[ab]","m":[":"],"d":"Convert tabs/spaces to match 'expandtab' / 'tabstop'","s":"builtin","t":":retab","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":retu[rn]","m":[":"],"d":"return from a user function","s":"builtin","t":":return","h":"userfunc.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":rew[ind]","m":[":"],"d":"go to the first file in the argument list","s":"builtin","t":":rewind","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":ri[ght]","m":[":"],"d":"Right-align lines","s":"builtin","t":":right","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":rightb[elow]","m":[":"],"d":"make split window appear right or below","s":"builtin","t":":rightbelow","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":rsh[ada]","m":[":"],"d":"read from |shada| file","s":"builtin","t":":rshada","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":rub[y]","m":[":"],"d":"execute Ruby command","s":"builtin","t":":ruby","h":"if_ruby.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":rubyd[o]","m":[":"],"d":"execute Ruby command for each line","s":"builtin","t":":rubydo","h":"if_ruby.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":rubyf[ile]","m":[":"],"d":"execute Ruby script file","s":"builtin","t":":rubyfile","h":"if_ruby.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":rund[o]","m":[":"],"d":"read undo information from a file","s":"builtin","t":":rundo","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":ru[ntime]","m":[":"],"d":"source vim scripts in 'runtimepath'","s":"builtin","t":":runtime","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":s[ubstitute]","m":[":"],"d":"Find & replace: :[range]s/{pattern}/{string}/[flags]","s":"builtin","t":":substitute","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1,"n":"Flags: <code>g<\/code> all on line, <code>c<\/code> confirm, <code>i<\/code>/<code>I<\/code> case, <code>n<\/code> count only. <code>&amp;<\/code> in {string} = whole match, <code>\\1<\/code> = group","e":1},{"k":":sN[ext]","m":[":"],"d":"split window and go to previous file in argument list","s":"builtin","t":":sNext","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":san[dbox]","m":[":"],"d":"execute a command in the sandbox","s":"builtin","t":":sandbox","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sa[rgument]","m":[":"],"d":"split window and go to specific file in argument list","s":"builtin","t":":sargument","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sal[l]","m":[":"],"d":"open a window for each file in argument list","s":"builtin","t":":sall","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sav[eas]","m":[":"],"d":"Save to {file} and make it the current file","s":"builtin","t":":saveas","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":sb[uffer]","m":[":"],"d":"split window and go to specific file in the buffer list","s":"builtin","t":":sbuffer","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbN[ext]","m":[":"],"d":"split window and go to previous file in the buffer list","s":"builtin","t":":sbNext","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sba[ll]","m":[":"],"d":"open a window for each file in the buffer list","s":"builtin","t":":sball","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbf[irst]","m":[":"],"d":"split window and go to first file in the buffer list","s":"builtin","t":":sbfirst","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbl[ast]","m":[":"],"d":"split window and go to last file in buffer list","s":"builtin","t":":sblast","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbm[odified]","m":[":"],"d":"split window and go to modified file in the buffer list","s":"builtin","t":":sbmodified","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbn[ext]","m":[":"],"d":"split window and go to next file in the buffer list","s":"builtin","t":":sbnext","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbp[revious]","m":[":"],"d":"split window and go to previous file in the buffer list","s":"builtin","t":":sbprevious","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sbr[ewind]","m":[":"],"d":"split window and go to first file in the buffer list","s":"builtin","t":":sbrewind","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":scr[iptnames]","m":[":"],"d":"list names of all sourced Vim scripts","s":"builtin","t":":scriptnames","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":scripte[ncoding]","m":[":"],"d":"encoding used in sourced Vim script","s":"builtin","t":":scriptencoding","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":se[t]","m":[":"],"d":"Show or set options (:set wrap?, :set nowrap, :set sw=4)","s":"builtin","t":":set","h":"options.txt","sec":"Ex commands","cat":"Misc","ex":1,"e":1},{"k":":setf[iletype]","m":[":"],"d":"set 'filetype', unless it was set already","s":"builtin","t":":setfiletype","h":"options.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":setg[lobal]","m":[":"],"d":"show global values of options","s":"builtin","t":":setglobal","h":"options.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":setl[ocal]","m":[":"],"d":"Set an option for this buffer/window only","s":"builtin","t":":setlocal","h":"options.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sf[ind]","m":[":"],"d":"split current window and edit file in 'path'","s":"builtin","t":":sfind","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sfir[st]","m":[":"],"d":"split window and go to first file in the argument list","s":"builtin","t":":sfirst","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sig[n]","m":[":"],"d":"manipulate signs","s":"builtin","t":":sign","h":"sign.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sil[ent]","m":[":"],"d":"Run a command without showing messages","s":"builtin","t":":silent","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sl[eep]","m":[":"],"d":"do nothing for a few seconds","s":"builtin","t":":sleep","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sl[eep]!","m":[":"],"d":"do nothing for a few seconds, without the cursor visible","s":"builtin","t":":sleep!","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sla[st]","m":[":"],"d":"split window and go to last file in the argument list","s":"builtin","t":":slast","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sm[agic]","m":[":"],"d":":substitute with 'magic'","s":"builtin","t":":smagic","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":smap","m":[":"],"d":"like \":map\" but for Select mode","s":"builtin","t":":smap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":smapc[lear]","m":[":"],"d":"remove all mappings for Select mode","s":"builtin","t":":smapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sme[nu]","m":[":"],"d":"add menu for Select mode","s":"builtin","t":":smenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sn[ext]","m":[":"],"d":"split window and go to next file in the argument list","s":"builtin","t":":snext","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sno[magic]","m":[":"],"d":":substitute with 'nomagic'","s":"builtin","t":":snomagic","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":snor[emap]","m":[":"],"d":"like \":noremap\" but for Select mode","s":"builtin","t":":snoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":snoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Select mode","s":"builtin","t":":snoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sor[t]","m":[":"],"d":"Sort lines in [range] (n numeric, i ignore case, u unique, r /pat/)","s":"builtin","t":":sort","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1,"e":1},{"k":":so[urce]","m":[":"],"d":"Run a Vim script or Lua file (:so % runs the current file)","s":"builtin","t":":source","h":"repeat.txt","sec":"Ex commands","cat":"Misc","ex":1,"e":1},{"k":":spelld[ump]","m":[":"],"d":"split window and fill with all correct words","s":"builtin","t":":spelldump","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spe[llgood]","m":[":"],"d":"add good word for spelling","s":"builtin","t":":spellgood","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spelli[nfo]","m":[":"],"d":"show info about loaded spell files","s":"builtin","t":":spellinfo","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spellra[re]","m":[":"],"d":"add rare word for spelling","s":"builtin","t":":spellrare","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spellr[epall]","m":[":"],"d":"replace all bad words like last |z=|","s":"builtin","t":":spellrepall","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spellu[ndo]","m":[":"],"d":"remove good or bad word","s":"builtin","t":":spellundo","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":spellw[rong]","m":[":"],"d":"add spelling mistake","s":"builtin","t":":spellwrong","h":"spell.txt","sec":"Ex commands","cat":"Spell","ex":1},{"k":":sp[lit]","m":[":"],"d":"Split the window horizontally (optionally editing {file})","s":"builtin","t":":split","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1,"e":1},{"k":":spr[evious]","m":[":"],"d":"split window and go to previous file in the argument list","s":"builtin","t":":sprevious","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sre[wind]","m":[":"],"d":"split window and go to first file in the argument list","s":"builtin","t":":srewind","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":st[op]","m":[":"],"d":"suspend the editor or escape to a shell","s":"builtin","t":":stop","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":sta[g]","m":[":"],"d":"split window and jump to a tag","s":"builtin","t":":stag","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":star[tinsert]","m":[":"],"d":"Start Insert mode","s":"builtin","t":":startinsert","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":startg[replace]","m":[":"],"d":"start Virtual Replace mode","s":"builtin","t":":startgreplace","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":startr[eplace]","m":[":"],"d":"start Replace mode","s":"builtin","t":":startreplace","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":stopi[nsert]","m":[":"],"d":"Stop Insert mode","s":"builtin","t":":stopinsert","h":"insert.txt","sec":"Ex commands","cat":"Insert","ex":1},{"k":":stj[ump]","m":[":"],"d":"do \":tjump\" and split window","s":"builtin","t":":stjump","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":sts[elect]","m":[":"],"d":"do \":tselect\" and split window","s":"builtin","t":":stselect","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":sun[hide]","m":[":"],"d":"same as \":unhide\"","s":"builtin","t":":sunhide","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":sunm[ap]","m":[":"],"d":"like \":unmap\" but for Select mode","s":"builtin","t":":sunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sunme[nu]","m":[":"],"d":"remove menu for Select mode","s":"builtin","t":":sunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sus[pend]","m":[":"],"d":"same as \":stop\"","s":"builtin","t":":suspend","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":sv[iew]","m":[":"],"d":"split window and edit file read-only","s":"builtin","t":":sview","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":sw[apname]","m":[":"],"d":"show the name of the current swap file","s":"builtin","t":":swapname","h":"recover.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sy[ntax]","m":[":"],"d":"syntax highlighting","s":"builtin","t":":syntax","h":"syntax.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":synti[me]","m":[":"],"d":"measure syntax highlighting speed","s":"builtin","t":":syntime","h":"syntax.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":sync[bind]","m":[":"],"d":"sync scroll binding","s":"builtin","t":":syncbind","h":"scroll.txt","sec":"Ex commands","cat":"Scroll & view","ex":1},{"k":":t","m":[":"],"d":"Copy lines (same as :copy): :t. duplicates a line","s":"builtin","t":":t","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":tN[ext]","m":[":"],"d":"jump to previous matching tag","s":"builtin","t":":tNext","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tabN[ext]","m":[":"],"d":"go to previous tabpage","s":"builtin","t":":tabNext","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabc[lose]","m":[":"],"d":"Close the current tab page","s":"builtin","t":":tabclose","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabd[o]","m":[":"],"d":"execute command in each tabpage","s":"builtin","t":":tabdo","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabe[dit]","m":[":"],"d":"Edit {file} in a new tab page","s":"builtin","t":":tabedit","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabf[ind]","m":[":"],"d":"find file in 'path', edit it in a new tabpage","s":"builtin","t":":tabfind","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabfir[st]","m":[":"],"d":"go to first tabpage","s":"builtin","t":":tabfirst","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabl[ast]","m":[":"],"d":"go to last tabpage","s":"builtin","t":":tablast","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabm[ove]","m":[":"],"d":"Move the tab page to position N (or +N / -N)","s":"builtin","t":":tabmove","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabnew","m":[":"],"d":"Open a new tab page (optionally editing {file})","s":"builtin","t":":tabnew","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1,"e":1},{"k":":tabn[ext]","m":[":"],"d":"Go to the next tab page","s":"builtin","t":":tabnext","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabo[nly]","m":[":"],"d":"Close all other tab pages","s":"builtin","t":":tabonly","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabp[revious]","m":[":"],"d":"Go to the previous tab page","s":"builtin","t":":tabprevious","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabr[ewind]","m":[":"],"d":"go to first tabpage","s":"builtin","t":":tabrewind","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tabs","m":[":"],"d":"list the tabpages and what they contain","s":"builtin","t":":tabs","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":tab","m":[":"],"d":"Open the following command's window in a new tab: :tab help x","s":"builtin","t":":tab","h":"tabpage.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":ta[g]","m":[":"],"d":"jump to tag","s":"builtin","t":":tag","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tags","m":[":"],"d":"show the contents of the tag stack","s":"builtin","t":":tags","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tc[d]","m":[":"],"d":"Change the working directory for this tab page","s":"builtin","t":":tcd","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":tch[dir]","m":[":"],"d":"change directory for tabpage","s":"builtin","t":":tchdir","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":te[rminal]","m":[":"],"d":"Open a terminal buffer","s":"builtin","t":":terminal","h":"various.txt","sec":"Ex commands","cat":"Terminal","ex":1,"e":1},{"k":":tf[irst]","m":[":"],"d":"jump to first matching tag","s":"builtin","t":":tfirst","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":th[row]","m":[":"],"d":"throw an exception","s":"builtin","t":":throw","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tj[ump]","m":[":"],"d":"like \":tselect\", but jump directly when there is only one match","s":"builtin","t":":tjump","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tl[ast]","m":[":"],"d":"jump to last matching tag","s":"builtin","t":":tlast","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tlm[enu]","m":[":"],"d":"add menu for |Terminal-mode|","s":"builtin","t":":tlmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tln[oremenu]","m":[":"],"d":"like \":noremenu\" but for |Terminal-mode|","s":"builtin","t":":tlnoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tlu[nmenu]","m":[":"],"d":"remove menu for |Terminal-mode|","s":"builtin","t":":tlunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tmapc[lear]","m":[":"],"d":"remove all mappings for |Terminal-mode|","s":"builtin","t":":tmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tma[p]","m":[":"],"d":"like \":map\" but for |Terminal-mode|","s":"builtin","t":":tmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tm[enu]","m":[":"],"d":"define menu tooltip","s":"builtin","t":":tmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tn[ext]","m":[":"],"d":"jump to next matching tag","s":"builtin","t":":tnext","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tno[remap]","m":[":"],"d":"like \":noremap\" but for |Terminal-mode|","s":"builtin","t":":tnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":to[pleft]","m":[":"],"d":"make split window appear at top or far left","s":"builtin","t":":topleft","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":tp[revious]","m":[":"],"d":"jump to previous matching tag","s":"builtin","t":":tprevious","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tr[ewind]","m":[":"],"d":"jump to first matching tag","s":"builtin","t":":trewind","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":trust","m":[":"],"d":"add or remove file from trust database","s":"builtin","t":":trust","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":try","m":[":"],"d":"execute commands, abort on error or exception","s":"builtin","t":":try","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":ts[elect]","m":[":"],"d":"list matching tags and select one","s":"builtin","t":":tselect","h":"tagsrch.txt","sec":"Ex commands","cat":"Tags","ex":1},{"k":":tunma[p]","m":[":"],"d":"like \":unmap\" but for |Terminal-mode|","s":"builtin","t":":tunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":tu[nmenu]","m":[":"],"d":"remove menu tooltip","s":"builtin","t":":tunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":u[ndo]","m":[":"],"d":"undo last change(s)","s":"builtin","t":":undo","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":undoj[oin]","m":[":"],"d":"join next change with previous undo block","s":"builtin","t":":undojoin","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":undol[ist]","m":[":"],"d":"List the leaves of the undo tree","s":"builtin","t":":undolist","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":una[bbreviate]","m":[":"],"d":"remove abbreviation","s":"builtin","t":":unabbreviate","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":unh[ide]","m":[":"],"d":"open a window for each loaded file in the buffer list","s":"builtin","t":":unhide","h":"windows.txt","sec":"Ex commands","cat":"Buffer & tab","ex":1},{"k":":uni[q]","m":[":"],"d":"Remove adjacent duplicate lines in [range]","s":"builtin","t":":uniq","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":unl[et]","m":[":"],"d":"delete variable","s":"builtin","t":":unlet","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":unlo[ckvar]","m":[":"],"d":"unlock variables","s":"builtin","t":":unlockvar","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":unm[ap]","m":[":"],"d":"remove mapping","s":"builtin","t":":unmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":unme[nu]","m":[":"],"d":"remove menu","s":"builtin","t":":unmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":uns[ilent]","m":[":"],"d":"run a command not silently","s":"builtin","t":":unsilent","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":up[date]","m":[":"],"d":"Write only if the buffer was modified","s":"builtin","t":":update","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":v[global]","m":[":"],"d":"Run an Ex command on every line NOT matching {pattern}: :v/pat/cmd","s":"builtin","t":":vglobal","h":"repeat.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":ve[rsion]","m":[":"],"d":"print version number and other info","s":"builtin","t":":version","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":verb[ose]","m":[":"],"d":"Run a command verbosely; :verbose map x shows where x was set","s":"builtin","t":":verbose","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1,"e":1},{"k":":vert[ical]","m":[":"],"d":"Make the following split vertical: :vert help x","s":"builtin","t":":vertical","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":vim[grep]","m":[":"],"d":"Search files into the quickfix list: :vim /pat/ **/*.lua","s":"builtin","t":":vimgrep","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":vimgrepa[dd]","m":[":"],"d":"like :vimgrep, but append to current list","s":"builtin","t":":vimgrepadd","h":"quickfix.txt","sec":"Ex commands","cat":"Quickfix & lists","ex":1},{"k":":vi[sual]","m":[":"],"d":"same as \":edit\", but turns off \"Ex\" mode","s":"builtin","t":":visual","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":viu[sage]","m":[":"],"d":"overview of Normal mode commands","s":"builtin","t":":viusage","h":"helphelp.txt","sec":"Ex commands","cat":"Help","ex":1},{"k":":vie[w]","m":[":"],"d":"edit a file read-only","s":"builtin","t":":view","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":vm[ap]","m":[":"],"d":"like \":map\" but for Visual+Select mode","s":"builtin","t":":vmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vmapc[lear]","m":[":"],"d":"remove all mappings for Visual+Select mode","s":"builtin","t":":vmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vme[nu]","m":[":"],"d":"add menu for Visual+Select mode","s":"builtin","t":":vmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vne[w]","m":[":"],"d":"Open a new vertical window with an empty buffer","s":"builtin","t":":vnew","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":vn[oremap]","m":[":"],"d":"like \":noremap\" but for Visual+Select mode","s":"builtin","t":":vnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vnoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Visual+Select mode","s":"builtin","t":":vnoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vs[plit]","m":[":"],"d":"Split the window vertically (optionally editing {file})","s":"builtin","t":":vsplit","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1,"e":1},{"k":":vu[nmap]","m":[":"],"d":"like \":unmap\" but for Visual+Select mode","s":"builtin","t":":vunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":vunme[nu]","m":[":"],"d":"remove menu for Visual+Select mode","s":"builtin","t":":vunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":wind[o]","m":[":"],"d":"Run a command in every window","s":"builtin","t":":windo","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":w[rite]","m":[":"],"d":"Write the buffer to its file (or to {file})","s":"builtin","t":":write","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":wN[ext]","m":[":"],"d":"write to a file and go to previous file in argument list","s":"builtin","t":":wNext","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":wa[ll]","m":[":"],"d":"Write all modified buffers","s":"builtin","t":":wall","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":wh[ile]","m":[":"],"d":"execute loop for as long as condition met","s":"builtin","t":":while","h":"vimeval.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":wi[nsize]","m":[":"],"d":"get or set window size (obsolete)","s":"builtin","t":":winsize","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":winc[md]","m":[":"],"d":"Run a CTRL-W command: :wincmd l","s":"builtin","t":":wincmd","h":"windows.txt","sec":"Ex commands","cat":"Window","ex":1},{"k":":winp[os]","m":[":"],"d":"get or set window position","s":"builtin","t":":winpos","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":wn[ext]","m":[":"],"d":"write to a file and go to next file in argument list","s":"builtin","t":":wnext","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":wp[revious]","m":[":"],"d":"write to a file and go to previous file in argument list","s":"builtin","t":":wprevious","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":wq","m":[":"],"d":"Write and close the window","s":"builtin","t":":wq","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":wqa[ll]","m":[":"],"d":"Write all modified buffers and quit","s":"builtin","t":":wqall","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":wsh[ada]","m":[":"],"d":"write to ShaDa file","s":"builtin","t":":wshada","h":"starting.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":wu[ndo]","m":[":"],"d":"write undo information to a file","s":"builtin","t":":wundo","h":"undo.txt","sec":"Ex commands","cat":"Undo & repeat","ex":1},{"k":":x[it]","m":[":"],"d":"Write only if changed, then close the window","s":"builtin","t":":xit","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1,"e":1},{"k":":xa[ll]","m":[":"],"d":"Write all modified buffers and quit","s":"builtin","t":":xall","h":"editing.txt","sec":"Ex commands","cat":"Files","ex":1},{"k":":xmapc[lear]","m":[":"],"d":"remove all mappings for Visual mode","s":"builtin","t":":xmapclear","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xm[ap]","m":[":"],"d":"like \":map\" but for Visual mode","s":"builtin","t":":xmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xme[nu]","m":[":"],"d":"add menu for Visual mode","s":"builtin","t":":xmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xn[oremap]","m":[":"],"d":"like \":noremap\" but for Visual mode","s":"builtin","t":":xnoremap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xnoreme[nu]","m":[":"],"d":"like \":noremenu\" but for Visual mode","s":"builtin","t":":xnoremenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xu[nmap]","m":[":"],"d":"like \":unmap\" but for Visual mode","s":"builtin","t":":xunmap","h":"map.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":xunme[nu]","m":[":"],"d":"remove menu for Visual mode","s":"builtin","t":":xunmenu","h":"gui.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":y[ank]","m":[":"],"d":"Yank [range] lines [into register]","s":"builtin","t":":yank","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1},{"k":":z","m":[":"],"d":"print some lines","s":"builtin","t":":z","h":"various.txt","sec":"Ex commands","cat":"Misc","ex":1},{"k":":~","m":[":"],"d":"repeat last \":substitute\"","s":"builtin","t":":~","h":"change.txt","sec":"Ex commands","cat":"Edit","ex":1}],"live":[{"k":"<C-D>","m":["n"],"d":"Scroll half a page down, then put the cursor line 30% from the top","s":"focusline.nvim","f":"lua/focusline/init.lua","l":245,"rhs":null,"nw":null,"cat":"Scroll & view","n":"A [count] is passed to the real <code>&lt;C-D&gt;<\/code> (it sets <code>'scroll'<\/code>).","e":1,"sl":"½pg↓ 30%","rep":[{"m":"n","b":112}]},{"k":"<Tab>","m":["n"],"d":"Apply Sidekick NES Suggestion","s":"config","f":"lua/keymaps.lua","l":342,"rhs":null,"nw":null,"cat":"Completion & AI","n":"Jumps to, then applies, the Sidekick next-edit suggestion. With no suggestion it is a plain jump forward (count works). <kbd>&lt;C-i&gt;<\/kbd> is mapped separately, so terminals that can tell them apart (kitty, Neovide) keep it as jump forward","e":1,"sl":"NES","rep":[{"m":"n","b":118}]},{"k":"<CR>","m":["n","x","o"],"d":"Leap: jump anywhere in this window (2 chars, then a label)","s":"config","f":"lua/keymaps.lua","l":352,"rhs":null,"nw":null,"cat":"Motion","n":"<code>&lt;Plug&gt;(leap)<\/code>, lua/keymaps.lua. Bidirectional in the current window, closest targets first; inclusive with operators (<code>d&lt;CR&gt;ab<\/code>). Replaces Vim's <kbd>Enter<\/kbd> = <em>next line<\/em> (use <kbd>+<\/kbd> or <kbd>j<\/kbd>). Being a global Normal map it also takes over <kbd>Enter<\/kbd> in the quickfix/location list and the command-line window. No traversal and [count] is ignored (bidirectional mode). Dot-repeat of Leap operations needs vim-repeat, which isn't installed.","e":1,"sl":"leap","rep":[{"m":"n","b":124},{"m":"x","b":124},{"m":"o","b":124}]},{"k":"<C-U>","m":["n"],"d":"Scroll half a page up, then put the cursor line 30% from the top","s":"focusline.nvim","f":"lua/focusline/init.lua","l":245,"rhs":null,"nw":null,"cat":"Scroll & view","n":null,"e":null,"sl":"½pg↑ 30%","rep":[{"m":"n","b":132}]},{"k":"<Space>hl","m":["n"],"d":"Show Bookmark Picker","s":"config","f":"lua/keymaps.lua","l":414,"rhs":null,"nw":null,"cat":"Mark & jump","n":"Snacks picker of all Haunt bookmarks","e":null,"sl":"bookmarks","ld":1},{"k":"<Space>hp","m":["n"],"d":"Previous Bookmark","s":"config","f":"lua/keymaps.lua","l":411,"rhs":null,"nw":null,"cat":"Mark & jump","n":null,"e":null,"sl":"prev mark","ld":1},{"k":"<Space>hn","m":["n"],"d":"Next Bookmark","s":"config","f":"lua/keymaps.lua","l":408,"rhs":null,"nw":null,"cat":"Mark & jump","n":null,"e":null,"sl":"next mark","ld":1},{"k":"<Space>hd","m":["n"],"d":"Delete Bookmark","s":"config","f":"lua/keymaps.lua","l":405,"rhs":null,"nw":null,"cat":"Mark & jump","n":null,"e":null,"sl":"del mark","ld":1},{"k":"<Space>ht","m":["n"],"d":"Toggle Annotation","s":"config","f":"lua/keymaps.lua","l":402,"rhs":null,"nw":null,"cat":"Mark & jump","n":"Show/hide the annotation of the bookmark on this line","e":null,"sl":"show note","ld":1},{"k":"<Space>ha","m":["n"],"d":"Annotate","s":"config","f":"lua/keymaps.lua","l":399,"rhs":null,"nw":null,"cat":"Mark & jump","n":"Bookmark the current line with an annotation shown as virtual text (prompts for the text)","e":null,"sl":"annotate","ld":1},{"k":"<Space>qd","m":["n"],"d":"Don't Save Current Session","s":"config","f":"lua/keymaps.lua","l":392,"rhs":null,"nw":null,"cat":"Session","n":"Stop persistence from saving the session when you quit","e":null,"sl":"no save","ld":1},{"k":"<Space>ql","m":["n"],"d":"Restore Last Session","s":"config","f":"lua/keymaps.lua","l":389,"rhs":null,"nw":null,"cat":"Session","n":null,"e":null,"sl":"last","ld":1},{"k":"<Space>qS","m":["n"],"d":"Select Session","s":"config","f":"lua/keymaps.lua","l":386,"rhs":null,"nw":null,"cat":"Session","n":"persistence.nvim: one session per directory and git branch, saved automatically on exit","e":null,"sl":"select","ld":1},{"k":"<Space>qs","m":["n"],"d":"Restore Session","s":"config","f":"lua/keymaps.lua","l":383,"rhs":null,"nw":null,"cat":"Session","n":"persistence.nvim: one session per directory and git branch, saved automatically on exit","e":null,"sl":"restore","ld":1},{"k":"<Space>cbk","m":["n"],"d":"Box Style Catalog","s":"config","f":"lua/keymaps.lua","l":378,"rhs":"<Cmd>CBcatalog<CR>","nw":null,"cat":"Comment","n":"Show all box and line styles","e":null,"sl":"catalog","ld":1},{"k":"<Space>cbd","m":["n","x"],"d":"Delete Box/Line","s":"config","f":"lua/keymaps.lua","l":377,"rhs":"<Cmd>CBd<CR>","nw":null,"cat":"Comment","n":"Remove a comment box or titled line around the text","e":null,"sl":"del box","ld":1},{"k":"<Space>cbl","m":["n","x"],"d":"Centered Line","s":"config","f":"lua/keymaps.lua","l":376,"rhs":"<Cmd>CBcline<CR>","nw":null,"cat":"Comment","n":"Insert a centered comment line","e":null,"sl":"line","ld":1},{"k":"<Space>cbb","m":["n","x"],"d":"Centered Box","s":"config","f":"lua/keymaps.lua","l":375,"rhs":"<Cmd>CBccbox<CR>","nw":null,"cat":"Comment","n":"Wrap the line(s) in a centered comment box (comment-box.nvim)","e":null,"sl":"box","ld":1},{"k":"<Space>uu","m":["n"],"d":"Toggle Undotree","s":"config","f":"lua/keymaps.lua","l":370,"rhs":"<Cmd>UndotreeToggle<CR>","nw":null,"cat":"Undo & repeat","n":"Toggle the undotree side panel (persistent undo is on)","e":1,"sl":"undotree","ld":1},{"k":"<Space>cf","m":["n","x"],"d":"Format Buffer","s":"config","f":"lua/keymaps.lua","l":363,"rhs":null,"nw":null,"cat":"Edit","n":"conform.nvim with LSP fallback; in Visual mode only the selection is formatted","e":1,"sl":"format","ld":1},{"k":"<Space>N","m":["n"],"d":"Neovim News","s":"config","f":"lua/keymaps.lua","l":321,"rhs":null,"nw":null,"cat":"Help","n":"Shows Neovim's <code>news.txt<\/code> in a floating window","e":null,"sl":"news","ld":1},{"k":"<Space>un","m":["n"],"d":"Dismiss All Notifications","s":"config","f":"lua/keymaps.lua","l":306,"rhs":null,"nw":null,"cat":"UI & toggles","n":null,"e":null,"sl":"dismiss","ld":1},{"k":"<Space>gg","m":["n"],"d":"Lazygit","s":"config","f":"lua/keymaps.lua","l":303,"rhs":null,"nw":null,"cat":"Git","n":"Lazygit in a Snacks floating terminal","e":1,"sl":"lazygit","ld":1},{"k":"<Space>gB","m":["n","x"],"d":"Git Browse","s":"config","f":"lua/keymaps.lua","l":300,"rhs":null,"nw":null,"cat":"Git","n":"Open the file on the remote's web UI; from Visual mode the selected lines are linked","e":null,"sl":"browse","ld":1},{"k":"<Space>cR","m":["n"],"d":"Rename File","s":"config","f":"lua/keymaps.lua","l":297,"rhs":null,"nw":null,"cat":"Files","n":"Rename the current file on disk; tells LSP servers (willRenameFiles) so imports can follow","e":null,"sl":"rename file","ld":1},{"k":"<Space>bd","m":["n"],"d":"Delete Buffer","s":"config","f":"lua/keymaps.lua","l":294,"rhs":null,"nw":null,"cat":"Buffer & tab","n":"Snacks.bufdelete(): delete the buffer but keep the window layout","e":1,"sl":"del buffer","ld":1},{"k":"<Space>n","m":["n"],"d":"Notification History","s":"config","f":"lua/keymaps.lua","l":291,"rhs":null,"nw":null,"cat":"UI & toggles","n":"Snacks notifier history window (<code>lua/keymaps.lua:291<\/code>)","e":null,"sl":"notifs","ld":1},{"k":"<Space>S","m":["n"],"d":"Select Scratch Buffer","s":"config","f":"lua/keymaps.lua","l":288,"rhs":null,"nw":null,"cat":"Buffer & tab","n":"Pick one of the saved scratch buffers","e":null,"sl":"scratches","ld":1},{"k":"<Space>.","m":["n"],"d":"Toggle Scratch Buffer","s":"config","f":"lua/keymaps.lua","l":285,"rhs":null,"nw":null,"cat":"Buffer & tab","n":"Toggle a persistent scratch buffer (Snacks)","e":null,"sl":"scratch","ld":1},{"k":"<Space>Z","m":["n"],"d":"Toggle Zoom","s":"config","f":"lua/keymaps.lua","l":282,"rhs":null,"nw":null,"cat":"Window","n":"Snacks zoom: maximize the current window, again to restore","e":null,"sl":"zoom","ld":1},{"k":"<Space>z","m":["n"],"d":"Toggle Zen Mode","s":"config","f":"lua/keymaps.lua","l":279,"rhs":null,"nw":null,"cat":"UI & toggles","n":"Snacks zen mode: distraction-free centered window","e":null,"sl":"zen","ld":1},{"k":"<Space>ur","m":["n"],"d":"Clear Search Highlights","s":"config","f":"lua/keymaps.lua","l":278,"rhs":"<Cmd>nohlsearch<CR>","nw":null,"cat":"Search","n":"Clears search highlighting; Neovim's <kbd>&lt;C-L&gt;<\/kbd> does it too","e":null,"sl":"nohl","ld":1},{"k":"<Space>cr","m":["n"],"d":"Rename Symbol","s":"config","f":"lua/keymaps.lua","l":273,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Puts <code>:IncRename &lt;cword&gt;<\/code> on the command line with a live preview: edit the name, then <kbd>&lt;CR&gt;<\/kbd>. Neovim's <kbd>grn<\/kbd> renames without the preview","e":1,"sl":"rename","ld":1},{"k":"<Space>ca","m":["n"],"d":"Code Action","s":"config","f":"lua/keymaps.lua","l":272,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Neovim's <kbd>gra<\/kbd> does the same","e":1,"sl":"code action","ld":1},{"k":"<Space>sS","m":["n"],"d":"LSP Workspace Symbols","s":"config","f":"lua/keymaps.lua","l":266,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":"ws symbols","ld":1},{"k":"<Space>ss","m":["n"],"d":"LSP Symbols","s":"config","f":"lua/keymaps.lua","l":263,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":"symbols","ld":1},{"k":"<Space>uC","m":["n"],"d":"Colorschemes","s":"config","f":"lua/keymaps.lua","l":236,"rhs":null,"nw":null,"cat":"UI & toggles","n":null,"e":null,"sl":"colors","ld":1},{"k":"<Space>su","m":["n"],"d":"Undo History","s":"config","f":"lua/keymaps.lua","l":233,"rhs":null,"nw":null,"cat":"Undo & repeat","n":"Snacks undo-tree picker with diff preview","e":null,"sl":"undo hist","ld":1},{"k":"<Space>sR","m":["n"],"d":"Resume","s":"config","f":"lua/keymaps.lua","l":230,"rhs":null,"nw":null,"cat":"Find & pick","n":"Reopen the last picker with its query","e":null,"sl":"resume","ld":1},{"k":"<Space>sq","m":["n"],"d":"Quickfix List","s":"config","f":"lua/keymaps.lua","l":227,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":"Snacks picker over the quickfix list","e":null,"sl":"quickfix","ld":1},{"k":"<Space>sp","m":["n"],"d":"Search for Plugin Spec","s":"config","f":"lua/keymaps.lua","l":217,"rhs":null,"nw":null,"cat":"Find & pick","n":"Greps <code>lua/plugins.lua<\/code> for every <code>vim.pack<\/code> spec (<code>src = \"https://…<\/code>); type to filter by plugin name","e":null,"sl":"plugin spec","ld":1},{"k":"<Space>sM","m":["n"],"d":"Man Pages","s":"config","f":"lua/keymaps.lua","l":214,"rhs":null,"nw":null,"cat":"Help","n":null,"e":null,"sl":"man pages","ld":1},{"k":"<Space>sm","m":["n"],"d":"Marks","s":"config","f":"lua/keymaps.lua","l":211,"rhs":null,"nw":null,"cat":"Mark & jump","n":null,"e":null,"sl":"marks","ld":1},{"k":"<Space>sl","m":["n"],"d":"Location List","s":"config","f":"lua/keymaps.lua","l":208,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":"loclist","ld":1},{"k":"<Space>sk","m":["n"],"d":"Keymaps","s":"config","f":"lua/keymaps.lua","l":205,"rhs":null,"nw":null,"cat":"Help","n":null,"e":1,"sl":"keymaps","ld":1},{"k":"<Space>sj","m":["n"],"d":"Jumps","s":"config","f":"lua/keymaps.lua","l":202,"rhs":null,"nw":null,"cat":"Mark & jump","n":"Jumplist picker: a way to go forward in the jumplist now that <kbd>&lt;Tab&gt;<\/kbd>/<kbd>&lt;C-I&gt;<\/kbd> is Sidekick NES","e":null,"sl":"jumps","ld":1},{"k":"<Space>si","m":["n"],"d":"Icons","s":"config","f":"lua/keymaps.lua","l":199,"rhs":null,"nw":null,"cat":"Insert","n":"Snacks icon picker; <kbd>&lt;CR&gt;<\/kbd> puts the icon at the cursor (<code>confirm = \"put\"<\/code>)","e":null,"sl":"icons","ld":1},{"k":"<Space>sH","m":["n"],"d":"Highlights","s":"config","f":"lua/keymaps.lua","l":196,"rhs":null,"nw":null,"cat":"UI & toggles","n":null,"e":null,"sl":"highlights","ld":1},{"k":"<Space>sh","m":["n"],"d":"Help Pages","s":"config","f":"lua/keymaps.lua","l":193,"rhs":null,"nw":null,"cat":"Help","n":null,"e":1,"sl":"help","ld":1},{"k":"<Space>sD","m":["n"],"d":"Buffer Diagnostics","s":"config","f":"lua/keymaps.lua","l":190,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":"buf diags","ld":1},{"k":"<Space>sd","m":["n"],"d":"Diagnostics","s":"config","f":"lua/keymaps.lua","l":187,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":1,"sl":"diagnostics","ld":1},{"k":"<Space>sC","m":["n"],"d":"Commands","s":"config","f":"lua/keymaps.lua","l":184,"rhs":null,"nw":null,"cat":"Command line","n":null,"e":null,"sl":"commands","ld":1},{"k":"<Space>sc","m":["n"],"d":"Command History","s":"config","f":"lua/keymaps.lua","l":181,"rhs":null,"nw":null,"cat":"Command line","n":null,"e":null,"sl":"cmd hist","ld":1},{"k":"<Space>sa","m":["n"],"d":"Autocmds","s":"config","f":"lua/keymaps.lua","l":178,"rhs":null,"nw":null,"cat":"Help","n":"Snacks picker of every autocommand; <kbd>&lt;CR&gt;<\/kbd> jumps to where it was defined","e":null,"sl":"autocmds","ld":1},{"k":"<Space>s/","m":["n"],"d":"Search History","s":"config","f":"lua/keymaps.lua","l":175,"rhs":null,"nw":null,"cat":"Search","n":null,"e":null,"sl":"search hist","ld":1},{"k":"<Space>s\"","m":["n"],"d":"Registers","s":"config","f":"lua/keymaps.lua","l":172,"rhs":null,"nw":null,"cat":"Register & macro","n":null,"e":null,"sl":"registers","ld":1},{"k":"<Space>sw","m":["n","x"],"d":"Visual selection or word","s":"config","f":"lua/keymaps.lua","l":167,"rhs":null,"nw":null,"cat":"Search","n":"Normal: word under the cursor. Visual: the selection","e":null,"sl":"grep word","ld":1},{"k":"<Space>sg","m":["n"],"d":"Grep","s":"config","f":"lua/keymaps.lua","l":164,"rhs":null,"nw":null,"cat":"Find & pick","n":"Same as <kbd>&lt;leader&gt;/<\/kbd>","e":null,"sl":"grep","ld":1},{"k":"<Space>sB","m":["n"],"d":"Grep Open Buffers","s":"config","f":"lua/keymaps.lua","l":161,"rhs":null,"nw":null,"cat":"Search","n":null,"e":null,"sl":"grep bufs","ld":1},{"k":"<Space>sb","m":["n"],"d":"Buffer Lines","s":"config","f":"lua/keymaps.lua","l":158,"rhs":null,"nw":null,"cat":"Search","n":"Fuzzy search the lines of the current buffer","e":null,"sl":"lines","ld":1},{"k":"<Space>gc","m":["n"],"d":"Tea Create Pull Request","s":"config","f":"lua/keymaps.lua","l":153,"rhs":null,"nw":null,"cat":"Git","n":"snacks-tea (Gitea/Forgejo); needs the <code>tea<\/code> CLI logged in, uses the <code>origin<\/code> remote","e":null,"sl":"tea new PR","ld":1},{"k":"<Space>gT","m":["n"],"d":"Tea Pull Requests (all)","s":"config","f":"lua/keymaps.lua","l":150,"rhs":null,"nw":null,"cat":"Git","n":"snacks-tea (Gitea/Forgejo); needs the <code>tea<\/code> CLI logged in, uses the <code>origin<\/code> remote","e":null,"sl":"tea all PRs","ld":1},{"k":"<Space>gt","m":["n"],"d":"Tea Pull Requests (open)","s":"config","f":"lua/keymaps.lua","l":147,"rhs":null,"nw":null,"cat":"Git","n":"snacks-tea (Gitea/Forgejo); needs the <code>tea<\/code> CLI logged in, uses the <code>origin<\/code> remote","e":null,"sl":"tea PRs","ld":1},{"k":"<Space>gP","m":["n"],"d":"GitHub Pull Requests (all)","s":"config","f":"lua/keymaps.lua","l":142,"rhs":null,"nw":null,"cat":"Git","n":"Snacks GitHub picker; needs the <code>gh<\/code> CLI, logged in","e":null,"sl":"all PRs","ld":1},{"k":"<Space>gp","m":["n"],"d":"GitHub Pull Requests (open)","s":"config","f":"lua/keymaps.lua","l":139,"rhs":null,"nw":null,"cat":"Git","n":"Snacks GitHub picker; needs the <code>gh<\/code> CLI, logged in","e":null,"sl":"PRs","ld":1},{"k":"<Space>gI","m":["n"],"d":"GitHub Issues (all)","s":"config","f":"lua/keymaps.lua","l":136,"rhs":null,"nw":null,"cat":"Git","n":"Snacks GitHub picker; needs the <code>gh<\/code> CLI, logged in","e":null,"sl":"all issues","ld":1},{"k":"<Space>gi","m":["n"],"d":"GitHub Issues (open)","s":"config","f":"lua/keymaps.lua","l":133,"rhs":null,"nw":null,"cat":"Git","n":"Snacks GitHub picker; needs the <code>gh<\/code> CLI, logged in","e":null,"sl":"issues","ld":1},{"k":"<Space>gf","m":["n"],"d":"Git Log File","s":"config","f":"lua/keymaps.lua","l":128,"rhs":null,"nw":null,"cat":"Git","n":"Git log of the current file","e":null,"sl":"file log","ld":1},{"k":"<Space>gd","m":["n"],"d":"Git Diff (Hunks)","s":"config","f":"lua/keymaps.lua","l":125,"rhs":null,"nw":null,"cat":"Git","n":"Picker of changed hunks (<code>git diff<\/code>)","e":null,"sl":"hunks","ld":1},{"k":"<Space>gS","m":["n"],"d":"Git Stash","s":"config","f":"lua/keymaps.lua","l":122,"rhs":null,"nw":null,"cat":"Git","n":null,"e":null,"sl":"stash","ld":1},{"k":"<Space>gs","m":["n"],"d":"Git Status","s":"config","f":"lua/keymaps.lua","l":119,"rhs":null,"nw":null,"cat":"Git","n":null,"e":1,"sl":"status","ld":1},{"k":"<Space>gL","m":["n"],"d":"Git Log Line","s":"config","f":"lua/keymaps.lua","l":116,"rhs":null,"nw":null,"cat":"Git","n":"Git log of the current line","e":null,"sl":"line log","ld":1},{"k":"<Space>gl","m":["n"],"d":"Git Log","s":"config","f":"lua/keymaps.lua","l":113,"rhs":null,"nw":null,"cat":"Git","n":null,"e":null,"sl":"log","ld":1},{"k":"<Space>gb","m":["n"],"d":"Git Branches","s":"config","f":"lua/keymaps.lua","l":110,"rhs":null,"nw":null,"cat":"Git","n":null,"e":null,"sl":"branches","ld":1},{"k":"<Space>fr","m":["n"],"d":"Recent","s":"config","f":"lua/keymaps.lua","l":105,"rhs":null,"nw":null,"cat":"Find & pick","n":null,"e":1,"sl":"recent","ld":1},{"k":"<Space>fp","m":["n"],"d":"Projects","s":"config","f":"lua/keymaps.lua","l":102,"rhs":null,"nw":null,"cat":"Find & pick","n":null,"e":null,"sl":"projects","ld":1},{"k":"<Space>fg","m":["n"],"d":"Find Git Files","s":"config","f":"lua/keymaps.lua","l":99,"rhs":null,"nw":null,"cat":"Find & pick","n":"Only files tracked by git","e":null,"sl":"git files","ld":1},{"k":"<Space>ff","m":["n"],"d":"Find Files","s":"config","f":"lua/keymaps.lua","l":96,"rhs":null,"nw":null,"cat":"Find & pick","n":null,"e":1,"sl":"files","ld":1},{"k":"<Space>fc","m":["n"],"d":"Find Config File","s":"config","f":"lua/keymaps.lua","l":93,"rhs":null,"nw":null,"cat":"Files","n":"Files under <code>stdpath('config')<\/code> (~/.config/nvim)","e":null,"sl":"config","ld":1},{"k":"<Space>fb","m":["n"],"d":"Buffers","s":"config","f":"lua/keymaps.lua","l":90,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":null,"sl":"buffers","ld":1},{"k":"<Space>e","m":["n"],"d":"File Explorer","s":"config","f":"lua/keymaps.lua","l":85,"rhs":null,"nw":null,"cat":"Files","n":"Snacks file explorer (sidebar)","e":1,"sl":"explorer","ld":1},{"k":"<Space>:","m":["n"],"d":"Command History","s":"config","f":"lua/keymaps.lua","l":82,"rhs":null,"nw":null,"cat":"Command line","n":null,"e":null,"sl":"cmd hist","ld":1},{"k":"<Space>/","m":["n"],"d":"Grep","s":"config","f":"lua/keymaps.lua","l":79,"rhs":null,"nw":null,"cat":"Find & pick","n":"Live grep (ripgrep) from the current working directory, which auto-cd keeps at the project root","e":1,"sl":"grep","ld":1},{"k":"<Space>,","m":["n"],"d":"Buffers","s":"config","f":"lua/keymaps.lua","l":76,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":1,"sl":"buffers","ld":1},{"k":"<Space><Space>","m":["n"],"d":"Smart Find Files","s":"config","f":"lua/keymaps.lua","l":73,"rhs":null,"nw":null,"cat":"Find & pick","n":"Snacks smart picker: open buffers, recent files and project files ranked together (frecency)","e":1,"sl":"smart find","ld":1},{"k":"<Space>sr","m":["n"],"d":"Search and Replace","s":"config","f":"lua/keymaps.lua","l":63,"rhs":null,"nw":null,"cat":"Search","n":"Grug-far project-wide search &amp; replace, prefilled with the word under the cursor; <kbd>q<\/kbd> closes it","e":1,"sl":"replace","ld":1},{"k":"%","m":["n"],"d":"Jump to the matching bracket, if/else/endif or HTML tag","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":70,"rhs":"<Plug>(MatchitNormalForward)","nw":null,"cat":"Motion","n":null,"e":1,"sl":null,"rep":[{"m":"n","b":150},{"m":"n","b":151}]},{"k":"&","m":["n"],"d":"Repeat last :s on this line, keeping its flags (:&&)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":121,"rhs":":&&<CR>","nw":null,"cat":"Undo & repeat","n":null,"e":null,"sl":null,"t":"&-default","rep":[{"m":"n","b":152}],"hf":"change.txt"},{"k":",","m":["n","x","o"],"d":"Flash: repeat the last f/F/t/T in the opposite direction","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":null,"e":null,"sl":"ft rep←","rep":[{"m":"n","b":168},{"m":"x","b":168},{"m":"o","b":168}]},{"k":";","m":["n","x","o"],"d":"Flash: repeat the last f/F/t/T in the same direction","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":"Works any time later (not only while highlighted). After a yank (<code>yf.<\/code>) flash auto-hides its highlights.","e":1,"sl":"rep ft","rep":[{"m":"n","b":186},{"m":"x","b":186},{"m":"o","b":186}]},{"k":"C","m":["n","x"],"d":"Change to end of line; the old text goes to register d","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Edit","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":null,"sl":"C→\"d","rep":[{"m":"n","b":200},{"m":"x","b":607}]},{"k":"D","m":["n","x"],"d":"Delete to end of line into register d","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Edit","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":null,"sl":"D→\"d","rep":[{"m":"n","b":201},{"m":"x","b":608}]},{"k":"F","m":["n","x","o"],"d":"Flash: jump to the previous {char} on this line","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":"Right after <code>Fx<\/code>, <kbd>F<\/kbd> moves to the <em>right<\/em> and <kbd>f<\/kbd> keeps going left (flash's clever-f mapping: lowercase = next in the motion's direction).","e":1,"sl":"←find","rep":[{"m":"n","b":203},{"m":"x","b":203},{"m":"o","b":203}]},{"k":"K","m":["n"],"d":"Hover Documentation","s":"config","f":"lua/keymaps.lua","l":271,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Always LSP hover, in every buffer: no fallback to <code>'keywordprg'<\/code> (<code>:Man<\/code>, <code>:help<\/code>) when no LSP is attached","e":1,"sl":"hover","rep":[{"m":"n","b":208}]},{"k":"S","m":["n"],"d":"Leap from window: jump to a spot in another window (2 chars + label)","s":"config","f":"lua/keymaps.lua","l":353,"rhs":null,"nw":null,"cat":"Motion","n":"<code>&lt;Plug&gt;(leap-from-window)<\/code>, Normal mode only: targets every other focusable, non-floating window in the tab and moves you there. Replaces Vim's <kbd>S<\/kbd> (use <kbd>cc<\/kbd>). Visual <kbd>S<\/kbd> is unchanged.","e":1,"sl":"leap win","rep":[{"m":"n","b":215}]},{"k":"T","m":["n","x","o"],"d":"Flash: jump till after the previous {char} on this line","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":null,"e":null,"sl":"←till","rep":[{"m":"n","b":216},{"m":"x","b":216},{"m":"o","b":216}]},{"k":"X","m":["n","x"],"d":"Delete character(s) before the cursor into register d","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Edit","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":null,"sl":"X→\"d","rep":[{"m":"n","b":220},{"m":"x","b":618}]},{"k":"Y","m":["n"],"d":"Yank to end of line (y$)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":101,"rhs":"y$","nw":null,"cat":"Edit","n":null,"e":1,"sl":null,"t":"Y-default","rep":[{"m":"n","b":221}],"hf":"change.txt"},{"k":"[i","m":["n","x","o"],"d":"Jump to the start of the current scope; repeat for the enclosing one","s":"snacks","f":"lua/snacks/scope.lua","l":792,"rhs":null,"nw":null,"cat":"Motion","n":"Snacks scope, UI sessions only. Replaces Vim's <kbd>[i<\/kbd> (show the first line containing the keyword)","e":null,"sl":"scope↑","rep":[{"m":"n","b":437}]},{"k":"[%","m":["n"],"d":"To the previous unmatched group start (like [{ for if/endif)","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":78,"rhs":"<Plug>(MatchitNormalMultiBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"[[","m":["n"],"d":"Jump to the previous LSP reference of the word under the cursor (Snacks words)","s":"config","f":"lua/keymaps.lua","l":318,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":"prev ref","rep":[{"m":"n","b":432}]},{"k":"[<Space>","m":["n"],"d":"Add N empty lines above the cursor (stay in Normal)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":439,"rhs":null,"nw":null,"cat":"Edit","n":null,"e":null,"sl":null},{"k":"[B","m":["n"],"d":"First buffer, or buffer N (:brewind)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":422,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":null,"sl":null},{"k":"[b","m":["n"],"d":"Previous buffer (:bprevious)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":414,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":1,"sl":null},{"k":"[<C-T>","m":["n"],"d":"Previous matching tag in the preview window (:ptprevious)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":403,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"[T","m":["n"],"d":"First matching tag, or tag N (:trewind)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":389,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"[t","m":["n"],"d":"Previous matching tag (:tprevious)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":379,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"[A","m":["n"],"d":"First argument-list file, or file N (:rewind)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":362,"rhs":null,"nw":null,"cat":"Files","n":null,"e":null,"sl":null},{"k":"[a","m":["n"],"d":"Previous file in the argument list (:previous)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":353,"rhs":null,"nw":null,"cat":"Files","n":null,"e":null,"sl":null},{"k":"[<C-L>","m":["n"],"d":"Last entry in the previous file of the location list (:lpfile)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":344,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"[L","m":["n"],"d":"First location-list entry, or entry N (:lrewind)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":336,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"[l","m":["n"],"d":"Previous location-list entry (:lprevious)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":328,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"[<C-Q>","m":["n"],"d":"Last entry in the previous file of the quickfix list (:cpfile)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":319,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"[Q","m":["n"],"d":"First quickfix entry, or entry N (:crewind)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":311,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"[q","m":["n"],"d":"Previous quickfix entry (:cprevious)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":303,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":1,"sl":null},{"k":"[D","m":["n"],"d":"Jump to the first diagnostic in the current buffer","s":"neovim","f":"lua/vim/_core/defaults.lua","l":275,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null,"rep":[{"m":"n","b":429}]},{"k":"[d","m":["n"],"d":"Jump to the previous diagnostic in the current buffer","s":"neovim","f":"lua/vim/_core/defaults.lua","l":267,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":1,"sl":null,"rep":[{"m":"n","b":435}]},{"k":"]i","m":["n","x","o"],"d":"Jump to the end of the current scope","s":"snacks","f":"lua/snacks/scope.lua","l":792,"rhs":null,"nw":null,"cat":"Motion","n":"Snacks scope, UI sessions only. Replaces Vim's <kbd>]i<\/kbd> (show the next line containing the keyword)","e":null,"sl":"scope↓","rep":[{"m":"n","b":460}]},{"k":"]%","m":["n"],"d":"To the next unmatched group end (like ]} for if/endif)","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":79,"rhs":"<Plug>(MatchitNormalMultiForward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"]]","m":["n"],"d":"Jump to the next LSP reference of the word under the cursor (Snacks words)","s":"config","f":"lua/keymaps.lua","l":315,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"<code>Snacks.words.jump<\/code> (lua/keymaps.lua) over the LSP document highlights; sets a jumplist entry and opens folds. Replaces Vim's <code>]]<\/code> section motion in Normal mode; Markdown buffers override it with heading jumps.","e":1,"sl":"next ref","rep":[{"m":"n","b":456}]},{"k":"]<Space>","m":["n"],"d":"Add N empty lines below the cursor (stay in Normal)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":445,"rhs":null,"nw":null,"cat":"Edit","n":null,"e":null,"sl":null},{"k":"]B","m":["n"],"d":"Last buffer, or buffer N (:blast)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":430,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":null,"sl":null},{"k":"]b","m":["n"],"d":"Next buffer (:bnext)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":418,"rhs":null,"nw":null,"cat":"Buffer & tab","n":null,"e":1,"sl":null},{"k":"]<C-T>","m":["n"],"d":"Next matching tag in the preview window (:ptnext)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":408,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"]T","m":["n"],"d":"Last matching tag, or tag N (:tlast)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":394,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"]t","m":["n"],"d":"Next matching tag (:tnext)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":384,"rhs":null,"nw":null,"cat":"Tags","n":null,"e":null,"sl":null},{"k":"]A","m":["n"],"d":"Last argument-list file, or file N (:last)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":370,"rhs":null,"nw":null,"cat":"Files","n":null,"e":null,"sl":null},{"k":"]a","m":["n"],"d":"Next file in the argument list (:next)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":357,"rhs":null,"nw":null,"cat":"Files","n":null,"e":null,"sl":null},{"k":"]<C-L>","m":["n"],"d":"First entry in the next file of the location list (:lnfile)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":348,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"]L","m":["n"],"d":"Last location-list entry, or entry N (:llast)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":340,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"]l","m":["n"],"d":"Next location-list entry (:lnext)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":332,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"]<C-Q>","m":["n"],"d":"First entry in the next file of the quickfix list (:cnfile)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":323,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"]Q","m":["n"],"d":"Last quickfix entry, or entry N (:clast)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":315,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":null,"sl":null},{"k":"]q","m":["n"],"d":"Next quickfix entry (:cnext)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":307,"rhs":null,"nw":null,"cat":"Quickfix & lists","n":null,"e":1,"sl":null},{"k":"]D","m":["n"],"d":"Jump to the last diagnostic in the current buffer","s":"neovim","f":"lua/vim/_core/defaults.lua","l":271,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null,"rep":[{"m":"n","b":452}]},{"k":"]d","m":["n"],"d":"Jump to the next diagnostic in the current buffer","s":"neovim","f":"lua/vim/_core/defaults.lua","l":263,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":1,"sl":null,"rep":[{"m":"n","b":458}]},{"k":"c","m":["n","x"],"d":"Change {motion}; the old text goes to register d","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Operator","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":1,"sl":"chg→\"d","rep":[{"m":"n","b":240},{"m":"x","b":638}]},{"k":"d","m":["n","x"],"d":"Delete {motion} into register d (clipboard untouched)","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Operator","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":1,"sl":"del→\"d","rep":[{"m":"n","b":242},{"m":"x","b":639}]},{"k":"f","m":["n","x","o"],"d":"Flash: jump to the next {char} on this line","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":"flash.nvim char mode (lua/plugins.lua: <code>modes.char.multi_line = false<\/code>): never leaves the cursor line or wraps, no jump labels. All matches on the line light up and the window is dimmed until the cursor moves. Press <kbd>f<\/kbd> again for the next match. Each jump sets the <code>'<\/code> mark, so <kbd>`<\/kbd><kbd>`<\/kbd> jumps back (<kbd>Ctrl-O<\/kbd> can't: the jumplist keeps one entry per line). Inclusive with operators, like Vim.","e":1,"sl":"find→","rep":[{"m":"n","b":247},{"m":"x","b":247},{"m":"o","b":247}]},{"k":"g]","m":["n","x","o"],"d":"Move to the right edge of an a{id} textobject, e.g. g])","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Motion","n":"Replaces Vim's <code>g]<\/code> (<code>:tselect<\/code> on the tag under the cursor); use <code>:tselect<\/code> or <code>g&lt;C-]&gt;<\/code> instead.","e":null,"sl":"obj end","rep":[{"m":"n","b":498}]},{"k":"g[","m":["n","x","o"],"d":"Move to the left edge of an a{id} textobject, e.g. g[(","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Motion","n":null,"e":null,"sl":"obj start"},{"k":"g%","m":["n"],"d":"Jump backwards through the matching group","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":71,"rhs":"<Plug>(MatchitNormalBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"gao","m":["n"],"d":"C[a]lls Outgoing","s":"config","f":"lua/keymaps.lua","l":260,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Outgoing calls picker. Makes Vim's <kbd>ga<\/kbd> wait <code>'timeoutlen'<\/code>","e":null,"sl":"calls out"},{"k":"gai","m":["n"],"d":"C[a]lls Incoming","s":"config","f":"lua/keymaps.lua","l":257,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Incoming calls picker. Makes Vim's <kbd>ga<\/kbd> wait <code>'timeoutlen'<\/code>","e":null,"sl":"calls in"},{"k":"gy","m":["n"],"d":"Goto T[y]pe Definition","s":"config","f":"lua/keymaps.lua","l":254,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Snacks LSP picker (jumps directly when there is a single result). Needs an attached LSP server","e":null,"sl":"type def"},{"k":"gI","m":["n"],"d":"Goto Implementation","s":"config","f":"lua/keymaps.lua","l":251,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Snacks LSP picker (jumps directly when there is a single result). Needs an attached LSP server; replaces Vim's <kbd>gI<\/kbd> (insert at column 1, use <kbd>0i<\/kbd>)","e":null,"sl":"impl","rep":[{"m":"n","b":489}]},{"k":"gD","m":["n"],"d":"Goto Declaration","s":"config","f":"lua/keymaps.lua","l":244,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Snacks LSP picker (jumps directly when there is a single result). Needs an attached LSP server; replaces Vim's search-based <kbd>gD<\/kbd>","e":null,"sl":"declaration","rep":[{"m":"n","b":486}]},{"k":"gd","m":["n"],"d":"Goto Definition","s":"config","f":"lua/keymaps.lua","l":241,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Snacks LSP picker (jumps directly when there is a single result). Needs an attached LSP server; replaces Vim's search-based <kbd>gd<\/kbd>","e":1,"sl":"definition","rep":[{"m":"n","b":502}]},{"k":"gO","m":["n"],"d":"Document outline: LSP symbols (or help / man / markdown headings)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":228,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"grt","m":["n"],"d":"LSP: go to type definition","s":"neovim","f":"lua/vim/_core/defaults.lua","l":224,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"gri","m":["n"],"d":"LSP: go to implementation","s":"neovim","f":"lua/vim/_core/defaults.lua","l":220,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"grr","m":["n"],"d":"References","s":"config","f":"lua/keymaps.lua","l":248,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":"Snacks picker for LSP references; replaces Neovim's <kbd>grr<\/kbd> list. The other <kbd>gr<\/kbd>* defaults (<kbd>grn<\/kbd> <kbd>gra<\/kbd> <kbd>gri<\/kbd> <kbd>grt<\/kbd> <kbd>grx<\/kbd>) work as normal","e":1,"sl":"references"},{"k":"grx","m":["n"],"d":"LSP: run the code lens on this line","s":"neovim","f":"lua/vim/_core/defaults.lua","l":212,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"gra","m":["n"],"d":"LSP: code actions","s":"neovim","f":"lua/vim/_core/defaults.lua","l":208,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"grn","m":["n"],"d":"LSP: rename the symbol under the cursor","s":"neovim","f":"lua/vim/_core/defaults.lua","l":204,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"gcc","m":["n"],"d":"Toggle comment on the current line ([count] lines)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":188,"rhs":null,"nw":null,"cat":"Comment","n":null,"e":1,"sl":"comment ln"},{"k":"gc","m":["n"],"d":"Toggle comment over {motion}, e.g. gcip gcj gcap","s":"neovim","f":"lua/vim/_core/defaults.lua","l":183,"rhs":null,"nw":null,"cat":"Comment","n":"Neovim's built-in commenting, uses <code>'commentstring'<\/code> (treesitter-aware for injected languages).","e":1,"sl":"comment"},{"k":"gx","m":["n","x"],"d":"Open with gx.nvim","s":"config","f":"lua/keymaps.lua","l":358,"rhs":"<Cmd>Browse<CR>","nw":null,"cat":"Files","n":"gx.nvim's <code>:Browse<\/code>: URLs, files, plugin names → GitHub, <code>#123<\/code> issues, package.json deps, otherwise a web search. Works on a Visual selection too","e":1,"sl":"open","rep":[{"m":"n","b":523}]},{"k":"j","m":["n","x"],"d":"Down (display line)","s":"config","f":"lua/keymaps.lua","l":41,"rhs":null,"nw":null,"cat":"Motion","n":"Without a count moves by display (wrapped) line like <kbd>gj<\/kbd>/<kbd>gk<\/kbd>; with a count (<kbd>5j<\/kbd>, even <kbd>1j<\/kbd>) moves by real lines. Not mapped in Operator-pending mode, so <kbd>dj<\/kbd> stays linewise","e":1,"sl":"down","rep":[{"m":"n","b":251},{"m":"x","b":251}]},{"k":"k","m":["n","x"],"d":"Up (display line)","s":"config","f":"lua/keymaps.lua","l":41,"rhs":null,"nw":null,"cat":"Motion","n":"Without a count moves by display (wrapped) line like <kbd>gj<\/kbd>/<kbd>gk<\/kbd>; with a count (<kbd>5j<\/kbd>, even <kbd>1j<\/kbd>) moves by real lines. Not mapped in Operator-pending mode, so <kbd>dj<\/kbd> stays linewise","e":1,"sl":"up","rep":[{"m":"n","b":252},{"m":"x","b":252}]},{"k":"shn","m":["n"],"d":"Highlight next surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"hl next"},{"k":"shl","m":["n"],"d":"Highlight previous surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"hl prev"},{"k":"sh","m":["n"],"d":"Highlight surrounding for 500 ms: sh{char}","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr hl"},{"k":"sFn","m":["n","x","o"],"d":"Find next left surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"← next"},{"k":"sFl","m":["n","x","o"],"d":"Find previous left surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"← prev"},{"k":"sF","m":["n","x","o"],"d":"Find surrounding: move to its left part, sF{char}","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"← surr"},{"k":"sfn","m":["n","x","o"],"d":"Find next right surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"next →"},{"k":"sfl","m":["n","x","o"],"d":"Find previous right surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"prev →"},{"k":"sf","m":["n","x","o"],"d":"Find surrounding: move to its right part, sf{char}","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr →"},{"k":"srn","m":["n"],"d":"Replace next surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"repl next"},{"k":"srl","m":["n"],"d":"Replace previous surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"repl prev"},{"k":"sr","m":["n"],"d":"Replace surrounding: sr{old}{new}, e.g. sr)] sr'\"","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr repl"},{"k":"sdn","m":["n"],"d":"Delete next surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"del next"},{"k":"sdl","m":["n"],"d":"Delete previous surrounding","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"del prev"},{"k":"sd","m":["n"],"d":"Delete surrounding: sd{char}, e.g. sd\" sdf sdt","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr del"},{"k":"s","m":["n","x","o"],"d":"Disabled by mini.surround (it's the sa/sd/sr/sf/sh prefix); use cl","s":"mini.surround","f":"lua/mini/surround.lua","l":2274,"rhs":null,"nw":null,"cat":"Surround","n":"mini.surround maps a bare <code>s<\/code> to <code>&lt;Nop&gt;<\/code> in Normal, Visual and Operator-pending mode. Built-in <code>s<\/code> = <code>cl<\/code>; Visual <code>s<\/code> = <code>c<\/code>.","e":null,"sl":"surr…","rep":[{"m":"n","b":265},{"m":"x","b":666}]},{"k":"sa","m":["n"],"d":"Add surrounding: sa{motion}{char}, e.g. saiw)","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":null,"nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr add"},{"k":"t","m":["n","x","o"],"d":"Flash: jump till before the next {char} on this line","s":"flash","f":"lua/flash/plugins/char.lua","l":118,"rhs":null,"nw":null,"cat":"Motion","n":"Repeat with <kbd>t<\/kbd> (next) or <kbd>T<\/kbd> (opposite) while highlighted.","e":1,"sl":"till→","rep":[{"m":"n","b":266},{"m":"x","b":266},{"m":"o","b":266}]},{"k":"x","m":["n","x"],"d":"Delete character(s) under the cursor into register d","s":"config","f":"lua/keymaps.lua","l":25,"rhs":null,"nw":null,"cat":"Edit","n":"Remapped to <code>\"d{key}<\/code> (<code>lua/keymaps.lua:23-28<\/code>) so the system clipboard keeps your last yank. Paste deleted text with <kbd>\"dp<\/kbd>. A register you type first wins (<kbd>\"add<\/kbd>, <kbd>\"_dd<\/kbd>), except <kbd>\"+<\/kbd>, which looks like the default. Normal and Visual mode only","e":1,"sl":"x→\"d","rep":[{"m":"n","b":270},{"m":"x","b":669}]},{"k":"z,","m":["n"],"d":"Put the cursor line 30% from the top of the window","s":"focusline.nvim","f":"lua/focusline/init.lua","l":245,"rhs":null,"nw":null,"cat":"Scroll & view","n":"<code>z,<\/code> is not a Vim command; focusline adds it, so it only does the 30% repositioning.","e":null,"sl":"focus"},{"k":"zz","m":["n"],"d":"Scroll so the cursor line sits 30% from the top (not centred)","s":"focusline.nvim","f":"lua/focusline/init.lua","l":245,"rhs":null,"nw":null,"cat":"Scroll & view","n":"focusline.nvim (<code>focus_target = \"30%\"<\/code>) runs the real <code>zz<\/code>, then scrolls with <kbd>Ctrl-E<\/kbd>/<kbd>Ctrl-Y<\/kbd> to put the line at 30% of the window height. Near the top of the buffer it just shows line 1 at the top. Normal mode only: Visual <code>zz<\/code> still centres.","e":1,"sl":"focus","rep":[{"m":"n","b":583}]},{"k":"<C-I>","m":["n"],"d":"Jump Forward","s":"config","f":"lua/keymaps.lua","l":347,"rhs":"<Tab>","nw":null,"cat":"Mark & jump","n":"Mapped to itself so it stays jump forward where the terminal can tell it from <kbd>&lt;Tab&gt;<\/kbd> (<code>:h CTRL-I<\/code>)","e":null,"sl":"jump fwd","rep":[{"m":"n","b":119}]},{"k":"<C-/>","m":["n","t"],"d":"Toggle Terminal","s":"config","f":"lua/keymaps.lua","l":309,"rhs":null,"nw":null,"cat":"Terminal","n":"Toggle a Snacks floating terminal (Normal and Terminal mode). <kbd>&lt;C-_&gt;<\/kbd> is the same for terminals that send Ctrl+/ as Ctrl+_","e":1,"sl":"terminal"},{"k":"<Up>","m":["n","x"],"d":"Up (display line)","s":"config","f":"lua/keymaps.lua","l":41,"rhs":null,"nw":null,"cat":"Motion","n":"Without a count moves by display (wrapped) line like <kbd>gj<\/kbd>/<kbd>gk<\/kbd>; with a count (<kbd>5j<\/kbd>, even <kbd>1j<\/kbd>) moves by real lines. Not mapped in Operator-pending mode, so <kbd>dj<\/kbd> stays linewise","e":null,"sl":"up","rep":[{"m":"n","b":308},{"m":"x","b":308}]},{"k":"<Down>","m":["n","x"],"d":"Down (display line)","s":"config","f":"lua/keymaps.lua","l":41,"rhs":null,"nw":null,"cat":"Motion","n":"Without a count moves by display (wrapped) line like <kbd>gj<\/kbd>/<kbd>gk<\/kbd>; with a count (<kbd>5j<\/kbd>, even <kbd>1j<\/kbd>) moves by real lines. Not mapped in Operator-pending mode, so <kbd>dj<\/kbd> stays linewise","e":null,"sl":"down","rep":[{"m":"n","b":288},{"m":"x","b":288}]},{"k":"<C-W><C-D>","m":["n"],"d":"Show diagnostics under the cursor","s":"neovim","f":"lua/vim/_core/defaults.lua","l":283,"rhs":"<C-W>d","nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null,"rep":[{"m":"n","b":347}]},{"k":"<C-W>d","m":["n"],"d":"Show diagnostics under the cursor","s":"neovim","f":"lua/vim/_core/defaults.lua","l":279,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":1,"sl":null,"rep":[{"m":"n","b":388}]},{"k":"<C-L>","m":["n"],"d":"Clear search highlight, update diffs and redraw","s":"neovim","f":"lua/vim/_core/defaults.lua","l":106,"rhs":"<Cmd>nohlsearch|diffupdate|normal! <C-L><CR>","nw":null,"cat":"Search","n":null,"e":1,"sl":null,"t":"CTRL-L-default","rep":[{"m":"n","b":123}],"hf":"various.txt"},{"k":"#","m":["x"],"d":"Search backward for the selected text","s":"neovim","f":"lua/vim/_core/defaults.lua","l":95,"rhs":null,"nw":null,"cat":"Search","n":null,"e":null,"sl":null,"t":"v_#-default","rep":[{"m":"x","b":148}],"hf":"pattern.txt"},{"k":"%","m":["x"],"d":"Extend the selection to the matching pair","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":72,"rhs":"<Plug>(MatchitVisualForward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null,"rep":[{"m":"x","b":150},{"m":"x","b":151}]},{"k":"*","m":["x"],"d":"Search forward for the selected text","s":"neovim","f":"lua/vim/_core/defaults.lua","l":92,"rhs":null,"nw":null,"cat":"Search","n":null,"e":1,"sl":null,"t":"v_star-default","rep":[{"m":"x","b":165}],"hf":"pattern.txt"},{"k":"@","m":["x"],"d":"Linewise Visual: run macro {reg} on every selected line","s":"neovim","f":"lua/vim/_core/defaults.lua","l":133,"rhs":"mode() ==# 'V' ? ':normal! @'.getcharstr().'<CR>' : '@'","nw":null,"cat":"Register & macro","n":"Only in linewise Visual (<kbd>V<\/kbd>); otherwise plain <kbd>@<\/kbd>","e":null,"sl":null,"t":"v_@-default","hf":"repeat.txt"},{"k":"Q","m":["x"],"d":"Linewise Visual: replay the last recorded macro on every line","s":"neovim","f":"lua/vim/_core/defaults.lua","l":127,"rhs":"mode() ==# 'V' ? ':normal! @<C-R>=reg_recorded()<CR><CR>' : 'Q'","nw":null,"cat":"Register & macro","n":null,"e":null,"sl":null,"t":"v_Q-default","hf":"repeat.txt"},{"k":"[%","m":["x"],"d":"Extend to the previous unmatched group start","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":80,"rhs":"<Plug>(MatchitVisualMultiBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"[N","m":["x"],"d":"Extend the selection over the previous treesitter node","s":"neovim","f":"lua/vim/_core/defaults.lua","l":462,"rhs":null,"nw":null,"cat":"Visual","n":null,"e":null,"sl":"←node+"},{"k":"[n","m":["x"],"d":"Select the previous treesitter node (replaces the selection)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":454,"rhs":null,"nw":null,"cat":"Visual","n":null,"e":null,"sl":"←node"},{"k":"]%","m":["x"],"d":"Extend to the next unmatched group end","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":81,"rhs":"<Plug>(MatchitVisualMultiForward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"]N","m":["x"],"d":"Extend the selection over the next treesitter node","s":"neovim","f":"lua/vim/_core/defaults.lua","l":466,"rhs":null,"nw":null,"cat":"Visual","n":null,"e":null,"sl":"node+→"},{"k":"]n","m":["x"],"d":"Select the next treesitter node (replaces the selection)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":458,"rhs":null,"nw":null,"cat":"Visual","n":"Neovim 0.12 incremental selection. Its <code>an<\/code>/<code>in<\/code> (parent/child) are shadowed by mini.ai here.","e":null,"sl":"node→"},{"k":"al","m":["x","o"],"d":"Around last textobject","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"a last"},{"k":"aN","m":["x","o"],"d":"Around next textobject","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"a next"},{"k":"a","m":["x","o"],"d":"Around textobject: a + id (mini.ai), e.g. af aa aq ab a)","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":"Waits for one id character (reminder after 1 s). Search method <code>cover_or_next<\/code> within <code>n_lines = 50<\/code>: the textobject covering the cursor, else the next one (first on the cursor line). Unknown letters fall back to Vim's built-ins (<code>aw<\/code>, <code>ap<\/code>, …).","e":1,"sl":"around"},{"k":"ai","m":["x","o"],"d":"Full scope: the indented block plus its header and closing lines","s":"snacks","f":"lua/snacks/scope.lua","l":785,"rhs":null,"nw":null,"cat":"Text object","n":"Tested: inside an <code>if<\/code> body, <kbd>yai<\/kbd> yanks <code>if … end<\/code>; from the function body it takes the whole function","e":null,"sl":"a scope"},{"k":"a%","m":["x"],"d":"Select the enclosing group, from its opener to the first char of the closer","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":86,"rhs":"<Plug>(MatchitVisualTextObject)","nw":null,"cat":"Text object","n":"Visual mode only. Per matchit's docs only the first character of the closing word is selected (<code>va%d<\/code> on an <code>if … end<\/code> block leaves <code>nd<\/code>), and a [count] is ignored. In Operator-pending mode <code>a%<\/code> is mini.ai's separator textobject instead.","e":null,"sl":"a match"},{"k":"an","m":["x"],"d":"Select the parent (outer) node: treesitter, or LSP selection range","s":"neovim","f":"lua/vim/_core/defaults.lua","l":470,"rhs":null,"nw":null,"cat":"Visual","n":"Repeat to keep growing the selection. mini.ai's \"next\" objects moved to <kbd>aN<\/kbd>/<kbd>iN<\/kbd> so this stays reachable","e":null,"sl":"parent node"},{"k":"g%","m":["x"],"d":"Extend the selection backwards through the matching group","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":73,"rhs":"<Plug>(MatchitVisualBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"gra","m":["x"],"d":"LSP: code actions for the selection","s":"neovim","f":"lua/vim/_core/defaults.lua","l":208,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"gc","m":["x"],"d":"Toggle comment on the selected lines","s":"neovim","f":"lua/vim/_core/defaults.lua","l":183,"rhs":null,"nw":null,"cat":"Comment","n":null,"e":null,"sl":"comment"},{"k":"il","m":["x","o"],"d":"Inside last textobject","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"i last"},{"k":"iN","m":["x","o"],"d":"Inside next textobject","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"i next"},{"k":"i","m":["x","o"],"d":"Inside textobject: i + id (mini.ai), e.g. if ia iq ib i) ig","s":"mini.ai","f":"lua/mini/ai.lua","l":2100,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":1,"sl":"inside"},{"k":"ii","m":["x","o"],"d":"Inner scope: the indented block around the cursor, without its header/footer","s":"snacks","f":"lua/snacks/scope.lua","l":785,"rhs":null,"nw":null,"cat":"Text object","n":"Snacks scope (loaded on UIEnter, so the headless key dump misses it). Tested: inside an <code>if<\/code> body, <kbd>yii<\/kbd> yanks the body lines","e":null,"sl":"in scope"},{"k":"in","m":["x"],"d":"Select the child (inner) node: treesitter, or LSP selection range","s":"neovim","f":"lua/vim/_core/defaults.lua","l":478,"rhs":null,"nw":null,"cat":"Visual","n":null,"e":null,"sl":"child node"},{"k":"sa","m":["x"],"d":"Add surrounding to the selection: sa{char}","s":"mini.surround","f":"lua/mini/surround.lua","l":2272,"rhs":":<C-U>lua MiniSurround.add(\"visual\")<CR>","nw":null,"cat":"Surround","n":null,"e":null,"sl":"surr add"},{"k":"<Tab>","m":["s"],"d":"Jump to the next snippet placeholder, else <Tab>","s":"neovim","f":"lua/vim/_core/defaults.lua","l":241,"rhs":null,"nw":null,"cat":"Completion & AI","n":null,"e":null,"sl":null},{"k":"<S-Tab>","m":["s","i"],"d":"Jump to the previous snippet placeholder","s":"neovim","f":"lua/vim/_core/defaults.lua","l":241,"rhs":null,"nw":null,"cat":"Completion & AI","n":null,"e":null,"sl":null},{"k":"<C-S>","m":["s","i"],"d":"LSP: show signature help","s":"neovim","f":"lua/vim/_core/defaults.lua","l":232,"rhs":null,"nw":null,"cat":"LSP & diagnostics","n":null,"e":null,"sl":null},{"k":"%","m":["o"],"d":"Up to the matching pair (d%, y%)","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":74,"rhs":"<Plug>(MatchitOperationForward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null,"rep":[{"m":"o","b":150},{"m":"o","b":151}]},{"k":"[%","m":["o"],"d":"To the previous unmatched group start","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":82,"rhs":"<Plug>(MatchitOperationMultiBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"]%","m":["o"],"d":"To the next unmatched group end","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":83,"rhs":"<Plug>(MatchitOperationMultiForward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"an","m":["o"],"d":"Operate on the parent (outer) node","s":"neovim","f":"lua/vim/_core/defaults.lua","l":470,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"parent node"},{"k":"g%","m":["o"],"d":"Backwards through the matching group","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","l":75,"rhs":"<Plug>(MatchitOperationBackward)","nw":null,"cat":"Motion","n":null,"e":null,"sl":null},{"k":"gc","m":["o"],"d":"Comment block textobject: contiguous commented lines (gcgc, dgc)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":193,"rhs":null,"nw":null,"cat":"Comment","n":null,"e":null,"sl":"cmt obj"},{"k":"in","m":["o"],"d":"Operate on the child (inner) node","s":"neovim","f":"lua/vim/_core/defaults.lua","l":478,"rhs":null,"nw":null,"cat":"Text object","n":null,"e":null,"sl":"child node"},{"k":"<BS>","m":["i"],"d":"Backspace; inside an empty pair (), [], {}, \"\", '', `` delete both","s":"mini.pairs","f":"lua/mini/pairs.lua","l":641,"rhs":"v:lua.MiniPairs.bs()","nw":null,"cat":"Pairs","n":null,"e":null,"sl":"⌫ pair","rep":[{"m":"i","b":13},{"m":"i","b":102}]},{"k":"<Up>","m":["i"],"d":"Up (display line)","s":"config","f":"lua/keymaps.lua","l":49,"rhs":null,"nw":null,"cat":"Insert","n":"Moves by display line in Insert mode (<code>normal! gj<\/code>/<code>gk<\/code>); the native popup menu and blink.cmp's menu keep their own arrow keys","e":null,"sl":"up","rep":[{"m":"i","b":58},{"m":"i","b":104}]},{"k":"<Down>","m":["i"],"d":"Down (display line)","s":"config","f":"lua/keymaps.lua","l":49,"rhs":null,"nw":null,"cat":"Insert","n":"Moves by display line in Insert mode (<code>normal! gj<\/code>/<code>gk<\/code>); the native popup menu and blink.cmp's menu keep their own arrow keys","e":null,"sl":"down","rep":[{"m":"i","b":60},{"m":"i","b":105}]},{"k":"<C-W>","m":["i"],"d":"Delete the word before the cursor (undo point first)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":114,"rhs":"<C-G>u<C-W>","nw":null,"cat":"Insert","n":null,"e":null,"sl":null,"t":"i_CTRL-W-default","rep":[{"m":"i","b":37}],"hf":"insert.txt"},{"k":"<C-U>","m":["i"],"d":"Delete text before the cursor on this line (undo point first)","s":"neovim","f":"lua/vim/_core/defaults.lua","l":113,"rhs":"<C-G>u<C-U>","nw":null,"cat":"Insert","n":null,"e":null,"sl":null,"t":"i_CTRL-U-default","rep":[{"m":"i","b":33}],"hf":"insert.txt"},{"k":"<Tab>","m":["i"],"d":"Jump to the next snippet placeholder, else insert <Tab>","s":"neovim","f":"lua/vim/_core/defaults.lua","l":241,"rhs":null,"nw":null,"cat":"Completion & AI","n":null,"e":null,"sl":null,"rep":[{"m":"i","b":16}]},{"k":"<CR>","m":["i"],"d":"Newline; between (), [] or {} put the closer on its own line","s":"mini.pairs","f":"lua/mini/pairs.lua","l":641,"rhs":"v:lua.MiniPairs.cr()","nw":null,"cat":"Pairs","n":null,"e":null,"sl":"⏎ pair","rep":[{"m":"i","b":21},{"m":"i","b":101}]},{"k":"\"","m":["i"],"d":"Smart quote: step over a \" right after the cursor, else pair if allowed","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":"Pairs only when the rest of the line is blank or starts with <code>)<\/code> <code>]<\/code> <code>}<\/code>, and not after a letter, digit, backslash or another <code>\"<\/code>.","e":null,"sl":"\" \""},{"k":"'","m":["i"],"d":"Smart quote: step over a ' right after the cursor, else pair if allowed","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":"Never pairs after a letter or digit, so <code>don't<\/code> and <code>it's<\/code> type normally.","e":null,"sl":"' '"},{"k":"(","m":["i"],"d":"Smart pair (): only if the rest of the line is blank or starts with ) ] }","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":"lua/smart_pairs.lua gates mini.pairs: never after <code>\\<\/code>; otherwise types just <code>(<\/code>. Disable all pairing with <code>vim.g.minipairs_disable<\/code> or <code>vim.b.minipairs_disable<\/code>.","e":1,"sl":"( )"},{"k":")","m":["i"],"d":"Close (): step over a ) right after the cursor, else type it","s":"mini.pairs","f":"lua/mini/pairs.lua","l":205,"rhs":"v:lua.MiniPairs.close(\"()\", \"^[^\\\\]\")","nw":null,"cat":"Pairs","n":null,"e":null,"sl":")"},{"k":"[","m":["i"],"d":"Smart pair []: only if the rest of the line is blank or starts with ) ] }","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":null,"e":null,"sl":"[ ]"},{"k":"]","m":["i"],"d":"Close []: step over a ] right after the cursor, else type it","s":"mini.pairs","f":"lua/mini/pairs.lua","l":205,"rhs":"v:lua.MiniPairs.close(\"[]\", \"^[^\\\\]\")","nw":null,"cat":"Pairs","n":null,"e":null,"sl":"]"},{"k":"`","m":["i"],"d":"Smart backtick: step over a ` right after the cursor, else pair if allowed","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":null,"e":null,"sl":"` `"},{"k":"{","m":["i"],"d":"Smart pair {}: only if the rest of the line is blank or starts with ) ] }","s":"config","f":"lua/smart_pairs.lua","l":194,"rhs":null,"nw":null,"cat":"Pairs","n":null,"e":null,"sl":"{ }"},{"k":"}","m":["i"],"d":"Close {}: step over a } right after the cursor, else type it","s":"mini.pairs","f":"lua/mini/pairs.lua","l":205,"rhs":"v:lua.MiniPairs.close(\"{}\", \"^[^\\\\]\")","nw":null,"cat":"Pairs","n":null,"e":null,"sl":"}"},{"k":"[[","m":["n"],"d":"Jump to the previous Markdown heading (treesitter)","s":"ftplugin","f":"ftplugin/markdown.lua","l":10,"rhs":null,"nw":null,"cat":"Motion","n":null,"e":null,"sl":"prev hdg","ctx":"markdown buffers","rep":[{"m":"n","b":432}]},{"k":"]]","m":["n"],"d":"Jump to the next Markdown heading (treesitter)","s":"ftplugin","f":"ftplugin/markdown.lua","l":7,"rhs":null,"nw":null,"cat":"Motion","n":"From <code>$VIMRUNTIME/ftplugin/markdown.lua<\/code>; buffer-local, so it beats the global Snacks words <code>]]<\/code>.","e":null,"sl":"next hdg","ctx":"markdown buffers","rep":[{"m":"n","b":456}]},{"k":"gO","m":["n"],"d":"Outline of the Markdown headings","s":"ftplugin","f":"ftplugin/markdown.lua","l":3,"rhs":null,"nw":null,"cat":"Notes","n":null,"e":null,"sl":null,"ctx":"markdown buffers"},{"k":"[[","m":["x"],"d":"Extend the selection to the previous Markdown heading","s":"ftplugin","f":"ftplugin/markdown.vim","l":33,"rhs":":<C-U>exe \"normal! gv\"|call search('\\%(^#\\{1,5\\}\\s\\+\\S\\|^\\S.*\\n^[=-]\\+$\\)', \"bsW\")<CR>","nw":null,"cat":"Motion","n":null,"e":null,"sl":"prev hdg","ctx":"markdown buffers","rep":[{"m":"x","b":432}]},{"k":"]]","m":["x"],"d":"Extend the selection to the next Markdown heading","s":"ftplugin","f":"ftplugin/markdown.vim","l":34,"rhs":":<C-U>exe \"normal! gv\"|call search('\\%(^#\\{1,5\\}\\s\\+\\S\\|^\\S.*\\n^[=-]\\+$\\)', \"sW\")<CR>","nw":null,"cat":"Motion","n":null,"e":null,"sl":"next hdg","ctx":"markdown buffers","rep":[{"m":"x","b":456}]},{"k":"<BS>","m":["i"],"d":"Markdown backspace: shrink an untouched fence pair, else mini.pairs <BS>","s":"config","f":"lua/smart_pairs.lua","l":168,"rhs":null,"nw":null,"cat":"Pairs","n":null,"e":null,"sl":"fence ⌫","ctx":"markdown buffers","rep":[{"m":"i","b":13},{"m":"i","b":102}]},{"k":"`","m":["i"],"d":"Markdown backtick: the 3rd ` on a blank line opens a ``` fence pair","s":"config","f":"lua/smart_pairs.lua","l":158,"rhs":null,"nw":null,"cat":"Pairs","n":"More backticks lengthen both fences; otherwise behaves like the smart backtick pair.","e":null,"sl":"```","ctx":"markdown buffers"},{"k":"~","m":["i"],"d":"Markdown tilde: the 3rd ~ on a blank line opens a ~~~ fence pair","s":"config","f":"lua/smart_pairs.lua","l":162,"rhs":null,"nw":null,"cat":"Pairs","n":null,"e":null,"sl":"~~~","ctx":"markdown buffers"}],"curated":[{"k":"<C-\\><C-N>","m":["t"],"d":"Leave Terminal mode for Normal mode (scroll, search, yank output)","s":"builtin","cat":"Terminal","h":"CTRL-\\_CTRL-N","e":1,"n":"Every key except <kbd>&lt;C-\\&gt;<\/kbd> goes to the job. Snacks terminals also accept a quick double <kbd>&lt;Esc&gt;<\/kbd>","hf":"intro.txt"},{"k":"<C-\\><C-O>","m":["t"],"d":"Run one Normal-mode command, then return to Terminal mode","s":"builtin","cat":"Terminal","h":"t_CTRL-\\_CTRL-O","hf":"terminal.txt"},{"k":"<C-\\>{char}","m":["t"],"d":"Send {char} to the job (the <C-\\> itself is not sent)","s":"builtin","cat":"Terminal","h":"terminal-input","n":"Only <kbd>&lt;C-n&gt;<\/kbd> and <kbd>&lt;C-o&gt;<\/kbd> after <kbd>&lt;C-\\&gt;<\/kbd> are handled by Neovim; <kbd>&lt;C-\\&gt;&lt;C-\\&gt;<\/kbd> sends one <kbd>&lt;C-\\&gt;<\/kbd>","hf":"terminal.txt"},{"k":"i","m":["n"],"d":"Enter Terminal mode (keys go to the shell / job)","s":"builtin","cat":"Terminal","ctx":"terminal buffers","h":"terminal-input","e":1,"n":"<kbd>a<\/kbd>, <kbd>I<\/kbd>, <kbd>A<\/kbd> and <code>:startinsert<\/code> do the same. Snacks terminals re-enter Terminal mode automatically when you switch back to them","hf":"terminal.txt"},{"k":"a","m":["n"],"d":"Enter Terminal mode (same as i)","s":"builtin","cat":"Terminal","ctx":"terminal buffers","h":"terminal-input","hf":"terminal.txt"},{"k":"[[","m":["n","x","o"],"d":"Jump to the previous shell prompt","s":"neovim","cat":"Terminal","ctx":"terminal buffers","h":"terminal-config","n":"Neovim 0.12 buffer-local default; needs a shell that emits OSC 133 prompt marks. In Normal mode it wins over this config's global <kbd>[[<\/kbd>/<kbd>]]<\/kbd> (Snacks words)","hf":"terminal.txt"},{"k":"]]","m":["n","x","o"],"d":"Jump to the next shell prompt","s":"neovim","cat":"Terminal","ctx":"terminal buffers","h":"terminal-config","hf":"terminal.txt"},{"k":"<Esc><Esc>","m":["t"],"d":"Leave Terminal mode (two quick presses, within 200 ms)","s":"snacks","cat":"Terminal","ctx":"Snacks terminal","e":1,"n":"A single <kbd>&lt;Esc&gt;<\/kbd> is still sent to the program (e.g. to leave vi-mode in the shell)"},{"k":"<C-/>","m":["t"],"d":"Hide the terminal window (job keeps running)","s":"snacks","cat":"Terminal","ctx":"Snacks terminal","n":"Set in lua/plugins.lua (Snacks terminal win keys). From Normal mode the global <kbd>&lt;C-/&gt;<\/kbd> toggles it back; <kbd>2&lt;C-/&gt;<\/kbd> opens a second terminal"},{"k":"q","m":["n"],"d":"Hide the terminal window","s":"snacks","cat":"Terminal","ctx":"Snacks terminal"},{"k":"gf","m":["n"],"d":"Hide the terminal and edit the file name under the cursor","s":"snacks","cat":"Terminal","ctx":"Snacks terminal"},{"k":"{char}","m":["s"],"d":"Typing replaces the selection and starts Insert mode","s":"builtin","cat":"Visual","h":"Select-mode","e":1,"n":"Select mode is where snippet placeholders land. <b>Caveat:<\/b> this config maps d/D/c/C/x/X with <code>{\"n\",\"v\"}<\/code>, which includes Select mode, so typing those letters over a placeholder deletes it instead of replacing it","hf":"visual.txt"},{"k":"<C-G>","m":["s"],"d":"Switch from Select to Visual mode","s":"builtin","cat":"Visual","h":"v_CTRL-G","hf":"visual.txt"},{"k":"<C-O>","m":["s"],"d":"Switch to Visual mode for one command","s":"builtin","cat":"Visual","h":"v_CTRL-O","hf":"visual.txt"},{"k":"<C-R>{register}","m":["s"],"d":"Pick the register that receives the replaced text","s":"builtin","cat":"Visual","h":"v_CTRL-R","hf":"visual.txt"},{"k":"<BS>","m":["s"],"d":"Delete the selection","s":"builtin","cat":"Visual","h":"v_<BS>","hf":"change.txt"},{"k":"<Esc>","m":["s"],"d":"Stop Select mode","s":"builtin","cat":"Visual","h":"Select-mode","hf":"visual.txt"},{"k":"<C-R><C-W>","m":["c"],"d":"Insert the word under the cursor","s":"builtin","cat":"Command line","h":"c_CTRL-R_CTRL-W","e":1,"hf":"cmdline.txt"},{"k":"<C-R><C-A>","m":["c"],"d":"Insert the WORD under the cursor","s":"builtin","cat":"Command line","h":"c_CTRL-R_CTRL-A","hf":"cmdline.txt"},{"k":"<C-R><C-L>","m":["c"],"d":"Insert the line under the cursor","s":"builtin","cat":"Command line","h":"c_CTRL-R_CTRL-L","hf":"cmdline.txt"},{"k":"<C-R><C-F>","m":["c"],"d":"Insert the file name under the cursor","s":"builtin","cat":"Command line","h":"c_CTRL-R_CTRL-F","hf":"cmdline.txt"},{"k":"ZR","m":["n"],"d":"Restart Neovim and restore the session (:restart)","s":"builtin","cat":"Session","h":"ZR","n":"With a count 1-8 the session is not restored; 9 also skips the unsaved-changes check","hf":"editing.txt"},{"k":"<C-S-v>","m":["n"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"paste","d":"Paste the system clipboard (an empty line is replaced by the paste)","n":"On an empty line the clipboard lines replace it and the cursor goes to the end of the paste; otherwise runs <code>\"+]p<\/code> (put after, indent adjusted). <code>lua/options.lua:203<\/code>"},{"k":"<C-S-v>","m":["i","c"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"paste","d":"Paste the system clipboard (<C-R>+)","n":"<code>lua/options.lua:222-223<\/code>"},{"k":"<C-S-v>","m":["x","s"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"paste","d":"Replace the selection with the system clipboard","n":"<code>\"+p<\/code>, <code>lua/options.lua:224<\/code>"},{"k":"<C-S-v>","m":["t"],"s":"config","cat":"Terminal","ctx":"Neovide only","sl":"paste","d":"Paste the system clipboard into the terminal","n":"<code>&lt;C-\\&gt;&lt;C-n&gt;\"+pi<\/code>, <code>lua/options.lua:225<\/code>"},{"k":"<C-S-c>","m":["x","s"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"copy","d":"Copy the selection to the system clipboard","n":"<code>lua/options.lua:231<\/code>"},{"k":"<C-S-c>","m":["n"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"copy line","d":"Copy the current line to the system clipboard","n":"<code>lua/options.lua:233<\/code>"},{"k":"<C-S-x>","m":["x","s"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"cut","d":"Cut the selection to the system clipboard","n":"Uses <code>\"+d<\/code> without remapping, so unlike <kbd>d<\/kbd> it really fills the clipboard. <code>lua/options.lua:239<\/code>"},{"k":"<C-S-x>","m":["n"],"s":"config","cat":"Register & macro","ctx":"Neovide only","sl":"cut line","d":"Cut the current line to the system clipboard","n":"<code>lua/options.lua:241<\/code>"},{"k":"<C-_>","m":["n","t"],"s":"config","cat":"Terminal","sl":"terminal","d":"Toggle the Snacks terminal (alias of <C-/>)","n":"For terminals that encode Ctrl+/ as Ctrl+_ (no CSI u). Hidden from which-key (<code>which_key_ignore<\/code>), <code>lua/keymaps.lua:312<\/code>"},{"k":"q","m":["n"],"s":"config","cat":"Search","ctx":"Grug-far buffer","sl":"close","d":"Close the Grug-far window","n":"Buffer-local, replaces macro recording there. <code>lua/options.lua:127-133<\/code>"},{"k":"`.","m":["n","x","o"],"s":"builtin","cat":"Mark & jump","h":"'.","d":"Jump to where the last change was made (<kbd>'.<\/kbd> for its line)","n":"For older changes use <kbd>g;<\/kbd> / <kbd>g,<\/kbd>","hf":"motion.txt"},{"k":"`^","m":["n","x","o"],"s":"builtin","cat":"Mark & jump","h":"'^","d":"Jump to where Insert mode was last stopped (<kbd>gi<\/kbd> also re-enters Insert)","hf":"motion.txt"},{"k":"`\"","m":["n","x","o"],"s":"builtin","cat":"Mark & jump","h":"'quote","d":"Jump to the cursor position when this buffer was last exited","n":"This config jumps there automatically when a file is opened (<code>lua/options.lua:82-91<\/code>)","hf":"motion.txt"},{"k":"`0","m":["n","x","o"],"s":"builtin","cat":"Mark & jump","h":"'0","d":"Jump to where you were when Neovim last exited ('1 the time before, …)","n":"Numbered marks come from the ShaDa file and can't be set by hand","hf":"motion.txt"},{"k":"\"{1-9}","m":["n"],"s":"builtin","cat":"Register & macro","h":"quote_number","d":"Last nine deletes of a line or more, newest in \"1 (still filled in this config)","n":"Tested: <kbd>dd<\/kbd> fills both <code>\"d<\/code> and <code>\"1<\/code>, and the next <kbd>dd<\/kbd> shifts the old text to <code>\"2<\/code>","hf":"change.txt"},{"k":"\"-","m":["n"],"s":"builtin","cat":"Register & macro","h":"quote_-","d":"Small-delete register: stays empty here because d/c/x always name register d","n":"Vim skips <code>\"-<\/code> when a register is given; tested: <kbd>dw<\/kbd> fills <code>\"d<\/code>, not <code>\"-<\/code>","hf":"change.txt"},{"k":"\".","m":["n"],"s":"builtin","cat":"Register & macro","h":"quote_.","d":"Last inserted text (read-only): \".p puts it again","n":"Read-only registers <code>\".<\/code> <code>\"%<\/code> <code>\":<\/code> work with <kbd>p<\/kbd>, <kbd>P<\/kbd>, <code>:put<\/code> and <kbd>&lt;C-r&gt;<\/kbd>","hf":"change.txt"},{"k":"\"%","m":["n"],"s":"builtin","cat":"Register & macro","h":"quote_%","d":"Name of the current file (read-only): \"%p, or <C-r>% in Insert mode","hf":"change.txt"},{"k":"\"=","m":["n"],"s":"builtin","cat":"Register & macro","h":"quote_=","d":"Expression register: \"=5*7<CR>p puts 35; <C-r>=… inserts a result in Insert mode","hf":"change.txt"},{"k":"<CR>","m":["i"],"s":"builtin","cat":"Command line","h":"cmdwin","ctx":"Command-line window (q: q/ <C-f>)","d":"Run the line under the cursor (Normal-mode Enter is Leap here, so press i first)","n":"Tested: <kbd>q:<\/kbd> <kbd>i<\/kbd> <code>let g:x=3<\/code> <kbd>&lt;CR&gt;<\/kbd> runs it","hf":"cmdline.txt"},{"k":"<C-C>","m":["n","i"],"s":"builtin","cat":"Command line","h":"cmdwin","ctx":"Command-line window (q: q/ <C-f>)","d":"Put the line under the cursor on the command line without running it","n":"Edit further, then <kbd>&lt;CR&gt;<\/kbd> runs it from the normal command line (tested)","hf":"cmdline.txt"},{"k":":q","m":[":"],"s":"builtin","cat":"Command line","h":"cmdwin","ctx":"Command-line window (q: q/ <C-f>)","d":"Close the command-line window without running anything (<C-w>c also works)","hf":"cmdline.txt"},{"k":"<C-W><CR>","m":["n"],"s":"builtin","cat":"Quickfix & lists","h":"CTRL-W_<CR>","ctx":"Quickfix / location-list window","d":"Open the entry under the cursor in a new split","n":"Works even though plain <kbd>&lt;CR&gt;<\/kbd> is Leap here (tested: opens the file at the entry's line)","hf":"quickfix.txt"},{"k":"<C-V>{motion}$A{text}<Esc>","m":["n"],"s":"builtin","cat":"Visual","h":"v_b_A","d":"Append {text} at the end of every selected line, even ragged ones","n":"Without <kbd>$<\/kbd>, <kbd>A<\/kbd> appends at the block's right edge instead. Tested: <code>a / bbb / cc<\/code> + <kbd>&lt;C-v&gt;jj$AX&lt;Esc&gt;<\/kbd> → <code>aX / bbbX / ccX<\/code>","hf":"visual.txt"},{"k":"<C-X><C-N>","m":["i"],"s":"builtin","cat":"Completion & AI","h":"i_CTRL-X_CTRL-N","ctx":"This config (blink.cmp)","d":"Built-in keyword completion through CTRL-X (plain <C-n>/<C-p> open blink's menu)","n":"Tested with blink active: <kbd>&lt;C-x&gt;&lt;C-n&gt;<\/kbd>, <kbd>&lt;C-x&gt;&lt;C-p&gt;<\/kbd>, <kbd>&lt;C-x&gt;&lt;C-l&gt;<\/kbd> (lines) and <kbd>&lt;C-x&gt;&lt;C-f&gt;<\/kbd> (file names) complete","hf":"insert.txt"},{"k":":lua vim.pack.update()","m":[":"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","d":"Fetch plugin updates and review them in a confirmation tab before applying","n":"<code>vim.pack.update(nil, { offline = true })<\/code> just lists installed plugins. Plugins on disk but not added (here: <code>cord.nvim<\/code>, <code>git-blame<\/code>, <code>nvim-treesitter<\/code>) show as \"(not active)\"","hf":"pack.txt"},{"k":":w","m":[":"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","ctx":"vim.pack update tab","d":"Apply the listed updates","hf":"pack.txt"},{"k":":q","m":[":"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","ctx":"vim.pack update tab","d":"Discard the updates and close the tab","hf":"pack.txt"},{"k":"]]","m":["n","x"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","ctx":"vim.pack update tab","d":"Next plugin section ([[ for the previous one)","n":"Buffer-local (<code>ftplugin/nvim-pack.lua<\/code>), so it wins over this config's Snacks reference jump","hf":"pack.txt"},{"k":"K","m":["n"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","ctx":"vim.pack update tab","d":"Details of the pending change or newer tag under the cursor (LSP hover)","hf":"pack.txt"},{"k":"gra","m":["n"],"s":"neovim","cat":"Misc","h":"vim.pack.update()","ctx":"vim.pack update tab","d":"Plugin actions: update, skip updating, or delete a plugin that isn't active","n":"Neovim's code-action key (<kbd>&lt;leader&gt;ca<\/kbd> works too). Tested: on <code>cord.nvim<\/code> the actions are Update / Skip updating / Delete","hf":"pack.txt"},{"k":":checkhealth vim.lsp","m":[":"],"s":"neovim","cat":"LSP & diagnostics","h":":checkhealth","d":"Show attached LSP clients, their configs and the log path (there is no :LspInfo)","n":"nvim-lspconfig skips its <code>:LspInfo<\/code>/<code>:LspStart<\/code>/<code>:LspStop<\/code>/<code>:LspRestart<\/code>/<code>:LspLog<\/code> when Neovim has <code>:lsp<\/code> (<code>plugin/lspconfig.lua:6-8<\/code>); use <code>:lsp restart<\/code>, <code>:lsp stop<\/code>, <code>:lsp enable<\/code>","hf":"health.txt"},{"k":"i(","m":["x","o"],"d":"Inside (…) parentheses, leaving out whitespace next to the brackets","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Opening bracket leaves out the whitespace just inside the brackets (<code>di(<\/code> on <code>( a )<\/code> gives <code>( )<\/code>), closing bracket (<code>i)<\/code>) includes it (<code>di)<\/code> gives <code>()<\/code>). Unlike Vim's built-in, it also works when the cursor is <em>before<\/em> the pair: mini.ai takes the pair covering the cursor, else the next one (first on the cursor line, then within 50 lines).","hf":null},{"k":"i)","m":["x","o"],"d":"Inside (…) parentheses, including whitespace next to the brackets","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a(","m":["x","o"],"d":"Around (…) including the parentheses (same as a))","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"<code>2a(<\/code>, or typing <code>a(<\/code> again in Visual mode, selects the next enclosing pair.","hf":null},{"k":"a)","m":["x","o"],"d":"Around (…) including the parentheses (same as a()","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i[","m":["x","o"],"d":"Inside […] brackets, leaving out whitespace next to the brackets","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i]","m":["x","o"],"d":"Inside […] brackets, including whitespace next to the brackets","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a[","m":["x","o"],"d":"Around […] including the brackets (same as a])","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i{","m":["x","o"],"d":"Inside {…} braces, leaving out whitespace next to the braces","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i}","m":["x","o"],"d":"Inside {…} braces, including whitespace next to the braces","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a{","m":["x","o"],"d":"Around {…} including the braces (same as a})","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i<","m":["x","o"],"d":"Inside <…> angle brackets, leaving out whitespace next to them","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i>","m":["x","o"],"d":"Inside <…> angle brackets, including whitespace next to them","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a<","m":["x","o"],"d":"Around <…> including the angle brackets (same as a>)","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"ib","m":["x","o"],"d":"Inside the nearest (), [] or {} block","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","e":1,"n":"Vim's built-in <code>ib<\/code> only knows <code>()<\/code>; mini.ai's <code>b<\/code> is an alias for <code>)<\/code>, <code>]<\/code> and <code>}<\/code> (edge whitespace included) and searches cover-or-next.","hf":null},{"k":"ab","m":["x","o"],"d":"Around the nearest (), [] or {} block, brackets included","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i\"","m":["x","o"],"d":"Inside \"…\" double quotes","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"mini.ai matches balanced quote pairs and searches 50 lines (cover, else next). Built-in <code>i\"<\/code> only looked at the cursor line.","hf":null},{"k":"a\"","m":["x","o"],"d":"Around \"…\" including the quotes, without trailing whitespace","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Differs from Vim's built-in <code>a\"<\/code>, which also takes the whitespace after the closing quote.","hf":null},{"k":"i'","m":["x","o"],"d":"Inside '…' single quotes","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a'","m":["x","o"],"d":"Around '…' including the quotes, without trailing whitespace","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i`","m":["x","o"],"d":"Inside `…` backticks","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"a`","m":["x","o"],"d":"Around `…` including the backticks, without trailing whitespace","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"iq","m":["x","o"],"d":"Inside the nearest quotes of any kind: '…', \"…\" or `…`","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","sl":"in quote","hf":null},{"k":"aq","m":["x","o"],"d":"Around the nearest quotes of any kind, quotes included","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"if","m":["x","o"],"d":"Inside a function call: the arguments between its parentheses","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","e":1,"sl":"in call","n":"A function call is a name made of letters, digits, <code>_<\/code> or <code>.<\/code> followed by balanced <code>()<\/code>, e.g. <code>vim.fn.getline(1)<\/code>. Pattern-based, so a <code>)<\/code> inside a string can confuse it.","hf":null},{"k":"af","m":["x","o"],"d":"Around a function call, name and parentheses included","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"ia","m":["x","o"],"d":"Inside an argument: just the argument, no comma or edge whitespace","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Arguments live inside <code>()<\/code>, <code>[]<\/code> or <code>{}<\/code>, separated by commas; commas inside nested brackets or <code>\"…\"<\/code>/<code>'…'<\/code> strings are ignored (not inside <code>`…`<\/code>).","hf":null},{"k":"aa","m":["x","o"],"d":"Around an argument plus one adjacent comma, so daa leaves a valid list","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","e":1,"sl":"arg","n":"First argument takes the comma on its right; middle and last arguments take the comma on their left. On the first argument the following space stays: <code>daa<\/code> turns <code>f(a, b)<\/code> into <code>f( b)<\/code>.","hf":null},{"k":"it","m":["x","o"],"d":"Inside a tag pair: the content between <x> and <\/x>","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Replaces Vim's built-in <code>it<\/code>/<code>at<\/code> with a pattern match, so same-name nested tags (<code>&lt;a&gt;&lt;a&gt;&lt;/a&gt;&lt;/a&gt;<\/code>) can mis-match.","hf":null},{"k":"at","m":["x","o"],"d":"Around a tag pair, opening and closing tags included","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i?","m":["x","o"],"d":"Inside custom edges: prompts for the left and right strings","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Edges are literal strings, not patterns. Dot-repeat reuses the answers without asking again.","hf":null},{"k":"a?","m":["x","o"],"d":"Around custom edges (prompted), edges included","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"ig","m":["x","o"],"d":"Entire buffer (custom textobject from lua/plugins.lua)","s":"config","cat":"Text object","e":1,"sl":"buffer","n":"Defined in <code>Config.plugins.mini_ai.custom_textobjects.g<\/code>: charwise from line 1, column 1 to the end of the last line. <code>ig<\/code> and <code>ag<\/code> are identical. Try <code>yig<\/code>, <code>=ig<\/code>, <code>cig<\/code>, <code>vig<\/code>."},{"k":"ag","m":["x","o"],"d":"Entire buffer (same as ig)","s":"config","cat":"Text object"},{"k":"i{punct}","m":["x","o"],"d":"Between two {punct} characters, e.g. i_ i, i* i/ i- i<Space>","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"Any id that is not a Latin letter and not defined above works as a separator, e.g. <code>ci_<\/code> in <code>foo_bar_baz<\/code>. Digits count too.","hf":null},{"k":"a{punct}","m":["x","o"],"d":"Like i{punct} plus the run of separators on its right","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"i{letter}","m":["x","o"],"d":"Letters mini.ai doesn't define (w W s p B) fall back to Vim's text objects","s":"mini.ai","cat":"Text object","n":"So <code>iw<\/code>, <code>aW<\/code>, <code>is<\/code>, <code>ap<\/code>, <code>iB<\/code>, <code>aB<\/code> behave exactly as in stock Vim."},{"k":"iN{id}","m":["x","o"],"d":"Inside the next {id} textobject, e.g. ciN( diN\" viNq","s":"mini.ai","cat":"Text object","h":"MiniAi.config","e":1,"sl":"in next","n":"Uses search method <code>next<\/code>: always the one after the cursor, even if the cursor is inside one.","hf":null},{"k":"aN{id}","m":["x","o"],"d":"Around the next {id} textobject, e.g. daN) yaNf","s":"mini.ai","cat":"Text object","h":"MiniAi.config","hf":null},{"k":"il{id}","m":["x","o"],"d":"Inside the previous (last) {id} textobject, e.g. cil\"","s":"mini.ai","cat":"Text object","h":"MiniAi.config","hf":null},{"k":"al{id}","m":["x","o"],"d":"Around the previous (last) {id} textobject","s":"mini.ai","cat":"Text object","h":"MiniAi.config","hf":null},{"k":"[count]i{id}","m":["x","o"],"d":"The [count]-th enclosing textobject, e.g. d2i) empties the outer parens","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","hf":null},{"k":"{Visual}i{id}","m":["x"],"d":"Repeat i{id}/a{id} while selected to grow to the next enclosing one","s":"mini.ai","cat":"Text object","h":"MiniAi-builtin-textobjects","n":"E.g. <code>vi)<\/code> then <code>i)<\/code> again, or <code>va\"a\"<\/code>. The current selection is the reference, so the result never equals it.","hf":null},{"k":"g[{id}","m":["n","x","o"],"d":"Move to the left edge of the a{id} textobject, e.g. g[( g[f g[\"","s":"mini.ai","cat":"Motion","h":"MiniAi.move_cursor()","hf":null},{"k":"g]{id}","m":["n","x","o"],"d":"Move to the right edge of the a{id} textobject, e.g. g]) g]t","s":"mini.ai","cat":"Motion","h":"MiniAi.move_cursor()","hf":null},{"k":"sa{motion}{char}","m":["n"],"d":"Add surrounding {char} around {motion} or textobject","s":"mini.surround","cat":"Surround","h":"MiniSurround-builtin-surroundings","e":1,"sl":"surround","n":"<code>sa<\/code> is an operator, so any motion or text object works, including mini.ai ones (<code>saif\"<\/code>, <code>saaa]<\/code>). Dot-repeatable.","hf":null},{"k":"saiw)","m":["n"],"d":"Surround the word with parentheses: (word)","s":"mini.surround","cat":"Surround"},{"k":"saiw(","m":["n"],"d":"Surround the word with padded parentheses: ( word )","s":"mini.surround","cat":"Surround"},{"k":"saiw\"","m":["n"],"d":"Surround the word with double quotes","s":"mini.surround","cat":"Surround"},{"k":"saiwf","m":["n"],"d":"Wrap the word in a function call; prompts for the name: name(word)","s":"mini.surround","cat":"Surround"},{"k":"saiwt","m":["n"],"d":"Wrap the word in a tag; prompts for it, e.g. div class=\"x\"","s":"mini.surround","cat":"Surround","n":"The prompt takes the tag name plus attributes; the closing tag uses only the name."},{"k":"saiw?","m":["n"],"d":"Surround the word with custom text (prompts for left and right)","s":"mini.surround","cat":"Surround"},{"k":"sa$\"","m":["n"],"d":"Quote from the cursor to the end of the line","s":"mini.surround","cat":"Surround"},{"k":"[count]sa{motion}{char}","m":["n"],"d":"Repeat the surrounding [count] times, e.g. 2saiw) gives ((word))","s":"mini.surround","cat":"Surround","h":"MiniSurround-count-with-actions","hf":null},{"k":"{Visual}sa{char}","m":["x"],"d":"Surround the selection with {char}","s":"mini.surround","cat":"Surround"},{"k":"sd{char}","m":["n"],"d":"Delete the surrounding {char} around the cursor","s":"mini.surround","cat":"Surround","h":"MiniSurround-builtin-surroundings","e":1,"sl":"del surr","n":"Search method is <code>cover<\/code> (it must enclose the cursor) within 20 lines. Add <code>n<\/code>/<code>l<\/code> after <code>sd<\/code> to target the next/previous one instead.","hf":null},{"k":"sd'","m":["n"],"d":"Delete the surrounding single quotes","s":"mini.surround","cat":"Surround"},{"k":"sdq","m":["n"],"d":"Delete the nearest surrounding quotes of any kind","s":"mini.surround","cat":"Surround"},{"k":"sdb","m":["n"],"d":"Delete the nearest surrounding (), [] or {}","s":"mini.surround","cat":"Surround"},{"k":"sdf","m":["n"],"d":"Remove a function call but keep its arguments: f(x) → x","s":"mini.surround","cat":"Surround"},{"k":"sdt","m":["n"],"d":"Remove the surrounding tag pair, keeping the content","s":"mini.surround","cat":"Surround"},{"k":"sd(","m":["n"],"d":"Delete parentheses and the whitespace just inside them","s":"mini.surround","cat":"Surround"},{"k":"sr{old}{new}","m":["n"],"d":"Replace surrounding {old} with {new}","s":"mini.surround","cat":"Surround","h":"MiniSurround-builtin-surroundings","e":1,"sl":"repl surr","hf":null},{"k":"sr)]","m":["n"],"d":"Replace (…) with […]","s":"mini.surround","cat":"Surround"},{"k":"sr'\"","m":["n"],"d":"Replace single quotes with double quotes","s":"mini.surround","cat":"Surround"},{"k":"srtt","m":["n"],"d":"Change the surrounding tag (prompts for the new one)","s":"mini.surround","cat":"Surround"},{"k":"sr)tdiv<CR>","m":["n"],"d":"Replace parentheses with a <div> tag pair","s":"mini.surround","cat":"Surround"},{"k":"sf{char}","m":["n","x","o"],"d":"Move the cursor to the right part of surrounding {char}","s":"mini.surround","cat":"Surround"},{"k":"sF{char}","m":["n","x","o"],"d":"Move the cursor to the left part of surrounding {char}","s":"mini.surround","cat":"Surround"},{"k":"sh{char}","m":["n"],"d":"Flash-highlight the surrounding {char} for 500 ms","s":"mini.surround","cat":"Surround"},{"k":"sdn{char}","m":["n"],"d":"Delete the next {char} surrounding (after the cursor)","s":"mini.surround","cat":"Surround","n":"The <code>n<\/code> (next) and <code>l<\/code> (last/previous) suffixes work after <code>sd<\/code>, <code>sr<\/code>, <code>sf<\/code>, <code>sF<\/code> and <code>sh<\/code>: <code>srn)]<\/code>, <code>sfl\"<\/code>, <code>shnt<\/code>."},{"k":"sdl{char}","m":["n"],"d":"Delete the previous (last) {char} surrounding","s":"mini.surround","cat":"Surround"},{"k":"[count]sd{char}","m":["n"],"d":"Act on the [count]-th enclosing surrounding: 2sd) on (a(b(c)b)a) gives (ab(c)ba)","s":"mini.surround","cat":"Surround","h":"MiniSurround-count-with-actions","hf":null},{"k":"(","m":["n","x"],"d":"Surround id: find () and drop inner spaces; add pads with spaces: ( x )","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)","n":"Same for <code>[<\/code>, <code>{<\/code>, <code>&lt;<\/code>."},{"k":")","m":["n","x"],"d":"Surround id: () with no padding, inner spaces kept","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)","n":"Same for <code>]<\/code>, <code>}<\/code>, <code>&gt;<\/code>."},{"k":"b","m":["n","x"],"d":"Surround id: finds any of (), [], {}; adds ()","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)"},{"k":"q","m":["n","x"],"d":"Surround id: finds any quote ' \" `; adds \"…\"","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)","n":"Not balanced, unlike mini.ai's <code>q<\/code>: with the cursor on <code>x<\/code> in <code>\"a\" x \"b\"<\/code>, <code>sdq<\/code> strips the quotes around <code>\" x \"<\/code>."},{"k":"t","m":["n","x"],"d":"Surround id: finds a same-name tag pair; when adding, prompts for the tag","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)"},{"k":"f","m":["n","x"],"d":"Surround id: finds name(…); when adding, prompts for the function name","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)"},{"k":"?","m":["n","x"],"d":"Surround id: interactive, prompts for left and right parts","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)"},{"k":"{other}","m":["n","x"],"d":"Surround id: any other char surrounds with itself, e.g. * _ | $","s":"mini.surround","cat":"Surround","ctx":"Surround id (after sa/sd/sr/sf/sh)"},{"k":"\\(","m":["i"],"d":"No auto-pair right after a backslash: \\( types only (","s":"config","cat":"Pairs","n":"Applies to every opener and quote (lua/smart_pairs.lua <code>should_pair<\/code>)."},{"k":"({text}","m":["i"],"d":"Opener before text types only the opener (wrapping existing text)","s":"config","cat":"Pairs","e":1,"n":"smart_pairs only inserts the pair when nothing but whitespace follows the cursor, or the next char is a closing <code>)<\/code> <code>]<\/code> <code>}<\/code>. Also blocks pairing before a quote or comma, e.g. typing <code>(<\/code> inside an empty <code>\"\"<\/code>."},{"k":"don't","m":["i"],"d":"A quote right after a letter or digit is typed alone (apostrophes, closing quotes)","s":"config","cat":"Pairs"},{"k":"\"\"\"","m":["i"],"d":"A quote right after the same quote is typed alone, so \"\"\" docstrings work","s":"config","cat":"Pairs"},{"k":"```","m":["i"],"d":"On a blank line: create a fenced code block pair, cursor after the opener","s":"config","cat":"Pairs","ctx":"Markdown buffers","e":1,"n":"Type <code>`<\/code> three times: the first pairs to <code>``<\/code>, the second steps over, the third turns the line into <code>```<\/code> with a twin <code>```<\/code> below. Only when the next line is blank, the buffer ends, or the next line closes the block you're in. Type the language name right away."},{"k":"````","m":["i"],"d":"Each extra ` lengthens both fences while the closer is untouched","s":"config","cat":"Pairs","ctx":"Markdown buffers"},{"k":"~~~","m":["i"],"d":"Tilde fences work the same way (a lone ~ is never paired)","s":"config","cat":"Pairs","ctx":"Markdown buffers"},{"k":"```","m":["i"],"d":"Inside a code block, a fence that can't close it (shorter, or ~ vs `) pairs as nested","s":"config","cat":"Pairs","ctx":"Inside a Markdown code block","n":"If the new run is long enough to close the enclosing block, it is not paired; growing a nested pair to that length collapses it into the block's closer."},{"k":"<BS>","m":["i"],"d":"At the end of an untouched fence pair: shrink both; below 3 the closer goes","s":"config","cat":"Pairs","ctx":"Markdown buffers"},{"k":"<CR>","m":["i"],"d":"Between (), [] or {}: put the closer on its own line, cursor between","s":"mini.pairs","cat":"Pairs","n":"Quotes are registered with <code>cr = false<\/code>, so <kbd>Enter<\/kbd> between <code>\"\"<\/code> is a plain newline."},{"k":"f","m":["n","x","o"],"d":"After f/F: next match in that motion's direction (no new {char})","s":"flash","cat":"Motion","ctx":"Right after f/F/t/T (highlights visible)","n":"Flash's clever-f style <code>char_actions<\/code>: the lowercase motion key is <em>next<\/em>, the uppercase one <em>prev<\/em>. After <code>Fx<\/code> that means <kbd>f<\/kbd> keeps going left and <kbd>F<\/kbd> goes right. Ends once the highlights go away (cursor moved by something else, <kbd>Esc<\/kbd>, Insert mode, leaving the buffer)."},{"k":"F","m":["n","x","o"],"d":"After f/F: match in the opposite direction (no new {char})","s":"flash","cat":"Motion","ctx":"Right after f/F/t/T (highlights visible)"},{"k":"t","m":["n","x","o"],"d":"After t/T: next match in that motion's direction (no new {char})","s":"flash","cat":"Motion","ctx":"Right after f/F/t/T (highlights visible)"},{"k":"T","m":["n","x","o"],"d":"After t/T: match in the opposite direction (no new {char})","s":"flash","cat":"Motion","ctx":"Right after f/F/t/T (highlights visible)"},{"k":"<Esc>","m":["n","x"],"d":"Clear the Flash f/t highlights","s":"flash","cat":"Motion","ctx":"Right after f/F/t/T (highlights visible)"},{"k":"[count]f{char}","m":["n","x","o"],"d":"Jump to the [count]-th {char} on the line (also with F t T ; ,)","s":"flash","cat":"Motion"},{"k":"s","m":["n"],"d":"Flash: label every visible result; type a label to move the selection there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker","n":"Picker input window, Normal mode (<code>picker.win.input.keys<\/code> in lua/plugins.lua). Runs <code>flash.jump<\/code> with pattern <code>^<\/code> restricted to the <code>snacks_picker_list<\/code> window; picking a label moves the list cursor, it does not confirm."},{"k":"<M-s>","m":["n","i"],"d":"Flash: label every visible result; type a label to move the selection there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker"},{"k":"{char1}{char2}","m":["n","x","o"],"d":"Type the first two chars of the target; labels preview after the first","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap-usage","n":"If the closest match is unlabeled you are already there (autojump) and the remaining labels are \"safe\" keys you would not type next (<code>sfnut/SFNLHMUGTZ?<\/code>); any other key just runs as a normal command. Case-sensitive here ('ignorecase' is off). In Operator-pending mode with several matches you always pick a label.","hf":null},{"k":"{label}","m":["n","x","o"],"d":"Jump to the target showing that label","s":"leap","cat":"Motion","ctx":"During a Leap jump"},{"k":"<Space>","m":["n","x","o"],"d":"After the 2 chars: show the next group of labels (too many matches)","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap.opts.keys","n":"Labels of later groups show dimmed/concealed until you switch to them.","hf":null},{"k":"<BS>","m":["n","x","o"],"d":"Back to the previous group of labels","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap.opts.keys","hf":null},{"k":"<CR>","m":["n","x","o"],"d":"As the first key: repeat the previous Leap search (so <CR><CR> re-leaps)","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap-repeat","hf":null},{"k":"{char}<CR>","m":["n","x","o"],"d":"Jump straight to the closest {char} (one-char shortcut)","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap-shortcut","hf":null},{"k":"{char}<Space>","m":["n","x","o"],"d":"Target {char} followed by a space, a tab or the end of the line","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap-till-eol","hf":null},{"k":"<Space><Space>","m":["n","x","o"],"d":"Target an empty line or an end-of-line position","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap-to-eol","hf":null},{"k":"(","m":["n","x","o"],"d":"Equivalence classes: ( [ { match each other, ) ] } too, and ' \" ` too","s":"leap","cat":"Motion","ctx":"During a Leap jump","h":"leap.opts.equivalence_classes","n":"Space also stands for Tab and end of line. Typing any member matches the whole class.","hf":null},{"k":"<Esc>","m":["n","x","o"],"d":"Cancel the Leap","s":"leap","cat":"Motion","ctx":"During a Leap jump"},{"k":"gcip","m":["n"],"d":"Toggle comment on the current paragraph","s":"neovim","cat":"Comment","h":"gc-default","hf":"various.txt"},{"k":"[count]gcc","m":["n"],"d":"Toggle comment on [count] lines from the cursor","s":"neovim","cat":"Comment","h":"gcc-default","hf":"various.txt"},{"k":"gcgc","m":["n"],"d":"Uncomment the whole comment block under the cursor","s":"neovim","cat":"Comment","h":"o_gc-default","hf":"various.txt"},{"k":"dgc","m":["n"],"d":"Delete the comment block under the cursor","s":"neovim","cat":"Comment","h":"o_gc-default","hf":"various.txt"},{"k":"a%","m":["o"],"d":"In Operator-pending mode a% is mini.ai's 'between % signs', not matchit's","s":"mini.ai","cat":"Text object","n":"matchit only maps <code>a%<\/code> in Visual mode, so <code>da%<\/code> goes through mini.ai's <code>a<\/code> with <code>%<\/code> as a separator id. For matchit's group use <code>va%<\/code>, which stops on the first character of the closing word (<code>e<\/code> of <code>end<\/code>)."},{"k":"<C-r><C-p>","m":["i"],"d":"Insert the full path of the file under the cursor","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-r><C-w>","m":["i"],"d":"Insert the word under the cursor (in the original buffer)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"j","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<Down>","m":["n","i"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-q>","m":["n","i"],"d":"Send the selected items (or all results) to the quickfix list and open it","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","e":1,"sl":"→qf"},{"k":"<Up>","m":["n","i"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"/","m":["n"],"d":"Toggle focus between the input and the result list","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<CR>","m":["n","i"],"d":"Open / jump to the item (or every selected item)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Runs the source's own confirm action: most open the file, some check out, apply or insert (see the per-picker entries).","e":1,"sl":"open"},{"k":"<C-p>","m":["n","i"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-r>#","m":["i"],"d":"Insert the alternate file name (#) into the search","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<M-f>","m":["n","i"],"d":"Toggle following symlinks (files / grep)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex."},{"k":"<M-r>","m":["n","i"],"d":"Toggle regex vs literal matching for the search","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex."},{"k":"<C-j>","m":["n","i"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<M-s>","m":["n","i"],"d":"Flash-jump: label every result and type a label to move there","s":"config","cat":"Find & pick","ctx":"Snacks picker · input","n":"Custom action in <code>lua/plugins.lua<\/code>: runs <code>flash.jump<\/code> with pattern <code>^<\/code> restricted to the list window, then moves the cursor to the picked row (it does not confirm).","e":1,"sl":"flash"},{"k":"<M-h>","m":["n","i"],"d":"Toggle showing hidden (dot) files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex.","sl":"hidden"},{"k":"<M-a>","m":["n","i"],"d":"Send the selected items (or current) to the Sidekick AI CLI","s":"config","cat":"Find & pick","ctx":"Snacks picker · input","n":"Custom action in <code>lua/plugins.lua<\/code> calling <code>sidekick.cli.picker.snacks.send<\/code>: closes the picker and sends file/position references to the running AI CLI tool."},{"k":"<C-w>H","m":["n"],"d":"Move the picker to a left sidebar layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-w>J","m":["n"],"d":"Move the picker to a bottom split layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-w>K","m":["n"],"d":"Move the picker to a top split layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-w>L","m":["n"],"d":"Move the picker to a right sidebar layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"s","m":["n"],"d":"Flash-jump: label every result and type a label to move there","s":"config","cat":"Find & pick","ctx":"Snacks picker · input","n":"Custom action in <code>lua/plugins.lua<\/code>: runs <code>flash.jump<\/code> with pattern <code>^<\/code> restricted to the list window, then moves the cursor to the picked row (it does not confirm). Normal mode only and buffer-local, so it beats mini.surround's <kbd>s<\/kbd> prefix inside the picker.","sl":"flash"},{"k":"<M-d>","m":["n","i"],"d":"Debug-inspect the item under the cursor (Snacks.debug)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-u>","m":["n","i"],"d":"Scroll the result list up half a page","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<M-p>","m":["n","i"],"d":"Show / hide the preview window","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-t>","m":["n","i"],"d":"Open the item in a new tab","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-c>","m":["i"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","sl":"close"},{"k":"<C-r><C-a>","m":["i"],"d":"Insert the WORD under the cursor (in the original buffer)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-r><C-f>","m":["i"],"d":"Insert the file path under the cursor (<cfile>)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-Down>","m":["n","i"],"d":"Recall the next search from picker history","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-n>","m":["n","i"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-Up>","m":["n","i"],"d":"Recall the previous search from picker history","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-b>","m":["n","i"],"d":"Scroll the preview window up","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"?","m":["n"],"d":"Show the key help for the input window","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-g>","m":["n","i"],"d":"Toggle live mode: re-run the search on every keystroke vs filter results","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"In the list window <kbd>Ctrl-g<\/kbd> prints the item path instead."},{"k":"<C-w>","m":["i"],"d":"Delete the word before the cursor in the search input","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Maps <code>&lt;C-w&gt;<\/code> to <code>&lt;C-S-w&gt;<\/code>, which works in the prompt buffer."},{"k":"<C-f>","m":["n","i"],"d":"Scroll the preview window down","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"q","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","sl":"close"},{"k":"<Tab>","m":["n","i"],"d":"Toggle selection of the item and move down (multi-select)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","e":1,"sl":"select"},{"k":"<M-w>","m":["n","i"],"d":"Cycle focus between the input, preview and list windows","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"G","m":["n"],"d":"Jump to the last result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<Esc>","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","sl":"close","n":"Normal mode only: in insert mode the first <kbd>Esc<\/kbd> just leaves insert mode in the search box, the second closes the picker (or use <kbd>q<\/kbd> / insert-mode <kbd>Ctrl-c<\/kbd>)."},{"k":"<C-d>","m":["n","i"],"d":"Scroll the result list down half a page","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<S-Tab>","m":["n","i"],"d":"Toggle selection of the item and move up (multi-select)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"k","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<S-CR>","m":["n","i"],"d":"Pick a window with labels, then open the item there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"<code>{ \"pick_win\", \"jump\" }<\/code>: the picker hides, every window gets a letter label; type it to open the item in that window."},{"k":"<C-r>%","m":["i"],"d":"Insert the current file name (%)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-s>","m":["n","i"],"d":"Open the item in a horizontal split","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","sl":"split"},{"k":"<M-i>","m":["n","i"],"d":"Toggle showing git-ignored files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex.","sl":"ignored"},{"k":"<M-m>","m":["n","i"],"d":"Maximize / restore the picker layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-a>","m":["n","i"],"d":"Select every result, or clear the selection if all are selected","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-v>","m":["n","i"],"d":"Open the item in a vertical split","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input","sl":"vsplit"},{"k":"<C-k>","m":["n","i"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"gg","m":["n"],"d":"Jump to the first result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-r><C-l>","m":["i"],"d":"Insert the current line of the original buffer","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · input"},{"k":"<C-t>","m":["n"],"d":"Open the item in a new tab","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"j","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<Down>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-q>","m":["n"],"d":"Send the selected items (or all results) to the quickfix list and open it","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"→qf"},{"k":"<Up>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"/","m":["n"],"d":"Toggle focus between the input and the result list","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<Esc>","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"close"},{"k":"gg","m":["n"],"d":"Jump to the first result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"zb","m":["n"],"d":"Scroll the list so the current item is at the bottom","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-v>","m":["n"],"d":"Open the item in a vertical split","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"vsplit"},{"k":"<M-h>","m":["n"],"d":"Toggle showing hidden (dot) files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex.","sl":"hidden"},{"k":"<C-w>H","m":["n"],"d":"Move the picker to a left sidebar layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-w>J","m":["n"],"d":"Move the picker to a bottom split layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-b>","m":["n"],"d":"Scroll the preview window up","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-w>L","m":["n"],"d":"Move the picker to a right sidebar layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<2-LeftMouse>","m":["n"],"d":"Open / jump to the item (or every selected item)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Runs the source's own confirm action: most open the file, some check out, apply or insert (see the per-picker entries).","sl":"open"},{"k":"<M-d>","m":["n"],"d":"Debug-inspect the item under the cursor (Snacks.debug)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<M-p>","m":["n"],"d":"Show / hide the preview window","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"i","m":["n"],"d":"Focus the search input","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-u>","m":["n"],"d":"Scroll the result list up half a page","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-d>","m":["n"],"d":"Scroll the result list down half a page","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-n>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-p>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-g>","m":["n"],"d":"Print the path of the item under the cursor","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-j>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-f>","m":["n"],"d":"Scroll the preview window down","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<S-CR>","m":["n"],"d":"Pick a window with labels, then open the item there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"<code>{ \"pick_win\", \"jump\" }<\/code>: the picker hides, every window gets a letter label; type it to open the item in that window."},{"k":"<Tab>","m":["n","x"],"d":"Toggle selection of the item and move down (multi-select)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"select"},{"k":"?","m":["n"],"d":"Show the key help for the list window","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"k","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<M-m>","m":["n"],"d":"Maximize / restore the picker layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<M-f>","m":["n"],"d":"Toggle following symlinks (files / grep)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex."},{"k":"<C-w>K","m":["n"],"d":"Move the picker to a top split layout","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-s>","m":["n"],"d":"Open the item in a horizontal split","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"split"},{"k":"<S-Tab>","m":["n","x"],"d":"Toggle selection of the item and move up (multi-select)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"zt","m":["n"],"d":"Scroll the list so the current item is at the top","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<M-w>","m":["n"],"d":"Cycle focus between the input, preview and list windows","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"zz","m":["n"],"d":"Scroll the list so the current item is centred","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"G","m":["n"],"d":"Jump to the last result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<C-a>","m":["n"],"d":"Select every result, or clear the selection if all are selected","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"<M-i>","m":["n"],"d":"Toggle showing git-ignored files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex.","sl":"ignored"},{"k":"<C-k>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list"},{"k":"q","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","sl":"close"},{"k":"<CR>","m":["n"],"d":"Open / jump to the item (or every selected item)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · list","n":"Runs the source's own confirm action: most open the file, some check out, apply or insert (see the per-picker entries).","sl":"open"},{"k":"<Esc>","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · preview","sl":"close"},{"k":"<M-w>","m":["n"],"d":"Cycle focus between the input, preview and list windows","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · preview"},{"k":"q","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · preview","sl":"close"},{"k":"i","m":["n"],"d":"Focus the search input","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · preview"},{"k":"<C-x>","m":["n","i"],"d":"Delete (unload) the buffer under the cursor or the selected buffers","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · buffers","n":"Opened with <kbd><leader>, / <leader>fb<\/kbd>."},{"k":"dd","m":["n"],"d":"Delete the buffer (list window)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · buffers","n":"Opened with <kbd><leader>, / <leader>fb<\/kbd>."},{"k":"<Tab>","m":["n","i"],"d":"Stage / unstage the file (replaces multi-select here)","s":"snacks","cat":"Git","ctx":"Snacks picker · git_status","n":"Opened with <kbd><leader>gs<\/kbd>. Runs <code>git add<\/code> or <code>git restore --staged<\/code>."},{"k":"<C-r>","m":["n","i"],"d":"Restore (discard) the file's changes after a confirm prompt","s":"snacks","cat":"Git","ctx":"Snacks picker · git_status","n":"Opened with <kbd><leader>gs<\/kbd>. Runs <code>git restore<\/code>; irreversible for unstaged edits."},{"k":"<Tab>","m":["n","i"],"d":"Stage / unstage the hunk under the cursor","s":"snacks","cat":"Git","ctx":"Snacks picker · git_diff","n":"Opened with <kbd><leader>gd<\/kbd>. Uses <code>git apply --cached<\/code> (or <code>--reverse<\/code>)."},{"k":"<C-r>","m":["n","i"],"d":"Discard the hunk after a confirm prompt","s":"snacks","cat":"Git","ctx":"Snacks picker · git_diff","n":"Opened with <kbd><leader>gd<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Check out the branch (remote branches get a local tracking branch)","s":"snacks","cat":"Git","ctx":"Snacks picker · git_branches","n":"Opened with <kbd><leader>gb<\/kbd>."},{"k":"<C-a>","m":["n","i"],"d":"Create and check out a new branch (name prompt prefilled with the search text)","s":"snacks","cat":"Git","ctx":"Snacks picker · git_branches","n":"Opened with <kbd><leader>gb<\/kbd>."},{"k":"<C-x>","m":["n","i"],"d":"Force-delete the branch (git branch -D) after a confirm prompt","s":"snacks","cat":"Git","ctx":"Snacks picker · git_branches","n":"Opened with <kbd><leader>gb<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Check out the commit: puts the repo in detached HEAD","s":"snacks","cat":"Git","ctx":"Snacks picker · git_log","n":"Opened with <kbd><leader>gl<\/kbd>. The source's confirm is <code>git_checkout<\/code>, so Enter on a commit really runs <code>git checkout &lt;sha&gt;<\/code>. Use <kbd>Esc<\/kbd> to just browse."},{"k":"<CR>","m":["n","i"],"d":"Restore this file to the chosen commit's version (overwrites it)","s":"snacks","cat":"Git","ctx":"Snacks picker · git_log_file / git_log_line","n":"Opened with <kbd><leader>gf<\/kbd> (file history) or <kbd><leader>gL<\/kbd> (line history). Confirm is <code>git_checkout<\/code> with the file attached: <code>git checkout &lt;sha&gt; -- &lt;file&gt;<\/code> replaces the working copy."},{"k":"<CR>","m":["n","i"],"d":"Apply the stash (git stash apply)","s":"snacks","cat":"Git","ctx":"Snacks picker · git_stash","n":"Opened with <kbd><leader>gS<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"cd to the project and try to restore its session, else open files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>. Session restore uses the dashboard's plugin detection, which only works with lazy.nvim, so here it just changes directory and opens the files picker after 100 ms."},{"k":"<C-e>","m":["n","i"],"d":"tcd to the project and open the explorer there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<C-f>","m":["n","i"],"d":"tcd to the project and find files there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<C-g>","m":["n","i"],"d":"tcd to the project and grep there","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<C-r>","m":["n","i"],"d":"tcd to the project and list its recent files","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<C-w>","m":["n","i"],"d":"Just tcd to the project (tab-local cwd)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<C-t>","m":["n","i"],"d":"Open a new tab and pick a project for it","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · projects","n":"Opened with <kbd><leader>fp<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Restore the buffer to the chosen undo state","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · undo","n":"Opened with <kbd><leader>su<\/kbd>."},{"k":"<C-y>","m":["n","i"],"d":"Yank the lines added in that undo state","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · undo","n":"Opened with <kbd><leader>su<\/kbd>."},{"k":"<C-S-y>","m":["n","i"],"d":"Yank the lines removed in that undo state","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · undo","n":"Opened with <kbd><leader>su<\/kbd>."},{"k":"<C-x>","m":["n","i"],"d":"Delete the mark under the cursor","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · marks","n":"Opened with <kbd><leader>sm<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Copy the register's contents to the default register (the clipboard here) and close","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · registers","n":"Opened with <kbd><leader>s\"<\/kbd>. Uses <code>v:register<\/code>, which is <code>+<\/code> with <code>clipboard=unnamedplus<\/code>."},{"k":"<CR>","m":["n","i"],"d":"Put the command on the command line (edit, then Enter to run)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · command_history","n":"Opened with <kbd><leader>: / <leader>sc<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Put the command on the command line","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · commands","n":"Opened with <kbd><leader>sC<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Start a / search pre-filled with that pattern","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · search_history","n":"Opened with <kbd><leader>s/<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Insert the icon at the cursor","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · icons","n":"Opened with <kbd><leader>si<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Apply the colorscheme (moving through the list previews it live)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · colorschemes","n":"Opened with <kbd><leader>uC<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Open the help page; <C-v> vertical, <C-t> tab","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · help","n":"Opened with <kbd><leader>sh<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Close the picker and run the chosen keymap","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · keymaps","n":"Opened with <kbd><leader>sk<\/kbd>. Feeds the mapping's lhs with <code>nvim_input<\/code>, so it runs as if typed."},{"k":"<M-g>","m":["n","i"],"d":"Toggle including global keymaps","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · keymaps","n":"Opened with <kbd><leader>sk<\/kbd>."},{"k":"<M-b>","m":["n","i"],"d":"Toggle including buffer-local keymaps","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · keymaps","n":"Opened with <kbd><leader>sk<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Open the GitHub actions menu for the issue / PR","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_issue / gh_pr","n":"Opened with <kbd><leader>gi / gI / gp / gP<\/kbd>."},{"k":"<M-b>","m":["n","i"],"d":"Open the issue / PR in the browser","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_issue / gh_pr","n":"Opened with <kbd><leader>gi / gI / gp / gP<\/kbd>."},{"k":"<C-y>","m":["n","i"],"d":"Yank the issue / PR URL","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_issue / gh_pr","n":"Opened with <kbd><leader>gi / gI / gp / gP<\/kbd>."},{"k":"y","m":["n","x"],"d":"Yank the URL(s) of the item(s) (list window)","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_issue / gh_pr","n":"Opened with <kbd><leader>gi / gI / gp / gP<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Open the PR in a tea:// buffer (c checkout, d diff, A approve, a comment, x close)","s":"snacks-tea","cat":"Git","ctx":"Snacks picker · tea_pr","n":"Opened with <kbd><leader>gt / gT<\/kbd>. This snacks-tea version registers its picker config only when <code>Snacks.picker.config.defaults<\/code> exists, which this snacks lacks, so it falls back to a bare picker: Enter is the default jump and the <kbd>Alt-b<\/kbd> / <kbd>Ctrl-y<\/kbd> / <kbd>y<\/kbd> keys are not mapped (verified headless)."},{"k":"<CR>","m":["n","i"],"d":"Open the scratch buffer","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · scratch","n":"Opened with <kbd><leader>S<\/kbd>."},{"k":"<C-n>","m":["n","i"],"d":"Open the default scratch buffer for the current filetype (created if missing)","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · scratch","n":"Opened with <kbd><leader>S<\/kbd>. Runs <code>Snacks.scratch.open()<\/code>, the same buffer <kbd><leader>.<\/kbd> toggles; it does not make an extra one."},{"k":"<C-x>","m":["n","i"],"d":"Delete the scratch file","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · scratch","n":"Opened with <kbd><leader>S<\/kbd>."},{"k":"<CR>","m":["n","i"],"d":"Jump to the location; LSP pickers jump directly when there is only one result","s":"snacks","cat":"Find & pick","ctx":"Snacks picker · lsp_* / smart / files / grep","n":"Opened with <kbd>gd gr gI gy gai gao, <leader><space> …<\/kbd>. <code>auto_confirm<\/code> is on for lsp_definitions, references, implementations, type/declarations and call hierarchy."},{"k":"<C-x>","m":["n","i"],"d":"Create a new note named from the search text","s":"obsidian.nvim","cat":"Notes","ctx":"Snacks picker · Obsidian notes","n":"In <code>:Obsidian quick_switch<\/code> / <code>search<\/code> pickers (snacks backend). <kbd>Ctrl-b<\/kbd> here replaces snacks' preview scroll-up."},{"k":"<C-l>","m":["n","i"],"d":"Insert a [[link]] to the chosen note at the cursor","s":"obsidian.nvim","cat":"Notes","ctx":"Snacks picker · Obsidian notes","n":"In <code>:Obsidian quick_switch<\/code> / <code>search<\/code> pickers (snacks backend). <kbd>Ctrl-b<\/kbd> here replaces snacks' preview scroll-up."},{"k":"<C-b>","m":["n","i"],"d":"Bookmark the chosen note","s":"obsidian.nvim","cat":"Notes","ctx":"Snacks picker · Obsidian notes","n":"In <code>:Obsidian quick_switch<\/code> / <code>search<\/code> pickers (snacks backend). <kbd>Ctrl-b<\/kbd> here replaces snacks' preview scroll-up."},{"k":"<C-x>","m":["n","i"],"d":"Add the chosen tag(s) to the current note","s":"obsidian.nvim","cat":"Notes","ctx":"Snacks picker · Obsidian tags","n":"In the <code>:Obsidian tags<\/code> picker."},{"k":"<C-l>","m":["n","i"],"d":"Insert the chosen tag at the cursor","s":"obsidian.nvim","cat":"Notes","ctx":"Snacks picker · Obsidian tags","n":"In the <code>:Obsidian tags<\/code> picker."},{"k":"<CR>","m":["n","i"],"d":"Jump to the bookmark","s":"haunt","cat":"Mark & jump","ctx":"Snacks picker · Haunt bookmarks","n":"Opened with <kbd>Space h l<\/kbd> (picker = \"snacks\" in <code>lua/plugins.lua<\/code>)."},{"k":"d","m":["n"],"d":"Delete the bookmark under the cursor","s":"haunt","cat":"Mark & jump","ctx":"Snacks picker · Haunt bookmarks","n":"Normal mode in both the input and list windows (default <code>picker_keys.delete<\/code>)."},{"k":"a","m":["n"],"d":"Edit the bookmark's annotation","s":"haunt","cat":"Mark & jump","ctx":"Snacks picker · Haunt bookmarks","n":"Normal mode in both the input and list windows (default <code>picker_keys.edit_annotation<\/code>)."},{"k":"<C-t>","m":["n"],"d":"Open a terminal in the directory under the cursor","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Replaces the picker's usual <kbd>Ctrl-t<\/kbd> (open in tab)."},{"k":"j","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<Down>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-q>","m":["n"],"d":"Send the selected items (or all results) to the quickfix list and open it","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<Up>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"o","m":["n"],"d":"Open the file with the system default application","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<Esc>","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"r","m":["n"],"d":"Rename the file (LSP-aware: updates imports via Snacks.rename)","s":"snacks","cat":"Files","ctx":"Snacks explorer","e":1,"sl":"rename"},{"k":"zb","m":["n"],"d":"Scroll the list so the current item is at the bottom","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"k","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"P","m":["n"],"d":"Toggle the preview window","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"I","m":["n"],"d":"Toggle showing git-ignored files","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"i","m":["n"],"d":"Focus the search input","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"zt","m":["n"],"d":"Scroll the list so the current item is at the top","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"a","m":["n"],"d":"Create a file or directory (end the name with / for a directory)","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Missing parent directories are created.","e":1,"sl":"new"},{"k":"<C-n>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"Z","m":["n"],"d":"Collapse every directory","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-g>","m":["n"],"d":"Print the path of the item under the cursor","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-f>","m":["n"],"d":"Scroll the preview window down","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<S-Tab>","m":["n","x"],"d":"Toggle selection of the item and move up (multi-select)","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<Tab>","m":["n","x"],"d":"Toggle selection of the item and move down (multi-select)","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"]g","m":["n"],"d":"Jump to the next file with git changes","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"[g","m":["n"],"d":"Jump to the previous file with git changes","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-a>","m":["n"],"d":"Select every result, or clear the selection if all are selected","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"]d","m":["n"],"d":"Jump to the next file with diagnostics","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-c>","m":["n"],"d":"Set the tab-local working directory to the directory under the cursor","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"[d","m":["n"],"d":"Jump to the previous file with diagnostics","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"]w","m":["n"],"d":"Jump to the next file with warnings","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"c","m":["n"],"d":"Copy the selection into this directory, or copy the file to a new name","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"]e","m":["n"],"d":"Jump to the next file with errors","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"?","m":["n"],"d":"Show the key help for the list window","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"[e","m":["n"],"d":"Jump to the previous file with errors","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"/","m":["n"],"d":"Toggle focus between the input and the result list","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"gg","m":["n"],"d":"Jump to the first result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"h","m":["n"],"d":"Collapse the directory (or the parent of a file)","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-f>","m":["n"],"d":"Toggle following symlinks (files / grep)","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Toggle flags show as letters in the picker title: f follow, h hidden, i ignored, R regex."},{"k":"<C-v>","m":["n"],"d":"Open the item in a vertical split","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-h>","m":["n"],"d":"Toggle showing hidden (dot) files","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"u","m":["n"],"d":"Refresh the tree from disk","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-w>J","m":["n"],"d":"Move the picker to a bottom split layout","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-w>K","m":["n"],"d":"Move the picker to a top split layout","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<M-m>","m":["n"],"d":"Maximize / restore the picker layout","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<2-LeftMouse>","m":["n"],"d":"Open the file, or expand / collapse the directory","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-d>","m":["n"],"d":"Debug-inspect the item under the cursor (Snacks.debug)","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-p>","m":["n"],"d":"Toggle the preview window","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-u>","m":["n"],"d":"Scroll the result list up half a page","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-d>","m":["n"],"d":"Scroll the result list down half a page","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<leader>/","m":["n"],"d":"Grep inside the directory under the cursor","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Buffer-local <code>&lt;leader&gt;/<\/code>, shadowing the global Grep map while the explorer list has focus."},{"k":"H","m":["n"],"d":"Toggle showing hidden (dot) files","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-w>H","m":["n"],"d":"Move the picker to a left sidebar layout","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"l","m":["n"],"d":"Open the file, or expand / collapse the directory","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<BS>","m":["n"],"d":"Go up: make the parent directory the explorer root","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":".","m":["n"],"d":"Make the directory under the cursor the explorer root","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"q","m":["n"],"d":"Close the picker and go back to the window it was opened from","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<CR>","m":["n"],"d":"Open the file, or expand / collapse the directory","s":"snacks","cat":"Files","ctx":"Snacks explorer","e":1},{"k":"<C-k>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-i>","m":["n"],"d":"Toggle showing git-ignored files","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"y","m":["n","x"],"d":"Yank the path(s) of the file(s) to the clipboard","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Uses <code>v:register<\/code>, which is <code>+<\/code> with <code>clipboard=unnamedplus<\/code>."},{"k":"G","m":["n"],"d":"Jump to the last result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"p","m":["n"],"d":"Paste (copy) files whose paths are in the clipboard into this directory","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"zz","m":["n"],"d":"Scroll the list so the current item is centred","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"m","m":["n"],"d":"Move the selected files into this directory (renames if nothing selected)","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<M-w>","m":["n"],"d":"Cycle focus between the input, preview and list windows","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-s>","m":["n"],"d":"Open the item in a horizontal split","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<S-CR>","m":["n"],"d":"Pick a window with labels, then open the item there","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"<code>{ \"pick_win\", \"jump\" }<\/code>: the picker hides, every window gets a letter label; type it to open the item in that window."},{"k":"<C-p>","m":["n"],"d":"Move to the previous result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-w>L","m":["n"],"d":"Move the picker to a right sidebar layout","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Split layouts disable auto-close and preview; the picker stays open after confirm."},{"k":"<C-j>","m":["n"],"d":"Move to the next result","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"<C-b>","m":["n"],"d":"Scroll the preview window up","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"d","m":["n"],"d":"Delete the file(s) after a confirm prompt (to the system trash)","s":"snacks","cat":"Files","ctx":"Snacks explorer","n":"Trash is on by default and <code>trash<\/code>, <code>gio<\/code> and <code>kioclient<\/code> are installed here, so deletes are recoverable. Works on the multi-selection.","e":1,"sl":"delete"},{"k":"[w","m":["n"],"d":"Jump to the previous file with warnings","s":"snacks","cat":"Files","ctx":"Snacks explorer"},{"k":"f","m":["n"],"d":"Find file (Snacks files picker)","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard"},{"k":"n","m":["n"],"d":"New empty buffer in insert mode (:ene | startinsert)","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard"},{"k":"g","m":["n"],"d":"Find text (Snacks grep picker)","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard"},{"k":"r","m":["n"],"d":"Recent files (Snacks recent picker)","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard"},{"k":"c","m":["n"],"d":"Find a file in the Neovim config (stdpath('config'))","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard"},{"k":"q","m":["n"],"d":"Quit Neovim (:qa)","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard","n":"The item key overrides the dashboard's own <kbd>q<\/kbd> = <code>:bd<\/code>."},{"k":"<CR>","m":["n"],"d":"Run the item under the cursor","s":"snacks","cat":"UI & toggles","ctx":"Snacks dashboard","n":"There is no <kbd>s<\/kbd> (Restore Session) or <kbd>L<\/kbd> (Lazy) item: Snacks detects session plugins only under lazy.nvim, so under <code>vim.pack<\/code> persistence is not found. Use <kbd>Space q s<\/kbd> / <kbd>Space q l<\/kbd> instead."},{"k":"q","m":["n"],"d":"Close the scratch window (the buffer is saved automatically)","s":"snacks","cat":"Buffer & tab","ctx":"Snacks scratch window","n":"Scratch files live in <code>stdpath('data')/scratch<\/code>, keyed by name, filetype, count, cwd and git branch, and are written when hidden. <kbd>{count} Space .<\/kbd> opens scratch number {count}."},{"k":"<CR>","m":["n","x"],"d":"Run the Lua scratch buffer (or the selection) and show results inline","s":"snacks","cat":"Buffer & tab","ctx":"Snacks scratch window","n":"Only in Lua scratch buffers (<code>win_by_ft.lua<\/code>), via <code>Snacks.debug.run<\/code>."},{"k":"<leader>z","m":["n"],"d":"Leave zen mode (zen windows do not map q)","s":"snacks","cat":"UI & toggles","ctx":"Snacks zen / zoom","n":"Zen opens the buffer in a centred 120-col float with dimming and git signs hidden; <kbd>Space Z<\/kbd> is the zoom variant (full width, keeps statusline/tabline). Run the same key again, or <code>:close<\/code>, to restore."},{"k":"q","m":["n"],"d":"Close the notification history window","s":"snacks","cat":"UI & toggles","ctx":"Snacks notification history","n":"<kbd>Space n<\/kbd> opens <code>Snacks.notifier.show_history()<\/code> (the second of two <kbd>Space n<\/kbd> maps in <code>lua/keymaps.lua<\/code>, so it wins over the notifications picker)."},{"k":"<CR>","m":["i","n"],"d":"Confirm the input (or accept the completion item)","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<Esc>","m":["i"],"d":"Close completion, else leave insert mode in the prompt","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<Esc>","m":["n"],"d":"Cancel the prompt","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"q","m":["n"],"d":"Cancel the prompt","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<Up>","m":["i","n"],"d":"Previous entry from the input history","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<Down>","m":["i","n"],"d":"Next entry from the input history","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<Tab>","m":["i"],"d":"Trigger / cycle completion (when the prompt supports it)","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<C-w>","m":["i"],"d":"Delete the word before the cursor","s":"snacks","cat":"UI & toggles","ctx":"Snacks input (vim.ui.input prompts)","n":"Used by rename (<kbd>Space c R<\/kbd>), explorer add/rename/copy and any plugin calling <code>vim.ui.input<\/code>."},{"k":"<CR>","m":["n"],"d":"Open the actions menu for the issue / PR","s":"snacks","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"i","m":["n"],"d":"Edit the issue / PR (GitHub)","s":"snacks","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"a","m":["n"],"d":"Add a comment","s":"snacks","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"c","m":["n"],"d":"Close the issue / PR (GitHub) — or check out the PR (Forgejo)","s":"snacks","cat":"Git","ctx":"GitHub / Forgejo PR buffer","n":"In snacks-tea (Forgejo/Gitea) buffers <kbd>c<\/kbd> is checkout and <kbd>x<\/kbd> closes."},{"k":"o","m":["n"],"d":"Reopen the issue / PR","s":"snacks","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"d","m":["n"],"d":"View the PR diff (Forgejo)","s":"snacks-tea","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"A","m":["n"],"d":"Approve the PR (Forgejo)","s":"snacks-tea","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"x","m":["n"],"d":"Close the PR (Forgejo)","s":"snacks-tea","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"r","m":["n"],"d":"Refresh the PR buffer (Forgejo)","s":"snacks-tea","cat":"Git","ctx":"GitHub / Forgejo PR buffer"},{"k":"<C-s>","m":["n","i"],"d":"Submit the comment / review being written","s":"snacks-tea","cat":"Git","ctx":"Forgejo comment window","n":"The comment scratch window also has <kbd>Alt-w<\/kbd> cycle, <kbd>Ctrl-b<\/kbd>/<kbd>Ctrl-f<\/kbd> preview scroll."},{"k":"a","m":["n","x"],"d":"Comment on the diff line(s) under the cursor (preview window)","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_diff","n":"GitHub PR diff picker (<code>snacks.gh<\/code>). snacks-tea's Forgejo diff picker maps the same keys to actions it never defines, so they do nothing there."},{"k":"<CR>","m":["n","x"],"d":"Open the actions menu for the diff line(s) (preview window)","s":"snacks","cat":"Git","ctx":"Snacks picker · gh_diff","n":"GitHub PR diff picker (<code>snacks.gh<\/code>). snacks-tea's Forgejo diff picker maps the same keys to actions it never defines, so they do nothing there."},{"k":"<C-Space>","m":["i"],"d":"Open the completion menu; again: show docs, again: hide docs","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Never falls back, so <kbd>Ctrl-Space<\/kbd> always goes to blink in insert mode.","e":1,"sl":"complete"},{"k":"<C-y>","m":["i"],"d":"Accept the selected item (the first one if none is selected)","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Falls back to <kbd>Ctrl-y<\/kbd> (insert the character above) when the menu is closed.","e":1,"sl":"accept"},{"k":"<C-e>","m":["i"],"d":"Close the menu and undo the previewed insert","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Falls back to <kbd>Ctrl-e<\/kbd> (insert the character below) when the menu is closed.","e":1,"sl":"dismiss"},{"k":"<C-n>","m":["i"],"d":"Select the next item; with the menu closed, open it on the first item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Configured in <code>lua/plugins.lua<\/code>: <code>{ \"select_next\", \"show_and_insert\" }<\/code>. <kbd>Ctrl-p<\/kbd> mirrors it (opens on the last item). Built-in keyword completion is still on <kbd>Ctrl-x Ctrl-n<\/kbd>"},{"k":"<C-p>","m":["i"],"d":"Select the previous item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Same as <kbd>Ctrl-n<\/kbd>: no fallback to built-in completion."},{"k":"<Down>","m":["i"],"d":"Select the next item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"With the menu closed it falls back to this config's insert <kbd>Down<\/kbd> (move by display line, <code>lua/keymaps.lua<\/code>)."},{"k":"<Up>","m":["i"],"d":"Select the previous item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"With the menu closed it falls back to this config's insert <kbd>Up<\/kbd> (move by display line)."},{"k":"<C-f>","m":["i"],"d":"Scroll the documentation window down","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Falls back to <kbd>Ctrl-f<\/kbd> when no docs window is open."},{"k":"<C-b>","m":["i"],"d":"Scroll the documentation window up","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Falls back to <kbd>Ctrl-b<\/kbd> when no docs window is open."},{"k":"<Tab>","m":["i","s"],"d":"Next snippet field → apply AI next edit → accept ghost text → Tab","s":"config","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Custom chain in <code>lua/plugins.lua<\/code>: 1) <code>snippet_forward<\/code> if a snippet is active; 2) <code>sidekick.nes_jump_or_apply()<\/code> (jump to, then apply, a Copilot next-edit suggestion; suggestions are cleared on insert, so rarely fires here); 3) <code>vim.lsp.inline_completion.get()<\/code> accepts native LSP ghost text (Copilot); 4) a literal Tab. <kbd>Tab<\/kbd> does <em>not<\/em> accept the blink menu; use <kbd>Ctrl-y<\/kbd>.","e":1,"sl":"tab chain"},{"k":"<S-Tab>","m":["i","s"],"d":"Jump to the previous snippet field","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Falls back to <kbd>Shift-Tab<\/kbd>."},{"k":"<Tab>","m":["c"],"d":"Show the menu and insert the first match (accepts if it's the only one); then next","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"Ghost text previews the top match; the menu does not open by itself on <code>:<\/code> (only in the cmdline window)."},{"k":"<S-Tab>","m":["c"],"d":"Show the menu and insert the last match; then previous item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)"},{"k":"<C-Space>","m":["c"],"d":"Open the completion menu","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)"},{"k":"<C-n>","m":["c"],"d":"Select the next item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"With the menu closed it falls back to <kbd>Ctrl-n<\/kbd>: next completion match after <kbd>Tab<\/kbd>, otherwise the next (newer) command-line from history."},{"k":"<C-p>","m":["c"],"d":"Select the previous item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"With the menu closed it falls back to <kbd>Ctrl-p<\/kbd>: previous completion match, otherwise the previous (older) command-line from history."},{"k":"<Right>","m":["c"],"d":"Select the next item while the menu is open","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"Arrow keys only move the cursor when the menu is closed."},{"k":"<Left>","m":["c"],"d":"Select the previous item while the menu is open","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"Arrow keys only move the cursor when the menu is closed."},{"k":"<C-y>","m":["c"],"d":"Accept the selected item","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)"},{"k":"<C-e>","m":["c"],"d":"Close the menu and undo the preview","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"Falls back to <kbd>Ctrl-e<\/kbd> (cursor to end of line)."},{"k":"<End>","m":["c"],"d":"Hide the menu","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (cmdline)","n":"Falls back to <kbd>End<\/kbd>."},{"k":"<C-n> / <C-p> / <C-Space>","m":["t"],"d":"blink's terminal-mode keys: usually NOT active here","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion (terminal)","n":"blink enables terminal mode by default and inherits the insert keymap (minus snippet keys), but has no terminal sources and installs the maps only on a direct <code>n→t<\/code> mode change. Snacks terminals go <code>n→nt→t<\/code>, so in testing no blink maps were set and keys reached the shell. If they ever do get installed, <kbd>Ctrl-n<\/kbd>/<kbd>Ctrl-p<\/kbd>/<kbd>Ctrl-Space<\/kbd> are swallowed (verified by forcing them)."},{"k":"Copilot items","m":["i"],"d":"Copilot suggestions also appear as blink menu items (kind Copilot, ranked first)","s":"blink-copilot","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"Source <code>copilot<\/code> via blink-copilot: up to 3 completions, <code>score_offset = 100<\/code>. Sources order: lsp, path, snippets, buffer, copilot. Accept like any item with <kbd>Ctrl-y<\/kbd>."},{"k":"ghost text","m":["i"],"d":"Native LSP inline completion (Copilot ghost text) is enabled","s":"config","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"<code>vim.lsp.inline_completion.enable()<\/code> in <code>lua/plugins.lua<\/code>. Accept with <kbd>Tab<\/kbd> (3rd step of the chain); there is no key to cycle alternatives (<code>vim.lsp.inline_completion.select()<\/code> is unmapped)."},{"k":"<Tab>","m":["n"],"d":"Jump to the pending next-edit suggestion; press again to apply it","s":"config","cat":"Completion & AI","ctx":"Sidekick NES (Copilot next edit)","n":"<code>lua/keymaps.lua<\/code> maps normal <kbd>Tab<\/kbd> to <code>sidekick.nes_jump_or_apply()<\/code>; with no suggestion it falls back to jump forward. <kbd>Ctrl-i<\/kbd> is mapped separately for terminals that can tell the two apart","e":1,"sl":"NES"},{"k":"<Esc>","m":["n","i"],"d":"Dismiss the current next-edit suggestion","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick NES (Copilot next edit)","n":"Not a mapping: a <code>vim.on_key<\/code> watcher clears suggestions whenever <kbd>Esc<\/kbd> is typed (<code>nes.clear.esc = true<\/code>). Suggestions refresh on leaving insert mode and on text changes."},{"k":"<C-b>","m":["n","t"],"d":"Pick buffers to send to the AI tool","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-f>","m":["n","t"],"d":"Pick files to send to the AI tool","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-p>","m":["t"],"d":"Insert a prompt or context (incl. this config's haunt_all / haunt_buffer)","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code>. This config maps no key to open the CLI; use <code>:Sidekick cli toggle<\/code> / <code>select<\/code>. Custom prompts <code>haunt_all<\/code> and <code>haunt_buffer<\/code> send Haunt bookmarks."},{"k":"<C-.>","m":["n","t"],"d":"Hide the CLI window","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-z>","m":["n","t"],"d":"Go back to the previous window, keeping the CLI open","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-q>","m":["t"],"d":"Leave terminal mode (normal mode in the CLI)","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-q>","m":["n"],"d":"Hide the CLI window","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"q","m":["n"],"d":"Hide the CLI window","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<CR>","m":["n"],"d":"Send Enter to the tool and go back to terminal mode","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<C-h>","m":["t"],"d":"Move to the window on the left (split layouts only)","s":"sidekick","cat":"Completion & AI","ctx":"Sidekick AI CLI terminal","n":"Defaults from <code>sidekick/config.lua<\/code> (CLI window opens on the right, 80 cols). No key opens it in this config: use <code>:Sidekick cli toggle<\/code>."},{"k":"<BS>","m":["n","x","o"],"d":"Go back up one level in the key tree","s":"which-key","cat":"Help","ctx":"which-key popup","e":1},{"k":"<Esc>","m":["n","x","o"],"d":"Close the popup (and cancel the pending keys)","s":"which-key","cat":"Help","ctx":"which-key popup"},{"k":"<C-d>","m":["n","x","o"],"d":"Scroll the popup down","s":"which-key","cat":"Help","ctx":"which-key popup"},{"k":"<C-u>","m":["n","x","o"],"d":"Scroll the popup up","s":"which-key","cat":"Help","ctx":"which-key popup"},{"k":"{key}","m":["n","x","o"],"d":"Continue the key sequence / run the mapping shown next to it","s":"which-key","cat":"Help","ctx":"which-key popup","n":"The popup appears 200 ms after a prefix such as <kbd>Space<\/kbd>, <kbd>g<\/kbd>, <kbd>z<\/kbd>, <kbd>]<\/kbd> (0 ms for its plugin popups). Groups show with <code>+<\/code>."},{"k":"\"","m":["n","x"],"d":"Popup listing every register with its contents; type the register name","s":"which-key","cat":"Register & macro","ctx":"which-key popup","n":"which-key's <code>registers<\/code> plugin; the popup appears immediately."},{"k":"<C-r>","m":["i","c"],"d":"Popup listing registers before inserting one","s":"which-key","cat":"Register & macro","ctx":"which-key popup","n":"Verified as a buffer-local <code>which-key-trigger registers<\/code> map in insert mode."},{"k":"' ` g' g`","m":["n"],"d":"Popup listing marks with their line/file; type the mark name","s":"which-key","cat":"Mark & jump","ctx":"which-key popup","n":"which-key's <code>marks<\/code> plugin (normal mode only; its triggers are not installed in Visual or Operator-pending mode)."},{"k":"z=","m":["n"],"d":"Spelling suggestions popup: press 1-9, 0, a-z… to replace the word","s":"which-key","cat":"Spell","ctx":"which-key popup","n":"Shows 20 suggestions for the bad word under the cursor. With a count (<kbd>2z=<\/kbd>) Vim's own behaviour runs."},{"k":"<localleader>r","m":["n"],"d":"Replace: apply the replacement to every match","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>.","e":1},{"k":"<localleader>s","m":["n"],"d":"Sync all: write your edits of result lines back to the files","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Edit the result lines like normal text, then sync. Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>l","m":["n"],"d":"Sync the result line under the cursor","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>n","m":["n"],"d":"Sync the result line under the cursor, then move to the next match","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>p","m":["n"],"d":"Sync the result line under the cursor, then move to the previous match","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>v","m":["n"],"d":"Sync all changes in the current file","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>j","m":["n"],"d":"Apply the change on this line, drop it from the list, open the next one","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>k","m":["n"],"d":"Apply the change on this line, drop it from the list, open the previous one","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>q","m":["n"],"d":"Send the results to the quickfix list","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>t","m":["n"],"d":"Open search history (Enter picks an entry)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>a","m":["n"],"d":"Add the current search to history","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>f","m":["n"],"d":"Refresh (re-run the search)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>o","m":["n"],"d":"Open the match location (cursor stays in Grug-far)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>i","m":["n"],"d":"Preview the match location in a float","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>b","m":["n"],"d":"Abort the running search / replace","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>c","m":["n"],"d":"Close Grug-far","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>w","m":["n"],"d":"Toggle showing the underlying search command (rg / ast-grep)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>e","m":["n"],"d":"Cycle the search engine (ripgrep → astgrep → astgrep-rules)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<localleader>x","m":["n"],"d":"Cycle the replacement interpreter (default → lua → vimscript)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"Local leader is <kbd>\\<\/kbd>, so e.g. <kbd>\\ r<\/kbd>."},{"k":"<CR>","m":["n"],"d":"Go to the match location (in the other window)","s":"grug-far","cat":"Search","ctx":"Grug-far","n":"In the history buffer <kbd>Enter<\/kbd> picks the history entry."},{"k":"<Down>","m":["n"],"d":"Open the next match location","s":"grug-far","cat":"Search","ctx":"Grug-far"},{"k":"<Up>","m":["n"],"d":"Open the previous match location","s":"grug-far","cat":"Search","ctx":"Grug-far"},{"k":"<Tab>","m":["n"],"d":"Jump to the next input field (Search, Replace, Files filter, Flags, Paths)","s":"grug-far","cat":"Search","ctx":"Grug-far"},{"k":"<S-Tab>","m":["n"],"d":"Jump to the previous input field","s":"grug-far","cat":"Search","ctx":"Grug-far"},{"k":"g?","m":["n"],"d":"Show Grug-far help","s":"grug-far","cat":"Search","ctx":"Grug-far"},{"k":"<CR>","m":["n"],"d":"Restore the buffer to the undo state under the cursor","s":"undotree","cat":"Undo & repeat","ctx":"Undotree","n":"Toggle with <kbd>Space u u<\/kbd>. Config: focus jumps into the tree on toggle, 32-col panel, diff panel closed by default (<kbd>D<\/kbd>), help line hidden (<kbd>?<\/kbd> still works), Nerd Font tree glyphs. Persistent <code>undofile<\/code> is on, so history survives restarts.","e":1},{"k":"J","m":["n"],"d":"Move to the previous (older) undo state","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"K","m":["n"],"d":"Move to the next (newer) undo state","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"<","m":["n"],"d":"Move to the previous saved state","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":">","m":["n"],"d":"Move to the next saved state","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"u","m":["n"],"d":"Undo (in the target buffer)","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"<C-r>","m":["n"],"d":"Redo (in the target buffer)","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"D","m":["n"],"d":"Toggle the diff panel","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"=","m":["n"],"d":"Set the diff marker on this state (diff against it)","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"M","m":["n"],"d":"Clear the diff marker","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"T","m":["n"],"d":"Toggle relative / absolute timestamps","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"C","m":["n"],"d":"Clear the undo history (asks first)","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"<Tab>","m":["n"],"d":"Move focus back to the edited buffer","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"?","m":["n"],"d":"Toggle quick help","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"q","m":["n"],"d":"Close the undotree panel","s":"undotree","cat":"Undo & repeat","ctx":"Undotree"},{"k":"<CR>","m":["n"],"d":"Smart action: follow link / list tag / fold heading / toggle checkbox","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. In order: accept an inlay-hint action; follow the link under the cursor; open the tag picker on a tag; <code>za<\/code> on a heading if Markdown folding is on; otherwise toggle the line's checkbox (<code>create_new = true<\/code>, so plain lines become <code>- [ ]<\/code>; states cycle <code>[ ] [~] [!] [&gt;] [x]<\/code>). In vault notes this shadows the global Leap <kbd>Enter<\/kbd>.","e":1},{"k":"]o","m":["n"],"d":"Jump to the next link in the note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>."},{"k":"[o","m":["n"],"d":"Jump to the previous link in the note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>."},{"k":"gd","m":["n"],"d":"Follow the [[link]] under the cursor (obsidian LSP definition)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. obsidian.nvim starts an in-process LSP server for notes (definition, references, rename, code actions, symbols, completion of <code>[[<\/code> links and <code>#<\/code> tags), so the config's LSP keys work on notes."},{"k":"gr","m":["n"],"d":"List backlinks / references to this note or heading (obsidian LSP)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. obsidian.nvim starts an in-process LSP server for notes (definition, references, rename, code actions, symbols, completion of <code>[[<\/code> links and <code>#<\/code> tags), so the config's LSP keys work on notes."},{"k":"<leader>cr","m":["n"],"d":"Rename the note and update every link to it (LSP rename via IncRename)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. obsidian.nvim starts an in-process LSP server for notes (definition, references, rename, code actions, symbols, completion of <code>[[<\/code> links and <code>#<\/code> tags), so the config's LSP keys work on notes."},{"k":"<leader>ca","m":["n"],"d":"Obsidian code actions (e.g. link selection to new note, extract note)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. obsidian.nvim starts an in-process LSP server for notes (definition, references, rename, code actions, symbols, completion of <code>[[<\/code> links and <code>#<\/code> tags), so the config's LSP keys work on notes."},{"k":"<leader>ss","m":["n"],"d":"Headings outline of the note (LSP document symbols)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes","n":"Only in Markdown notes inside the vaults <code>~/Documents/Notebook<\/code> and <code>~/Documents/Notes<\/code>. obsidian.nvim starts an in-process LSP server for notes (definition, references, rename, code actions, symbols, completion of <code>[[<\/code> links and <code>#<\/code> tags), so the config's LSP keys work on notes."},{"k":":Obsidian today","m":[":"],"d":"Open (or create) today's daily note","s":"obsidian.nvim","cat":"Notes","n":"<code>legacy_commands = false<\/code>: only the <code>:Obsidian &lt;sub&gt;<\/code> form exists. Bare <code>:Obsidian<\/code> opens a menu of all subcommands."},{"k":":Obsidian yesterday","m":[":"],"d":"Open the daily note for the previous working day","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian tomorrow","m":[":"],"d":"Open the daily note for the next working day","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian dailies","m":[":"],"d":"Picker of daily notes","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian new","m":[":"],"d":"Create a new note (title as argument or prompt)","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian new_from_template","m":[":"],"d":"Create a new note from a template","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian open","m":[":"],"d":"Open a note in the Obsidian app","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian quick_switch","m":[":"],"d":"Fuzzy-find a note by name and open it","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian search","m":[":"],"d":"Grep the vault","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian tags","m":[":"],"d":"Picker of tags and the notes that use them","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian backlinks","m":[":"],"d":"Picker of notes linking to this note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian links","m":[":"],"d":"Picker of all links in this note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian follow_link","m":[":"],"d":"Follow the link under the cursor","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian link","m":[":"],"d":"Link the selection to an existing note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian link_new","m":[":"],"d":"Link the selection to a new note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian extract_note","m":[":"],"d":"Move the selection into a new note and link it","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian toggle_checkbox","m":[":"],"d":"Cycle the checkbox state on the line(s)","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian rename","m":[":"],"d":"Rename the note and update backlinks","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian template","m":[":"],"d":"Insert a template at the cursor","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian paste_img","m":[":"],"d":"Paste an image from the clipboard into the vault","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian toc","m":[":"],"d":"Table of contents of this note in a picker","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian footnotes","m":[":"],"d":"Picker of footnotes in this note","s":"obsidian.nvim","cat":"Notes","ctx":"Obsidian notes"},{"k":":Obsidian workspace","m":[":"],"d":"Show or switch the workspace (notebook / notes)","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian unique_note","m":[":"],"d":"Create a note with a unique (timestamp) id","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian bookmarks","m":[":"],"d":"Picker of bookmarked notes","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian rebuild_cache","m":[":"],"d":"Rebuild the vault cache","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian check","m":[":"],"d":"Check the vault for problems","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian sync","m":[":"],"d":"Run an Obsidian sync action","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian help","m":[":"],"d":"Find a page in obsidian.nvim's bundled help docs","s":"obsidian.nvim","cat":"Notes"},{"k":":Obsidian helpgrep","m":[":"],"d":"Grep obsidian.nvim's help vault","s":"obsidian.nvim","cat":"Notes"},{"k":"Bookmark signs","m":["n"],"d":"Haunt: bookmarks show a 󱙝 sign and the annotation as end-of-line virtual text","s":"haunt","cat":"Mark & jump","ctx":"Haunt bookmarks","n":"<kbd>Space h a<\/kbd> annotates (creating the bookmark if needed; empty input cancels), <kbd>Space h t<\/kbd> toggles the annotation text, <kbd>Space h n<\/kbd>/<kbd>p<\/kbd> walk bookmarks, <kbd>Space h d<\/kbd> deletes, <kbd>Space h l<\/kbd> lists. Stored per project and per git branch."},{"k":":IncRename {new}","m":[":"],"d":"Rename the LSP symbol with a live preview of every change","s":"inc-rename","cat":"LSP & diagnostics","ctx":"IncRename (Space c r)","n":"<kbd>Space c r<\/kbd> types <code>:IncRename &lt;cword&gt;<\/code> for you; with Noice's <code>inc_rename<\/code> preset the command line appears as a small popup above the cursor. Edit the name and watch all occurrences update (highlighted <code>Substitute<\/code>); <kbd>Enter<\/kbd> renames across files, <kbd>Esc<\/kbd> cancels. An empty name cancels the preview.","e":1},{"k":"format on save","m":["n"],"d":"Buffers are formatted on every write","s":"conform","cat":"Edit","ctx":"Conform","n":"<code>format_on_save<\/code> (500 ms, LSP fallback) in <code>lua/plugins.lua<\/code>; set <code>vim.g.disable_autoformat<\/code> / <code>vim.b.disable_autoformat<\/code> to turn it off. Autosave on InsertLeave/TextChanged means this runs often."},{"k":":Gitsigns nav_hunk next","m":[":"],"d":"Jump to the next changed hunk","s":"gitsigns","cat":"Git","n":"Hunk navigation is NOT mapped in this config (no ]c/[c, no <leader>h… gitsigns keys); use these commands. The older <code>next_hunk<\/code> / <code>prev_hunk<\/code> still work but are deprecated."},{"k":":Gitsigns nav_hunk prev","m":[":"],"d":"Jump to the previous changed hunk","s":"gitsigns","cat":"Git","n":"Hunk navigation is NOT mapped in this config (no ]c/[c, no <leader>h… gitsigns keys); use these commands. The older <code>next_hunk<\/code> / <code>prev_hunk<\/code> still work but are deprecated."},{"k":":Gitsigns nav_hunk first|last","m":[":"],"d":"Jump to the first / last hunk in the file","s":"gitsigns","cat":"Git"},{"k":":Gitsigns preview_hunk","m":[":"],"d":"Show the hunk's diff in a float","s":"gitsigns","cat":"Git"},{"k":":Gitsigns preview_hunk_inline","m":[":"],"d":"Show the hunk's removed lines inline","s":"gitsigns","cat":"Git"},{"k":":Gitsigns stage_hunk","m":[":"],"d":"Stage the hunk under the cursor (or the range); on a staged hunk it unstages","s":"gitsigns","cat":"Git"},{"k":":Gitsigns reset_hunk","m":[":"],"d":"Discard the hunk under the cursor (or the range)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns undo_stage_hunk","m":[":"],"d":"Undo the last stage_hunk (deprecated: run stage_hunk on the staged hunk)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns stage_buffer","m":[":"],"d":"Stage the whole file","s":"gitsigns","cat":"Git"},{"k":":Gitsigns reset_buffer","m":[":"],"d":"Discard all changes in the file","s":"gitsigns","cat":"Git"},{"k":":Gitsigns reset_buffer_index","m":[":"],"d":"Unstage the whole file","s":"gitsigns","cat":"Git"},{"k":":Gitsigns select_hunk","m":[":"],"d":"Visually select the hunk","s":"gitsigns","cat":"Git"},{"k":":Gitsigns blame_line","m":[":"],"d":"Show blame for the current line in a float","s":"gitsigns","cat":"Git"},{"k":":Gitsigns blame","m":[":"],"d":"Open a full-file blame side panel","s":"gitsigns","cat":"Git"},{"k":":Gitsigns diffthis","m":[":"],"d":"Diff the file against the index (or a revision)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns show","m":[":"],"d":"Open the file as it was at a revision","s":"gitsigns","cat":"Git"},{"k":":Gitsigns toggle_current_line_blame","m":[":"],"d":"Toggle line blame (shown in lualine here, not virtual text)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns toggle_word_diff","m":[":"],"d":"Toggle word-level diff highlighting","s":"gitsigns","cat":"Git"},{"k":":Gitsigns toggle_linehl","m":[":"],"d":"Toggle highlighting changed lines","s":"gitsigns","cat":"Git"},{"k":":Gitsigns toggle_numhl","m":[":"],"d":"Toggle highlighting changed line numbers","s":"gitsigns","cat":"Git"},{"k":":Gitsigns toggle_deleted","m":[":"],"d":"Toggle showing deleted lines inline (deprecated: use preview_hunk_inline)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns setqflist all","m":[":"],"d":"Send hunks to the quickfix list (current file, or all)","s":"gitsigns","cat":"Git"},{"k":":Gitsigns change_base","m":[":"],"d":"Diff signs against another revision","s":"gitsigns","cat":"Git"},{"k":"<CR>","m":["n"],"d":"Open the blame context menu","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"r","m":["n"],"d":"Re-blame at this commit","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"R","m":["n"],"d":"Re-blame at the commit's parent","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"d","m":["n"],"d":"Diff this commit (new tab)","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"s","m":["n"],"d":"Show the commit in a vertical split","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"S","m":["n"],"d":"Show the commit in a new tab","s":"gitsigns","cat":"Git","ctx":"Gitsigns blame panel (:Gitsigns blame)"},{"k":"q","m":["n"],"d":"Close the gitsigns popup (after entering it)","s":"gitsigns","cat":"Git","ctx":"Gitsigns preview / blame float"},{"k":"q","m":["n"],"d":"Close the message split / popup (:Noice, :Noice last, errors)","s":"noice","cat":"Command line","ctx":"Noice","n":"Long messages (≥ 20 lines) go to a split (<code>long_message_to_split<\/code>). <code>:<\/code> opens a centred command palette popup, <code>/<\/code> and <code>?<\/code> stay at the bottom (<code>bottom_search<\/code>). Noice defines no other keys; scrolling LSP docs with <kbd>Ctrl-f<\/kbd>/<kbd>Ctrl-b<\/kbd> is not configured."},{"k":"K / gx","m":["n"],"d":"Inside Noice hover/docs windows: open the link under the cursor","s":"noice","cat":"LSP & diagnostics","ctx":"Noice","n":"Buffer-local in Noice markdown views; otherwise they fall through to normal <kbd>K<\/kbd>/<kbd>gx<\/kbd>."},{"k":"i","m":["n"],"d":"Install the package under the cursor","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"u","m":["n"],"d":"Update / reinstall the package","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"X","m":["n"],"d":"Uninstall the package","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"c","m":["n"],"d":"Check the package for a new version","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"U","m":["n"],"d":"Update all installed packages","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"C","m":["n"],"d":"Check which packages are outdated","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"<CR>","m":["n"],"d":"Expand the package details / toggle its install log","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"<C-c>","m":["n"],"d":"Cancel the installation","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"<C-f>","m":["n"],"d":"Filter by language","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"1 2 3 4 5","m":["n"],"d":"Show All / LSP / DAP / Linter / Formatter packages","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"g?","m":["n"],"d":"Toggle help","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"q","m":["n"],"d":"Close the window","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"<Esc>","m":["n"],"d":"Clear the language filter / search, else close","s":"mason","cat":"LSP & diagnostics","ctx":"Mason"},{"k":"y{motion}","m":["n","x"],"d":"Yank into the paste window (edit, then send it to the shell)","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback","n":"A plain yank opens a small paste window below; <code>\"+y<\/code> instead copies to the clipboard and quits back to Kitty. Only inside a kitty-scrollback.nvim session (opened from a Kitty mapping generated by <code>:KittyScrollbackGenerateKittens<\/code>)."},{"k":"<leader>y{motion}","m":["n"],"d":"Yank {motion} to the system clipboard and return to Kitty","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"<leader>y","m":["x"],"d":"Yank the selection to the system clipboard and return to Kitty","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"<leader>yy","m":["n"],"d":"Yank the line to the clipboard and return to Kitty","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"<leader>Y","m":["n"],"d":"Yank to end of line to the clipboard and return to Kitty","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback","n":"The visual <kbd>Space Y<\/kbd> default points at an undefined &lt;Plug&gt; map in this plugin version, so it does nothing."},{"k":"<C-CR>","m":["n","i","x"],"d":"Execute the paste window text (or selection) in the shell","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"<S-CR>","m":["n","i","x"],"d":"Paste the text (or selection) to the shell without running it","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"g?","m":["n"],"d":"Toggle the paste window's key footer","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"q","m":["n"],"d":"Close the paste window, or quit back to Kitty from the scrollback","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":"<C-c>","m":["n","i","t"],"d":"Quit back to Kitty","s":"kitty-scrollback","cat":"Terminal","ctx":"Kitty scrollback"},{"k":":Browse [url]","m":[":"],"d":"gx.nvim: open the URL / file / plugin / GitHub ref / package under the cursor","s":"gx","cat":"Misc","n":"Also on <kbd>gx<\/kbd> (Normal and Visual, <code>lua/keymaps.lua:358<\/code>). Handlers: plugin names → GitHub, <code>#123<\/code> issues, package.json deps, search fallback."},{"k":":Qalc[!] [file]","m":[":"],"d":"Open a calculator buffer: each line is evaluated by qalc as you type","s":"qalc","cat":"Misc","n":"Results appear as virtual text; <code>!<\/code> makes it a scratch buffer. <code>*.qalc<\/code> files attach automatically. <code>:QalcYank [reg]<\/code> yanks the result of the current line (the unnamed register when none is given)."},{"k":"<leader>cb…","m":["n","v"],"d":"Comment boxes: cbb centred box, cbl centred line, cbd delete, cbk catalog","s":"comment-box","cat":"Comment","ctx":"Comment-box","n":"The box and line commands take a style number (see the catalog) and work on a range; e.g. <code>:CBccbox 3<\/code>. <code>:CBd<\/code> removes a box, <code>:CBy<\/code> yanks a box's text without the frame."},{"k":":Mason","m":[":"],"d":"Open Mason's package manager window","s":"mason","cat":"LSP & diagnostics"},{"k":":Sidekick nes toggle","m":[":"],"d":"Enable / disable Copilot next-edit suggestions","s":"sidekick","cat":"Completion & AI","n":"Other subcommands: <code>nes apply|jump|update|clear|enable|disable<\/code>, <code>cli toggle|show|hide|close|focus|select|send|prompt<\/code>."},{"k":":Sidekick cli toggle","m":[":"],"d":"Open / hide the AI CLI terminal (claude, codex, copilot, gemini…)","s":"sidekick","cat":"Completion & AI"},{"k":":Noice","m":[":"],"d":"Message history in a split (also :Noice last / errors / all / dismiss)","s":"noice","cat":"Command line"},{"k":"<C-k>","m":["i"],"d":"Not mapped by blink: insert a digraph (Vim's i_CTRL-K)","s":"blink.cmp","cat":"Completion & AI","ctx":"Completion menu (insert)","n":"The preset's signature toggle is disabled (<code>[\"&lt;C-k&gt;\"] = false<\/code>) so digraphs work; signature help shows automatically, or press Neovim's <kbd>Ctrl-s<\/kbd>"}],"notes":[{"title":"The grammar: operator + count + motion","kind":"tip","lead":"Most editing is a sentence: a verb (operator) applied to a noun (motion or text object).","rows":[["<kbd>d<\/kbd><kbd>w<\/kbd>","delete to the next word"],["<kbd>c<\/kbd><kbd>i<\/kbd><kbd>\"<\/kbd>","change inside the quotes"],["<kbd>y<\/kbd><kbd>a<\/kbd><kbd>p<\/kbd>","yank a paragraph"],["<kbd>g<\/kbd><kbd>U<\/kbd><kbd>i<\/kbd><kbd>w<\/kbd>","uppercase the word"],["<kbd>&gt;<\/kbd><kbd>i<\/kbd><kbd>B<\/kbd>","indent the inside of a { } block"],["<kbd>d<\/kbd><kbd>t<\/kbd><kbd>)<\/kbd>","delete up to the next )"],["<kbd>d<\/kbd><kbd>d<\/kbd> · <kbd>g<\/kbd><kbd>c<\/kbd><kbd>c<\/kbd>","doubling the operator acts on the whole line"]],"note":"Learn one new operator and it works with every motion you already know.","keys":["d","c","y","gU",">","gc"]},{"title":"Counts and the dot","kind":"tip","lead":"A number in front repeats or scales; <kbd>.<\/kbd> repeats the last change.","rows":[["<kbd>3<\/kbd><kbd>w<\/kbd> · <kbd>d<\/kbd><kbd>3<\/kbd><kbd>w<\/kbd> · <kbd>3<\/kbd><kbd>d<\/kbd><kbd>w<\/kbd>","all the same: the count can go before the operator or the motion"],["<kbd>5<\/kbd><kbd>j<\/kbd>","5 real lines down (relative numbers are on in this config)"],["<kbd>4<\/kbd><kbd>G<\/kbd> · <kbd>50<\/kbd><kbd>%<\/kbd>","go to line 4 · go halfway through the file"],["<kbd>.<\/kbd> · <kbd>3<\/kbd><kbd>.<\/kbd>","repeat the last change · repeat it with count 3"],["<kbd>*<\/kbd><kbd>c<\/kbd><kbd>g<\/kbd><kbd>n<\/kbd>…<kbd>.<\/kbd><kbd>.<\/kbd>","change the word under the cursor, then each next match"],["<kbd>q<\/kbd><kbd>a<\/kbd> … <kbd>q<\/kbd> · <kbd>10<\/kbd><kbd>@<\/kbd><kbd>a<\/kbd>","record a macro, replay it 10 times (<kbd>Q<\/kbd> replays the last one)"]],"keys":[".","@","Q","gn"]},{"title":"Registers in this config","kind":"tip","lead":"Put <kbd>\"<\/kbd>{reg} before a yank, delete or put to choose where text goes.","rows":[["<kbd>y<\/kbd> · <kbd>p<\/kbd>","'clipboard' is unnamedplus: yank and put use the system clipboard"],["<kbd>d<\/kbd> <kbd>c<\/kbd> <kbd>x<\/kbd> <kbd>D<\/kbd> <kbd>C<\/kbd> <kbd>X<\/kbd>","mapped to <code>\"d<\/code>…: deleted text lands in register <code>d<\/code>, the clipboard stays clean"],["<kbd>\"<\/kbd><kbd>d<\/kbd><kbd>p<\/kbd>","paste what you just deleted"],["<kbd>\"<\/kbd><kbd>0<\/kbd><kbd>p<\/kbd>","paste the last yank"],["<kbd>\"<\/kbd><kbd>_<\/kbd><kbd>d<\/kbd>…","black hole register: in this config it is overridden by the <code>\"d<\/code> mapping, use <code>:normal! \"_d…<\/code>"],["<kbd>&lt;C-r&gt;<\/kbd>{reg}","insert a register in Insert or Command-line mode"],["<kbd>:reg<\/kbd>","show what every register holds"]],"note":"Because d/c/x are mappings that prepend <code>\"d<\/code>, any register you type before them is replaced by <code>d<\/code> (checked: <code>\"adiw<\/code> fills <code>\"d<\/code>, not <code>\"a<\/code>).","keys":["\"","p","d"]},{"title":"Leader is Space, local leader is backslash","kind":"change","lead":"Set before any plugin loads, so every plugin sees them.","rows":[["<kbd>&lt;Space&gt;<\/kbd>","<code>&lt;leader&gt;<\/code>: 80+ Normal-mode maps and a few Visual ones, grouped as listed in the which-key popup"],["<kbd>\\<\/kbd>","<code>&lt;localleader&gt;<\/code> (plugin buffer keys such as Grug-far's)"],["<kbd>&lt;Space&gt;<\/kbd> alone","No longer moves right like <kbd>l<\/kbd>: Neovim waits for the next key (which-key shows the options)"]],"note":"<code>lua/options.lua:15-16<\/code>","keys":["<Space>"]},{"title":"Yank and put use the system clipboard","kind":"change","lead":"<code>clipboard=unnamedplus<\/code>: every yank, delete and put that would use the unnamed register uses <code>\"+<\/code> instead.","rows":[["<kbd>y<\/kbd> <kbd>yy<\/kbd> <kbd>Y<\/kbd>","Copy to the system clipboard (<code>\"+<\/code>) and <code>\"0<\/code>"],["<kbd>p<\/kbd> <kbd>P<\/kbd>","Paste the system clipboard: your last yank, or whatever another app copied"],["<kbd>\"0p<\/kbd>","Last yank made inside Neovim, even after copying elsewhere"]],"note":"<code>lua/keymaps.lua:13<\/code>. Deletes are redirected, see the next card.","keys":["y","p","P"]},{"title":"Deleting never touches the clipboard: d c x go to register d","kind":"change","lead":"Applies in Normal and Visual mode. A register you type first still wins.","rows":[["<kbd>d<\/kbd> <kbd>D<\/kbd> <kbd>c<\/kbd> <kbd>C<\/kbd> <kbd>x<\/kbd> <kbd>X<\/kbd>","Run as <code>\"dd<\/code>, <code>\"dD<\/code>, … so the deleted text lands in <code>\"d<\/code> (and <code>\"1<\/code> for whole lines)"],["<kbd>\"a<\/kbd><kbd>d<\/kbd>… <kbd>\"_<\/kbd><kbd>d<\/kbd>…","An explicit register is honoured (black hole works); only <kbd>\"+<\/kbd> is treated as the default, so use <kbd>yy<\/kbd> then <kbd>dd<\/kbd> to cut to the clipboard"],["<kbd>\"dp<\/kbd>","Paste what you just deleted (plain <kbd>p<\/kbd> pastes the clipboard)"],["<kbd>xp<\/kbd> <kbd>ddp<\/kbd>","Classic swap idioms paste the clipboard instead; use <kbd>x\"dp<\/kbd> / <kbd>dd\"dp<\/kbd>"],["<kbd>cc<\/kbd> <kbd>cw<\/kbd> <kbd>ciw<\/kbd>…","Change commands also go to <code>\"d<\/code>"],["Visual <kbd>p<\/kbd>","Not remapped: the replaced text overwrites the clipboard. Use Visual <kbd>P<\/kbd> to keep it"]],"note":"<code>lua/keymaps.lua:17-28<\/code>","keys":["d","D","c","C","x","X","p"]},{"title":"j k and arrows move by display line","kind":"change","lead":"'wrap' is on, so long lines span several screen rows.","rows":[["<kbd>j<\/kbd> <kbd>k<\/kbd> <kbd>&lt;Down&gt;<\/kbd> <kbd>&lt;Up&gt;<\/kbd>","No count: like <kbd>gj<\/kbd>/<kbd>gk<\/kbd>, one wrapped screen row at a time"],["<kbd>5j<\/kbd> <kbd>12k<\/kbd>","With a count: real lines, so relative numbers still line up"],["<kbd>1j<\/kbd>","A real line down even on wrapped text (useful in macros)"],["<kbd>dj<\/kbd> <kbd>yk<\/kbd>","Operator-pending is not mapped: still linewise"],["Insert <kbd>&lt;Down&gt;<\/kbd> <kbd>&lt;Up&gt;<\/kbd>","Display-line moves too, unless a completion menu is open"]],"note":"A recorded macro that uses a bare <kbd>j<\/kbd> moves by screen row on wrapped lines; use <kbd>+<\/kbd> or <kbd>1j<\/kbd>. <code>lua/keymaps.lua:36-52<\/code>","keys":["j","k","<Down>","<Up>"]},{"title":"Enter does not work in quickfix and q: windows","kind":"warn","lead":"The global <code>&lt;CR&gt;<\/code> map wins because those windows have no buffer-local <code>&lt;CR&gt;<\/code> map.","rows":[["Quickfix / location list <kbd>&lt;CR&gt;<\/kbd>","Starts a Leap instead of opening the entry under the cursor"],["Command-line window <kbd>q:<\/kbd> <kbd>q/<\/kbd> <kbd>&lt;CR&gt;<\/kbd>","Starts a Leap instead of running the line"],["Instead","<code>:.cc<\/code> / <code>:.ll<\/code>, <kbd>&lt;C-W&gt;&lt;CR&gt;<\/kbd> (opens the entry in a split), or <kbd>i<\/kbd> then <kbd>&lt;CR&gt;<\/kbd> in <kbd>q:<\/kbd>"],["Fix","Map <kbd>&lt;CR&gt;<\/kbd> back buffer-locally on <code>FileType qf<\/code> and <code>CmdwinEnter<\/code>, or pick a different Leap key"]],"note":"Verified headless for both windows. <code>lua/keymaps.lua:352<\/code>","keys":["<CR>"]},{"title":"LSP keys open Snacks pickers","kind":"change","rows":[["<kbd>gd<\/kbd> <kbd>gD<\/kbd> <kbd>gI<\/kbd> <kbd>gy<\/kbd>","Definition, declaration, implementation, type definition"],["<kbd>grr<\/kbd> <kbd>gai<\/kbd> <kbd>gao<\/kbd>","References, incoming calls, outgoing calls"],["<kbd>&lt;leader&gt;ss<\/kbd> <kbd>&lt;leader&gt;sS<\/kbd>","Document / workspace symbols"],["<kbd>grn<\/kbd> <kbd>gra<\/kbd> <kbd>gri<\/kbd> <kbd>grt<\/kbd> <kbd>grx<\/kbd>","Neovim's own LSP keys: rename, code action, implementation, type definition, run code lens"],["<kbd>K<\/kbd> <kbd>&lt;leader&gt;ca<\/kbd> <kbd>&lt;leader&gt;cr<\/kbd>","Hover, code action, rename (IncRename with live preview)"],["Lost","Vim's search-based <kbd>gd<\/kbd>/<kbd>gD<\/kbd> (work without LSP), <kbd>gI<\/kbd> (use <kbd>0i<\/kbd>), and <kbd>K<\/kbd>'s <code>'keywordprg'<\/code> (use <code>:Man<\/code> / <code>:help<\/code>)"]],"note":"Global maps, active in every buffer; without an LSP client they find nothing. <code>lua/keymaps.lua:233-276<\/code>","keys":["gd","gD","gI","gy","grr","grn","gra","gai","gao","K"]},{"title":"Tab is Sidekick's next-edit suggestion","kind":"change","lead":"Copilot runs as an LSP server; ghost text comes from <code>vim.lsp.inline_completion<\/code>.","rows":[["Normal <kbd>&lt;Tab&gt;<\/kbd>","Jump to the next-edit suggestion, press again to apply it; with none, a plain jump forward"],["Insert <kbd>&lt;Tab&gt;<\/kbd>","In order: next snippet placeholder, Sidekick NES jump/apply, accept the Copilot ghost text, else a normal Tab"],["<kbd>&lt;C-I&gt;<\/kbd>","Mapped to itself, so where the terminal tells it apart from <kbd>&lt;Tab&gt;<\/kbd> (kitty, Neovide) it is always jump forward"]],"note":"<code>lua/keymaps.lua:338-347<\/code>; Insert chain <code>lua/plugins.lua<\/code> (blink <code>keymap<\/code>); see <code>:help CTRL-I<\/code>","keys":["<Tab>","<C-I>"]},{"title":":Q writes everything and quits","kind":"change","rows":[["<code>:Q<\/code>","Runs <code>:xa!<\/code>: write all changed buffers, read-only ones too, then quit"],["Still blocked by","Unnamed buffers or files that cannot be written"]],"note":"<code>lua/keymaps.lua:58<\/code>","keys":[":Q"]},{"title":"Files save themselves","kind":"change","lead":"Only normal file buffers (empty 'buftype').","rows":[["Leaving Insert mode","<code>:update<\/code> (only if modified)"],["Any Normal-mode change","<kbd>x<\/kbd>, <kbd>dd<\/kbd>, <kbd>p<\/kbd>, <kbd>u<\/kbd>, <kbd>.<\/kbd>… also save at once"],["<code>'autowrite'<\/code>","On: <code>:make<\/code>, <code>:next<\/code>, <kbd>&lt;C-]&gt;<\/kbd>… write first"],["Undo","Persistent ('undofile'): <kbd>u<\/kbd>, <kbd>&lt;leader&gt;uu<\/kbd> undotree, <kbd>&lt;leader&gt;su<\/kbd> picker; <code>:e!<\/code> cannot revert what is already saved"]],"note":"Each save also runs format-on-save, see the next card. <code>lua/options.lua:25<\/code>, <code>:34<\/code>, <code>:38-47<\/code>","keys":["u"]},{"title":"Formatting","kind":"tip","rows":[["On save","conform formats every write (<code>format_on_save<\/code>, 500 ms); autosave makes that after each change. Turn off with <code>vim.g.disable_autoformat<\/code> / <code>vim.b.disable_autoformat<\/code>"],["<kbd>&lt;leader&gt;cf<\/kbd>","Format the buffer; in Visual mode only the selected lines"],["<code>:Format<\/code> <code>:'&lt;,'&gt;Format<\/code>","Same, async, optional range"],["Formatters","stylua (Lua), clang-format (C/C++), rustfmt, ruff_format (Python), fish_indent, shfmt (sh/bash). Install them yourself (PATH or <code>:MasonInstall<\/code>): mason-lspconfig only installs LSP servers"],["Other filetypes","LSP formatting when the server supports it (<code>lsp_format = \"fallback\"<\/code>)"]],"note":"<code>lua/plugins.lua:249-268<\/code>; <code>lua/keymaps.lua:363-365<\/code>; <code>lua/options.lua:69-79<\/code>","keys":["<Space>cf"]},{"title":"Working directory follows the buffer","kind":"change","rows":[["On <code>BufEnter<\/code>","<code>:cd<\/code> to the project root of the file (global, all windows)"],["Root markers","Tried in order over all parent dirs: <code>.git<\/code>, then <code>lua<\/code>, <code>package.json<\/code>, <code>go.mod<\/code>, <code>Cargo.toml<\/code>, <code>Makefile<\/code>; else the file's own directory"],["Affects","<kbd>&lt;leader&gt;ff<\/kbd>, <kbd>&lt;leader&gt;/<\/kbd>, <kbd>&lt;leader&gt;sr<\/kbd>, <code>:e relative/path<\/code>, new terminals, <code>:make<\/code>"],["Skipped","Special buffers (help, terminals, pickers), except the Snacks explorer"]],"note":"<code>lua/options.lua:100-124<\/code>; marker order per <code>vim.fs.root()<\/code>"},{"title":"Small automatic behaviours","kind":"change","rows":[["Reopen a file","Cursor returns to where you left it (<kbd>g`\"<\/kbd>), <code>lua/options.lua:82-91<\/code>"],["File changed outside","Reloaded on focus and when idle (<code>checktime<\/code> on FocusGained/CursorHold, 'updatetime' 200 ms) if the buffer has no unsaved edits, <code>lua/options.lua:50-63<\/code>"],["Line numbers","Absolute current line + relative others, made for counts like <kbd>5j<\/kbd>, <code>lua/options.lua:26-27<\/code>"],["Indent","2 spaces, 'expandtab', <code>lua/options.lua:19-21<\/code>"],["Terminal title","<code>NVIM: file<\/code>, reset to the shell name on exit, <code>lua/options.lua:139-192<\/code>"]]},{"title":"]] and [[ jump between references","kind":"change","rows":[["<kbd>]]<\/kbd> <kbd>[[<\/kbd>","Next / previous LSP reference of the word under the cursor (Snacks words, counts work)"],["Markdown buffers","Buffer-local ftplugin maps win: next / previous heading"],["Terminal buffers (Normal mode)","Neovim's buffer-local defaults win: previous / next shell prompt"],["Section motions","Still available in Visual and Operator-pending mode (<kbd>v]]<\/kbd>, <kbd>d]]<\/kbd>)"]],"note":"<code>lua/keymaps.lua:315-320<\/code>","keys":["]]","[["]},{"title":"Terminal and scratch","kind":"tip","rows":[["<kbd>&lt;C-/&gt;<\/kbd>","Toggle a floating terminal (Normal and Terminal mode; <kbd>&lt;C-_&gt;<\/kbd> in legacy terminals)"],["<kbd>&lt;C-\\&gt;&lt;C-N&gt;<\/kbd>","Terminal mode to Normal mode (built-in)"],["<kbd>&lt;leader&gt;gg<\/kbd>","Lazygit in a floating terminal"],["<kbd>&lt;leader&gt;.<\/kbd> <kbd>&lt;leader&gt;S<\/kbd>","Toggle / pick a persistent scratch buffer"]],"note":"<code>lua/keymaps.lua:285-314<\/code>; <code>lua/plugins.lua:106-120<\/code>","keys":["<C-/>","<C-_>"]},{"title":"Picker extras from this config","kind":"tip","rows":[["<kbd>s<\/kbd> (input, Normal)","Flash labels on the result list: jump to an item in 2 keys"],["<kbd>&lt;A-s&gt;<\/kbd>","The same from Insert mode"],["<kbd>&lt;A-a&gt;<\/kbd>","Send the item(s) to the Sidekick AI CLI"],["Matching","Fuzzy, smart-case, frecency and cwd bonus"]],"note":"<code>lua/plugins.lua:46-91<\/code>","keys":["<A-s>","<A-a>"]},{"title":"Sessions and bookmarks","kind":"tip","rows":[["<kbd>&lt;leader&gt;qs<\/kbd> <kbd>&lt;leader&gt;ql<\/kbd> <kbd>&lt;leader&gt;qS<\/kbd>","Restore the session for this directory + git branch, the last one, or pick one"],["<kbd>&lt;leader&gt;qd<\/kbd>","Do not save this session on exit (saved automatically otherwise)"],["<kbd>&lt;leader&gt;ha<\/kbd>","Bookmark the line with a note (virtual text), <kbd>&lt;leader&gt;ht<\/kbd> shows/hides it"],["<kbd>&lt;leader&gt;hn<\/kbd> <kbd>&lt;leader&gt;hp<\/kbd> <kbd>&lt;leader&gt;hl<\/kbd>","Next / previous bookmark, bookmark picker"]],"note":"<code>lua/keymaps.lua:382-416<\/code>; <code>lua/plugins.lua:133-138<\/code>, <code>:541-546<\/code>","keys":["<Space>qs","<Space>ha"]},{"title":"Neovide-only clipboard keys","kind":"tip","rows":[["<kbd>&lt;C-S-v&gt;<\/kbd>","Paste the clipboard in every mode (Normal: an empty line is replaced)"],["<kbd>&lt;C-S-c&gt;<\/kbd>","Copy the selection, or the current line in Normal mode"],["<kbd>&lt;C-S-x&gt;<\/kbd>","Cut the selection or line to the clipboard (bypasses the <code>\"d<\/code> remap)"]],"note":"<code>lua/options.lua:198-242<\/code>; only when <code>vim.g.neovide<\/code> is set.","keys":["<C-S-V>","<C-S-C>","<C-S-X>"]},{"title":"f/t are Flash now","kind":"change","lead":"<kbd>f<\/kbd> <kbd>F<\/kbd> <kbd>t<\/kbd> <kbd>T<\/kbd> <kbd>;<\/kbd> <kbd>,<\/kbd> are flash.nvim's char mode, kept to the cursor line (<code>multi_line = false<\/code>) with no jump labels.","rows":[["<kbd>f<\/kbd><kbd>x<\/kbd>","Jump to the next <code>x<\/code>; every <code>x<\/code> on the line lights up and the rest dims"],["<kbd>f<\/kbd> again","While lit: next <code>x<\/code> without retyping it. <kbd>F<\/kbd> goes the other way"],["<kbd>;<\/kbd> / <kbd>,<\/kbd>","Repeat in the same / opposite direction, any time later"],["<kbd>3<\/kbd><kbd>f<\/kbd><kbd>x<\/kbd>","Counts work; no wrap, never leaves the line"],["<kbd>`<\/kbd><kbd>`<\/kbd>","Each Flash jump sets the <code>'<\/code> mark, so you can jump back (not <kbd>Ctrl-O<\/kbd>: same line)"],["<kbd>Esc<\/kbd>","Clears the highlights"]],"note":"After <code>Fx<\/code>, <kbd>F<\/kbd> again moves <em>right<\/em> (flash maps lowercase = next in the motion's direction, uppercase = previous).","keys":["f","F","t","T",";",","]},{"title":"Leap on Enter and S","kind":"change","lead":"<kbd>Enter<\/kbd> starts a Leap jump in the current window (Normal, Visual, Operator-pending); <kbd>S<\/kbd> leaps into another window.","rows":[["<kbd>Enter<\/kbd><kbd>a<\/kbd><kbd>b<\/kbd>","Jump to an <code>ab<\/code> pair; if the closest is unlabeled you're already there, else type its label"],["<kbd>Enter<\/kbd><kbd>Enter<\/kbd>","Repeat the previous Leap search"],["<kbd>Enter<\/kbd><kbd>x<\/kbd><kbd>Enter<\/kbd>","Jump to the closest <code>x<\/code>"],["<kbd>Space<\/kbd> / <kbd>Backspace<\/kbd>","Next / previous group of labels"],["<kbd>x<\/kbd><kbd>Space<\/kbd>","<code>x<\/code> before whitespace or at the end of a line; <kbd>Space<\/kbd><kbd>Space<\/kbd> targets line ends and empty lines"],["<kbd>d<\/kbd><kbd>Enter<\/kbd><kbd>a<\/kbd><kbd>b<\/kbd>","A motion for operators too (inclusive forward)"],["Lost","<kbd>Enter<\/kbd> = next line (use <kbd>+<\/kbd>/<kbd>j<\/kbd>); <kbd>S<\/kbd> = substitute line (use <kbd>cc<\/kbd>)"]],"note":"Brackets, quotes and whitespace match their whole class: <code>(<\/code> = <code>([{<\/code>, <code>'<\/code> = <code>'\"`<\/code>. Matching is case-sensitive ('ignorecase' is off). Buffer-local <kbd>Enter<\/kbd> maps (Snacks picker, explorer) still win over the Leap map.","keys":["<CR>","S"]},{"title":"Surround on s","kind":"change","lead":"mini.surround uses <kbd>s<\/kbd> as a prefix, so plain <kbd>s<\/kbd> does nothing in Normal, Visual and Operator-pending mode.","rows":[["<kbd>sa<\/kbd>{motion}{char}","Add: <code>saiw)<\/code> → <code>(word)<\/code>, <code>saiw(<\/code> → <code>( word )<\/code>"],["<kbd>sd<\/kbd>{char}","Delete: <code>sd\"<\/code>, <code>sdf<\/code> (keep args), <code>sdt<\/code> (keep content)"],["<kbd>sr<\/kbd>{old}{new}","Replace: <code>sr)]<\/code>, <code>sr'\"<\/code>, <code>srtt<\/code>"],["<kbd>sf<\/kbd> / <kbd>sF<\/kbd> / <kbd>sh<\/kbd>","Find right part / find left part / highlight"],["<kbd>n<\/kbd> / <kbd>l<\/kbd> suffix","Next / previous surrounding: <code>sdn)<\/code>, <code>srl\"'<\/code>"],["Ids","<code>( [ { &lt;<\/code> padded, <code>) ] } &gt;<\/code> tight, <code>b<\/code> brackets, <code>q<\/code> quotes, <code>t<\/code> tag, <code>f<\/code> call, <code>?<\/code> ask"],["Lost","<kbd>s<\/kbd> → use <kbd>cl<\/kbd>; Visual <kbd>s<\/kbd> → use <kbd>c<\/kbd>"]],"keys":["s"]},{"title":"Text objects (mini.ai)","kind":"change","lead":"<kbd>a<\/kbd>/<kbd>i<\/kbd> are mini.ai: they extend Vim's text objects, search forward when you're not inside one, and pass unknown letters (<code>w W s p B<\/code>) to Vim.","rows":[["<kbd>if<\/kbd> / <kbd>af<\/kbd>","Function call: arguments / whole call"],["<kbd>ia<\/kbd> / <kbd>aa<\/kbd>","Argument / argument plus its comma"],["<kbd>iq<\/kbd> / <kbd>ib<\/kbd>","Any quotes / any of <code>() [] {}<\/code>"],["<kbd>it<\/kbd> / <kbd>i?<\/kbd>","Tag content / custom edges (prompted)"],["<kbd>ig<\/kbd>","Whole buffer (custom, lua/plugins.lua)"],["<kbd>i_<\/kbd> <kbd>i,<\/kbd> <kbd>i*<\/kbd> …","Between any punctuation"],["<kbd>iN(<\/kbd> / <kbd>il(<\/kbd>","Next / previous one, e.g. <code>ciN\"<\/code> (capital N: <kbd>an<\/kbd>/<kbd>in<\/kbd> are Neovim's node selection)"],["<kbd>g[<\/kbd> / <kbd>g]<\/kbd>","Move to the start / end of <code>a{id}<\/code>"],["<kbd>i(<\/kbd> vs <kbd>i)<\/kbd>","Open bracket leaves out the inner edge spaces, close bracket includes them"]],"note":"Search: <code>cover_or_next<\/code> over 50 lines. <code>a\"<\/code> no longer grabs trailing whitespace.","keys":["a","i"]},{"title":"zz and half-page scrolls land at 30%","kind":"change","lead":"focusline.nvim re-targets these Normal-mode keys to put the cursor line 30% from the top of the window.","rows":[["<kbd>zz<\/kbd>","Line at 30%, not the centre (use <kbd>z.<\/kbd> to centre with the cursor at the first non-blank)"],["<kbd>z,<\/kbd>","New: same 30% placement"],["<kbd>Ctrl-D<\/kbd> / <kbd>Ctrl-U<\/kbd>","Half page down / up, then line at 30%"]],"keys":["zz","z,","<C-D>","<C-U>"]},{"title":"Smart pairs","kind":"change","lead":"mini.pairs plus lua/smart_pairs.lua: an opener only auto-closes when nothing but whitespace, or a closing bracket, follows the cursor.","rows":[["<kbd>(<\/kbd> before text","Types just <code>(<\/code>, handy for wrapping existing text"],["<kbd>'<\/kbd> after a letter","Typed alone: <code>don't<\/code>; <code>\"\"<\/code> + <kbd>\"<\/kbd> gives <code>\"\"\"<\/code>"],["<kbd>\\<\/kbd> then opener","Never pairs after a backslash"],["<kbd>)<\/kbd> <kbd>\"<\/kbd>","Step over the closer that's already there"],["<kbd>Backspace<\/kbd>","Inside an empty pair deletes both"],["<kbd>Enter<\/kbd>","Between <code>()<\/code> <code>[]<\/code> <code>{}<\/code>: closer on its own line"]],"note":"Disable with <code>vim.g.minipairs_disable = true<\/code> (or <code>vim.b.<\/code> per buffer).","keys":["(","[","{","\"","'","`"]},{"title":"Markdown code fences","kind":"tip","lead":"In Markdown buffers, backticks and tildes build fenced code blocks for you.","rows":[["<kbd>`<\/kbd><kbd>`<\/kbd><kbd>`<\/kbd> on a blank line","Opener and closer, cursor after the opener: type the language"],["more <kbd>`<\/kbd>","Lengthens both fences (<code>````<\/code> to wrap a block that contains <code>```<\/code>)"],["<kbd>Backspace<\/kbd>","Shrinks both; below 3 the closer disappears"],["<kbd>~<\/kbd><kbd>~<\/kbd><kbd>~<\/kbd>","Same with tilde fences"]],"note":"Only opens a pair when the next line is blank, the buffer ends there, or it closes the block you're in.","keys":["`","~"]},{"title":"an / in select syntax nodes","kind":"tip","lead":"Neovim 0.12's incremental selection, free because mini.ai's \"next\" objects live on <kbd>aN<\/kbd>/<kbd>iN<\/kbd>.","rows":[["<kbd>v<\/kbd> <kbd>an<\/kbd> <kbd>an<\/kbd>…","Grow the selection to the enclosing node each time"],["<kbd>in<\/kbd>","Shrink back to a child node"],["<kbd>]n<\/kbd> <kbd>[n<\/kbd>","Select the next / previous node"],["<kbd>]N<\/kbd> <kbd>[N<\/kbd>","Extend over the next / previous sibling"]],"note":"Treesitter where a parser exists, otherwise LSP selection range (<code>:h v_an<\/code>). <code>lua/plugins.lua:424-429<\/code>","keys":["an","in"]},{"title":"Plugin keys that change stock behaviour","kind":"warn","lead":"Verified in plugin source and, where marked, by running the real config headless.","rows":[["<kbd>Enter<\/kbd> in vault notes","obsidian.nvim's smart action (buffer-local) shadows the global Leap <kbd>Enter<\/kbd> and turns plain lines into checkboxes."],["<kbd>Enter<\/kbd> in git log pickers","Snacks confirms with <code>git checkout<\/code>: detached HEAD (<kbd>Space g l<\/kbd>) or overwriting the file (<kbd>Space g f<\/kbd>, <kbd>Space g L<\/kbd>)."],["Dashboard <kbd>s<\/kbd>","Missing: Snacks only detects persistence.nvim under lazy.nvim, so there is no Restore Session item."]],"keys":["<CR>"]}],"groups":{"<leader>b":{"name":"Buffer","cat":"Buffer & tab"},"<leader>c":{"name":"Code","cat":"LSP & diagnostics"},"<leader>cb":{"name":"Comment box","cat":"Comment"},"<leader>f":{"name":"Find","cat":"Find & pick"},"<leader>g":{"name":"Git","cat":"Git"},"<leader>h":{"name":"Haunt bookmarks","cat":"Mark & jump"},"<leader>q":{"name":"Session","cat":"Session"},"<leader>s":{"name":"Search","cat":"Find & pick"},"<leader>u":{"name":"UI / toggles","cat":"UI & toggles"}},"commands":[{"k":":BlinkCmp","d":"blink.cmp: status (checkhealth), build or build-log of the fuzzy matcher","s":"blink.cmp","f":"plugin/blink-cmp.lua","na":"1","r":null,"ctx":null},{"k":":Browse","d":"gx.nvim (also on gx): open URL, path, plugin, GitHub issue or package under the cursor / given arg","s":"gx","f":"lua/gx/init.lua","na":"?","r":1,"ctx":null},{"k":":CBacbox","d":"Centred adapted box (box fits the text)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBalbox","d":"Left-aligned adapted box (deprecated alias of CBlabox)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBcabox","d":"Centred adapted box (deprecated alias of CBacbox)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBcatalog","d":"Open the comment-box style catalog","s":"comment-box","f":"plugin/comment-box.lua","na":"0","r":null,"ctx":null},{"k":":CBccbox","d":"Centred box, text centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBccline","d":"Centred titled line, title centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBclbox","d":"Centred box, text left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBcline","d":"Centred line (no title)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":null,"ctx":null},{"k":":CBclline","d":"Centred titled line, title left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBcrbox","d":"Centred box, text right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBcrline","d":"Centred titled line, title right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBd","d":"Remove the box or titled line around the range","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlabox","d":"Left-aligned adapted box (box fits the text)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlcbox","d":"Left-aligned box, text centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlcline","d":"Left-aligned titled line, title centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBline","d":"Left-aligned line (no title)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":null,"ctx":null},{"k":":CBllbox","d":"Left-aligned box, text left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlline","d":"Left-aligned line (no title)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":null,"ctx":null},{"k":":CBllline","d":"Left-aligned titled line, title left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlrbox","d":"Left-aligned box, text right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBlrline","d":"Left-aligned titled line, title right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrabox","d":"Right-aligned adapted box (box fits the text)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrcbox","d":"Right-aligned box, text centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrcline","d":"Right-aligned titled line, title centred","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrlbox","d":"Right-aligned box, text left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrline","d":"Right-aligned line (no title)","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":null,"ctx":null},{"k":":CBrlline","d":"Right-aligned titled line, title left-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrrbox","d":"Right-aligned box, text right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBrrline","d":"Right-aligned titled line, title right-aligned","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":CBy","d":"Yank the text of a box or titled line without the frame","s":"comment-box","f":"plugin/comment-box.lua","na":"?","r":1,"ctx":null},{"k":":Catppuccin","d":"Switch Catppuccin flavour (latte, frappe, macchiato, mocha)","s":"catppuccin","f":"lua/catppuccin/init.lua","na":"1","r":null,"ctx":null},{"k":":CatppuccinCompile","d":"Recompile the Catppuccin highlight cache","s":"catppuccin","f":"lua/catppuccin/init.lua","na":"0","r":null,"ctx":null},{"k":":ConformInfo","d":"Show Conform's formatters, their status and the log","s":"conform","f":"plugin/conform.lua","na":"0","r":null,"ctx":null},{"k":":DoMatchParen","d":"Turn matching-paren highlighting back on","s":"neovim","f":"plugin/matchparen.vim","na":"0","r":null,"ctx":null},{"k":":EditQuery","d":"Edit treesitter query","s":"neovim","f":"lua/vim/_core/defaults.lua","na":"?","r":null,"ctx":null},{"k":":Explore","d":"netrw: browse the current file's directory (or [dir]) in this window","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":FZF","d":"fzf.vim (system): fuzzy-find files in a directory with the fzf binary","s":"fzf (system)","f":"/usr/share/vim/vimfiles/plugin/fzf.vim","na":"*","r":null,"ctx":null},{"k":":Format","d":"Format the buffer, or [range], with conform.nvim (async, LSP fallback)","s":"config","f":"lua/options.lua","na":"0","r":1,"ctx":null},{"k":":Gitsigns","d":"Gitsigns actions: nav_hunk, stage_hunk, blame_line, diffthis… (no keys mapped)","s":"gitsigns","f":"lua/gitsigns.lua","na":"*","r":1,"ctx":null},{"k":":GrugFar","d":"Open Grug-far search & replace (optional engine arg; a visual range prefills the search)","s":"grug-far","f":"plugin/grug-far.lua","na":"?","r":1,"ctx":null},{"k":":GrugFarWithin","d":"Grug-far limited to the visual selection","s":"grug-far","f":"plugin/grug-far.lua","na":"?","r":1,"ctx":null},{"k":":HauntAnnotate","d":"Add or edit the annotation of the bookmark on this line","s":"haunt","f":"plugin/haunt.lua","na":"?","r":null,"ctx":null},{"k":":HauntChangeDataDir","d":"Change where Haunt stores bookmarks","s":"haunt","f":"plugin/haunt.lua","na":"?","r":null,"ctx":null},{"k":":HauntClear","d":"Clear all bookmarks in the current file","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntClearAll","d":"Clear every bookmark","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntDelete","d":"Delete the bookmark on this line","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntList","d":"Picker of all bookmarks","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntMigrate","d":"Migrate bookmarks from v1 to v2 storage","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntNext","d":"Jump to the next bookmark","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntPrev","d":"Jump to the previous bookmark","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntQf","d":"Send this buffer's annotations to the quickfix list","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntQfAll","d":"Send all annotations to the quickfix list","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntReload","d":"Reload bookmarks from disk","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":HauntToggle","d":"Toggle annotation visibility","s":"haunt","f":"plugin/haunt.lua","na":"0","r":null,"ctx":null},{"k":":Hexplore","d":"netrw: browse the directory in a horizontal split (! = above)","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":IncRename","d":"LSP rename with live preview of all changes (Space c r)","s":"inc-rename","f":"lua/inc_rename/init.lua","na":"1","r":1,"ctx":null},{"k":":Inspect","d":"Inspect highlights and extmarks at the cursor","s":"neovim","f":"lua/vim/_core/defaults.lua","na":"0","r":null,"ctx":null},{"k":":InspectTree","d":"Inspect treesitter language tree for buffer","s":"neovim","f":"lua/vim/_core/defaults.lua","na":"?","r":1,"ctx":null},{"k":":JdtShowLogs","d":"nvim-jdtls (system package): show the jdtls language server logs","s":"neovim","f":"plugin/jdtls.lua","na":"0","r":null,"ctx":null},{"k":":JdtWipeDataAndRestart","d":"nvim-jdtls (system package): wipe the workspace data and restart jdtls","s":"neovim","f":"plugin/jdtls.lua","na":"0","r":null,"ctx":null},{"k":":KittyScrollbackCheckHealth","d":"Run kitty-scrollback.nvim health checks","s":"kitty-scrollback","f":"lua/kitty-scrollback/init.lua","na":"0","r":null,"ctx":null},{"k":":KittyScrollbackGenerateCommandLineEditing","d":"Print shell config to edit the command line in kitty-scrollback","s":"kitty-scrollback","f":"lua/kitty-scrollback/init.lua","na":"1","r":null,"ctx":null},{"k":":KittyScrollbackGenerateKittens","d":"Print kitty.conf mappings that launch kitty-scrollback","s":"kitty-scrollback","f":"lua/kitty-scrollback/init.lua","na":"*","r":null,"ctx":null},{"k":":LazyDev","d":"lazydev.nvim: debug info / show the Lua LSP library settings","s":"lazydev","f":"lua/lazydev/config.lua","na":"*","r":null,"ctx":null},{"k":":Lexplore","d":"netrw: toggle a full-height explorer on the left","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":LspInstall","d":"mason-lspconfig: install LSP servers","s":"mason-lspconfig","f":"lua/mason-lspconfig/api/command.lua","na":"*","r":null,"ctx":null},{"k":":LspUninstall","d":"mason-lspconfig: uninstall LSP servers","s":"mason-lspconfig","f":"lua/mason-lspconfig/api/command.lua","na":"+","r":null,"ctx":null},{"k":":Man","d":"Open a man page: :Man {name}, :Man {sect} {name}; no arg = word under cursor","s":"neovim","f":"plugin/man.lua","na":"*","r":1,"ctx":null},{"k":":Mason","d":"Open Mason's package manager window","s":"mason","f":"lua/mason/api/command.lua","na":"0","r":null,"ctx":null},{"k":":MasonInstall","d":"Install Mason packages by name","s":"mason","f":"lua/mason/api/command.lua","na":"+","r":null,"ctx":null},{"k":":MasonLog","d":"Open the Mason log","s":"mason","f":"lua/mason/api/command.lua","na":"0","r":null,"ctx":null},{"k":":MasonUninstall","d":"Uninstall Mason packages","s":"mason","f":"lua/mason/api/command.lua","na":"+","r":null,"ctx":null},{"k":":MasonUninstallAll","d":"Uninstall every Mason package","s":"mason","f":"lua/mason/api/command.lua","na":"0","r":null,"ctx":null},{"k":":MasonUpdate","d":"Update the Mason registries","s":"mason","f":"lua/mason/api/command.lua","na":"0","r":null,"ctx":null},{"k":":MatchDebug","d":"matchit: debug b:match_words (adds a Matchit menu)","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","na":"0","r":null,"ctx":null},{"k":":MatchDisable","d":"matchit: drop its % g% [% ]% maps (plain bracket %)","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","na":"0","r":null,"ctx":null},{"k":":MatchEnable","d":"matchit: restore its % g% [% ]% maps","s":"matchit","f":"pack/dist/opt/matchit/plugin/matchit.vim","na":"0","r":null,"ctx":null},{"k":":NetUserPass","d":"netrw: set the user id and password for remote (ftp) access","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":null,"ctx":null},{"k":":Nexplore","d":"netrw: next file matched by :Explore **/pattern","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":null,"ctx":null},{"k":":NoMatchParen","d":"Turn off highlighting of the matching paren under the cursor","s":"neovim","f":"plugin/matchparen.vim","na":"0","r":null,"ctx":null},{"k":":Noice","d":"Noice message history (subcommands: last, errors, all, dismiss, pick…)","s":"noice","f":"lua/noice/commands.lua","na":"?","r":null,"ctx":null},{"k":":NoiceAll","d":"All Noice messages in a split","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceConfig","d":"Show Noice's active configuration","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceDebug","d":"Toggle Noice debug mode","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceDisable","d":"Disable Noice (back to the native UI)","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceDismiss","d":"Dismiss all visible Noice messages","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceEnable","d":"Enable Noice","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceErrors","d":"Noice error messages in a popup","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceFzf","d":"Noice history in fzf-lua (not installed here)","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceHistory","d":"Noice message history in a split","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceLast","d":"Show the last Noice message in a popup","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceLog","d":"Open the Noice log file","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoicePick","d":"Noice history in the Snacks picker","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceRoutes","d":"Show Noice's message routes","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceSnacks","d":"Noice history in the Snacks picker","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceStats","d":"Show Noice statistics","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceTelescope","d":"Noice history in Telescope (not installed here)","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":NoiceViewstats","d":"Show Noice view statistics","s":"noice","f":"lua/noice/commands.lua","na":"0","r":null,"ctx":null},{"k":":Nread","d":"netrw: re-read the last remote file into this buffer","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":Nsource","d":"netrw: source a remote {netfile}","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":null,"ctx":null},{"k":":Ntree","d":"netrw: make [dirname] (or the line under the cursor) the tree top","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"?","r":null,"ctx":null},{"k":":Nwrite","d":"netrw: write [range] to the last remote file","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":Obsidian","d":"obsidian.nvim: :Obsidian today|new|search|quick_switch|tags|…; bare opens a menu","s":"obsidian.nvim","f":"plugin/obsidian.lua","na":"*","r":1,"ctx":null},{"k":":Open","d":"Open file with system default handler. See :help vim.ui.open()","s":"neovim","f":"lua/vim/_core/defaults.lua","na":"1","r":null,"ctx":null},{"k":":Pexplore","d":"netrw: previous file matched by :Explore **/pattern","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":null,"ctx":null},{"k":":Q","d":"Write all changed buffers (even read-only ones) and quit, no prompts (:xa!)","s":"config","f":"lua/keymaps.lua","na":"0","r":null,"ctx":null},{"k":":Qalc","d":"Open a qalc calculator buffer (! for a scratch buffer)","s":"qalc","f":"plugin/qalc.lua","na":"?","r":null,"ctx":null},{"k":":QalcAttach","d":"Evaluate the current buffer's lines with qalc","s":"qalc","f":"plugin/qalc.lua","na":"0","r":null,"ctx":null},{"k":":QalcYank","d":"Yank the qalc result of the current line (unnamed register unless one is given)","s":"qalc","f":"plugin/qalc.lua","na":"?","r":null,"ctx":null},{"k":":Sexplore","d":"netrw: split, then browse the current file's directory (! = vertical)","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":Sidekick","d":"Sidekick: nes {apply|jump|toggle|…}, cli {toggle|select|send|prompt|…}","s":"sidekick","f":"lua/sidekick/config.lua","na":"?","r":1,"ctx":null},{"k":":TSContext","d":"Treesitter context: enable, disable or toggle the sticky header","s":"nvim-treesitter-context","f":"plugin/treesitter-context.lua","na":"*","r":null,"ctx":null},{"k":":Texplore","d":"netrw: browse the directory in a new tab","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":Tutor","d":"Open the interactive Vim tutorial (:Tutor {name} for others)","s":"neovim","f":"plugin/tutor.vim","na":"?","r":null,"ctx":null},{"k":":UndotreeFocus","d":"Focus the undotree panel","s":"undotree","f":"plugin/undotree.vim","na":"0","r":null,"ctx":null},{"k":":UndotreeHide","d":"Close the undotree panel","s":"undotree","f":"plugin/undotree.vim","na":"0","r":null,"ctx":null},{"k":":UndotreePersistUndo","d":"Turn on persistent undo for this file (no-op here: 'undofile' is already on)","s":"undotree","f":"plugin/undotree.vim","na":"0","r":null,"ctx":null},{"k":":UndotreeShow","d":"Open the undotree panel","s":"undotree","f":"plugin/undotree.vim","na":"0","r":null,"ctx":null},{"k":":UndotreeToggle","d":"Toggle the undotree panel (Space u u)","s":"undotree","f":"plugin/undotree.vim","na":"0","r":null,"ctx":null},{"k":":UpdateRemotePlugins","d":"Register remote (rplugin/) plugins; run after installing or updating one","s":"neovim","f":"plugin/rplugin.vim","na":"0","r":null,"ctx":null},{"k":":Vexplore","d":"netrw: browse the directory in a vertical split","s":"neovim","f":"pack/dist/opt/netrw/plugin/netrwPlugin.vim","na":"*","r":1,"ctx":null},{"k":":WakaTimeApiKey","d":"Set the WakaTime API key","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeCliLocation","d":"Show the wakatime-cli path","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeCliVersion","d":"Show the wakatime-cli version","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeDebugDisable","d":"Turn WakaTime debug logging off","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeDebugEnable","d":"Turn WakaTime debug logging on","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeFileExpert","d":"Show who has spent the most time on this file","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeScreenRedrawDisable","d":"Never redraw the screen after sending heartbeats","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeScreenRedrawEnable","d":"Always redraw the screen after sending heartbeats","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeScreenRedrawEnableAuto","d":"Redraw the screen after heartbeats only when needed","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeStatusBarDisable","d":"Hide WakaTime's status bar text","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeStatusBarEnable","d":"Show WakaTime's status bar text","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WakaTimeToday","d":"Show today's coding time","s":"vim-wakatime","f":"lua/wakatime/init.lua","na":"0","r":null,"ctx":null},{"k":":WhichKey","d":"Show the which-key popup: :WhichKey [mode] [keys]","s":"which-key","f":"lua/which-key/config.lua","na":"*","r":null,"ctx":null},{"k":":LspCopilotSignIn","d":"Sign in Copilot with GitHub","s":"nvim-lspconfig","f":"lsp/copilot.lua","na":"0","r":null,"ctx":"lua"},{"k":":LspCopilotSignOut","d":"Sign out Copilot with GitHub","s":"nvim-lspconfig","f":"lsp/copilot.lua","na":"0","r":null,"ctx":"lua"},{"k":":LspCopilotSignIn","d":"Sign in Copilot with GitHub","s":"nvim-lspconfig","f":"lsp/copilot.lua","na":"0","r":null,"ctx":"markdown"},{"k":":LspCopilotSignOut","d":"Sign out Copilot with GitHub","s":"nvim-lspconfig","f":"lsp/copilot.lua","na":"0","r":null,"ctx":"markdown"}],"picker":{"input":[{"action":"list_bottom","lhs":"G"},{"action":"toggle_focus","lhs":"/"},{"action":"list_top","lhs":"gg"},{"mode":["i","n"],"action":"toggle_ignored","lhs":"<M-i>"},{"action":"list_up","lhs":"k"},{"mode":["i","n"],"action":"select_and_prev","lhs":"<S-Tab>"},{"mode":["i","n"],"action":"select_and_next","lhs":"<Tab>"},{"mode":["i","n"],"action":"toggle_maximize","lhs":"<M-m>"},{"mode":["i","n"],"action":"history_forward","lhs":"<C-Down>"},{"mode":["i","n"],"action":"preview_scroll_down","lhs":"<C-F>"},{"mode":["i","n"],"action":"history_back","lhs":"<C-Up>"},{"mode":["i","n"],"action":"toggle_preview","lhs":"<M-p>"},{"mode":["n","i"],"action":"function","lhs":"<S-CR>"},{"action":"flash","lhs":"s"},{"mode":["n","i"],"action":"sidekick_send","lhs":"<M-a>"},{"mode":["n","i"],"action":"flash","lhs":"<M-s>"},{"action":"layout_left","lhs":"<C-W>H"},{"action":"layout_right","lhs":"<C-W>L"},{"mode":["i","n"],"action":"preview_scroll_up","lhs":"<C-B>"},{"mode":"i","action":"insert_file_full","lhs":"<C-R><C-P>"},{"mode":["i","n"],"action":"list_scroll_down","lhs":"<C-D>"},{"mode":["i","n"],"action":"cycle_win","lhs":"<M-w>"},{"mode":["i","n"],"action":"list_down","lhs":"<C-J>"},{"action":"layout_bottom","lhs":"<C-W>J"},{"mode":["i","n"],"action":"list_up","lhs":"<C-K>"},{"mode":["i","n"],"action":"toggle_regex","lhs":"<M-r>"},{"mode":["i","n"],"action":"qflist","lhs":"<C-Q>"},{"mode":["n","i"],"action":"tab","lhs":"<C-T>"},{"mode":["i","n"],"action":"edit_split","lhs":"<C-S>"},{"mode":["i"],"desc":"delete word","action":"<c-s-w>","lhs":"<C-W>"},{"mode":["i","n"],"action":"list_scroll_up","lhs":"<C-U>"},{"mode":["n","i"],"action":"select_all","lhs":"<C-A>"},{"mode":["i","n"],"action":"edit_vsplit","lhs":"<C-V>"},{"mode":["i","n"],"action":"list_down","lhs":"<C-N>"},{"mode":"i","action":"insert_alt","lhs":"<C-R>#"},{"mode":"i","action":"cancel","lhs":"<C-C>"},{"mode":"i","action":"insert_filename","lhs":"<C-R>%"},{"mode":"i","action":"insert_line","lhs":"<C-R><C-L>"},{"mode":"i","action":"insert_cWORD","lhs":"<C-R><C-A>"},{"mode":"i","action":"insert_file","lhs":"<C-R><C-F>"},{"mode":["i","n"],"action":"list_up","lhs":"<Up>"},{"mode":"i","action":"insert_cword","lhs":"<C-R><C-W>"},{"mode":["i","n"],"action":"toggle_live","lhs":"<C-G>"},{"action":"list_down","lhs":"j"},{"mode":["i","n"],"action":"toggle_hidden","lhs":"<M-h>"},{"mode":["i","n"],"action":"list_down","lhs":"<Down>"},{"mode":["i","n"],"action":"list_up","lhs":"<C-P>"},{"action":"cancel","lhs":"q"},{"action":"layout_top","lhs":"<C-W>K"},{"action":"toggle_help_input","lhs":"?"},{"action":"cancel","lhs":"<Esc>"},{"mode":["n","i"],"action":"inspect","lhs":"<M-d>"},{"mode":["n","i"],"action":"confirm","lhs":"<CR>"},{"mode":["i","n"],"action":"toggle_follow","lhs":"<M-f>"}],"list":[{"action":"list_bottom","lhs":"G"},{"action":"toggle_focus","lhs":"/"},{"action":"list_top","lhs":"gg"},{"action":"toggle_ignored","lhs":"<M-i>"},{"action":"list_up","lhs":"k"},{"mode":["n","x"],"action":"select_and_prev","lhs":"<S-Tab>"},{"mode":["n","x"],"action":"select_and_next","lhs":"<Tab>"},{"action":"toggle_maximize","lhs":"<M-m>"},{"action":"preview_scroll_down","lhs":"<C-F>"},{"action":"focus_input","lhs":"i"},{"action":"function","lhs":"<S-CR>"},{"action":"preview_scroll_up","lhs":"<C-B>"},{"action":"list_scroll_down","lhs":"<C-D>"},{"action":"list_down","lhs":"<C-J>"},{"action":"list_up","lhs":"<C-K>"},{"action":"layout_left","lhs":"<C-W>H"},{"action":"qflist","lhs":"<C-Q>"},{"action":"tab","lhs":"<C-T>"},{"action":"edit_split","lhs":"<C-S>"},{"action":"toggle_hidden","lhs":"<M-h>"},{"action":"list_scroll_up","lhs":"<C-U>"},{"action":"select_all","lhs":"<C-A>"},{"action":"edit_vsplit","lhs":"<C-V>"},{"action":"list_down","lhs":"<C-N>"},{"action":"layout_right","lhs":"<C-W>L"},{"action":"layout_top","lhs":"<C-W>K"},{"action":"layout_bottom","lhs":"<C-W>J"},{"action":"list_down","lhs":"<Down>"},{"action":"confirm","lhs":"<2-LeftMouse>"},{"action":"cycle_win","lhs":"<M-w>"},{"action":"toggle_help_list","lhs":"?"},{"action":"toggle_preview","lhs":"<M-p>"},{"action":"list_scroll_bottom","lhs":"zb"},{"action":"list_down","lhs":"j"},{"action":"list_scroll_top","lhs":"zt"},{"action":"list_scroll_center","lhs":"zz"},{"action":"print_path","lhs":"<C-G>"},{"action":"list_up","lhs":"<Up>"},{"action":"cancel","lhs":"q"},{"action":"list_up","lhs":"<C-P>"},{"action":"cancel","lhs":"<Esc>"},{"action":"inspect","lhs":"<M-d>"},{"action":"confirm","lhs":"<CR>"},{"action":"toggle_follow","lhs":"<M-f>"}],"preview":[{"action":"cancel","lhs":"<Esc>"},{"action":"cancel","lhs":"q"},{"action":"cycle_win","lhs":"<M-w>"},{"action":"focus_input","lhs":"i"}]},"explorer":[{"action":"toggle_focus","lhs":"/"},{"action":"toggle_ignored","lhs":"<M-i>"},{"action":"list_up","lhs":"k"},{"mode":["n","x"],"action":"select_and_prev","lhs":"<S-Tab>"},{"mode":["n","x"],"action":"select_and_next","lhs":"<Tab>"},{"action":"explorer_close","lhs":"h"},{"action":"toggle_maximize","lhs":"<M-m>"},{"action":"preview_scroll_down","lhs":"<C-F>"},{"action":"layout_right","lhs":"<C-W>L"},{"action":"function","lhs":"<S-CR>"},{"action":"preview_scroll_up","lhs":"<C-B>"},{"action":"list_scroll_down","lhs":"<C-D>"},{"action":"list_down","lhs":"<C-J>"},{"action":"explorer_move","lhs":"m"},{"action":"qflist","lhs":"<C-Q>"},{"action":"explorer_copy","lhs":"c"},{"action":"edit_split","lhs":"<C-S>"},{"action":"list_scroll_up","lhs":"<C-U>"},{"action":"edit_vsplit","lhs":"<C-V>"},{"action":"explorer_del","lhs":"d"},{"action":"explorer_add","lhs":"a"},{"action":"list_down","lhs":"j"},{"action":"list_down","lhs":"<Down>"},{"action":"explorer_paste","lhs":"p"},{"action":"layout_bottom","lhs":"<C-W>J"},{"action":"cancel","lhs":"<Esc>"},{"action":"confirm","lhs":"<CR>"},{"action":"layout_left","lhs":"<C-W>H"},{"action":"list_bottom","lhs":"G"},{"action":"list_top","lhs":"gg"},{"mode":["n","x"],"action":"explorer_yank","lhs":"y"},{"action":"toggle_ignored","lhs":"I"},{"action":"toggle_hidden","lhs":"H"},{"action":"explorer_close_all","lhs":"Z"},{"action":"explorer_git_next","lhs":"]g"},{"action":"explorer_git_prev","lhs":"[g"},{"action":"explorer_diagnostic_next","lhs":"]d"},{"action":"explorer_diagnostic_prev","lhs":"[d"},{"action":"explorer_rename","lhs":"r"},{"action":"confirm","lhs":"l"},{"action":"explorer_focus","lhs":"."},{"action":"explorer_error_next","lhs":"]e"},{"action":"explorer_error_prev","lhs":"[e"},{"action":"explorer_warn_next","lhs":"]w"},{"action":"terminal","lhs":"<C-T>"},{"action":"explorer_up","lhs":"<BS>"},{"action":"explorer_update","lhs":"u"},{"action":"tcd","lhs":"<C-C>"},{"action":"select_all","lhs":"<C-A>"},{"action":"layout_top","lhs":"<C-W>K"},{"action":"list_down","lhs":"<C-N>"},{"action":"focus_input","lhs":"i"},{"action":"explorer_open","lhs":"o"},{"action":"list_up","lhs":"<C-P>"},{"action":"cancel","lhs":"q"},{"action":"picker_grep","lhs":"<Space>/"},{"action":"list_up","lhs":"<Up>"},{"action":"print_path","lhs":"<C-G>"},{"action":"list_up","lhs":"<C-K>"},{"action":"list_scroll_bottom","lhs":"zb"},{"action":"toggle_preview","lhs":"<M-p>"},{"action":"list_scroll_top","lhs":"zt"},{"action":"list_scroll_center","lhs":"zz"},{"action":"cycle_win","lhs":"<M-w>"},{"action":"confirm","lhs":"<2-LeftMouse>"},{"action":"toggle_hidden","lhs":"<M-h>"},{"action":"toggle_help_list","lhs":"?"},{"action":"explorer_warn_prev","lhs":"[w"},{"action":"inspect","lhs":"<M-d>"},{"action":"toggle_preview","lhs":"P"},{"action":"toggle_follow","lhs":"<M-f>"}],"blink":{"default":[{"actions":["cancel","fallback"],"lhs":"<c-e>"},{"actions":["select_prev","fallback"],"lhs":"<up>"},{"actions":["scroll_documentation_up","fallback"],"lhs":"<c-b>"},{"actions":["select_next","show_and_insert"],"lhs":"<c-n>"},{"actions":["select_next","fallback"],"lhs":"<down>"},{"actions":["select_prev","function"],"lhs":"<c-p>"},{"actions":["scroll_documentation_down","fallback"],"lhs":"<c-f>"},{"actions":["show","show_documentation","hide_documentation"],"lhs":"<c-space>"},{"actions":["select_and_accept","fallback"],"lhs":"<c-y>"},{"actions":["snippet_forward","function","function","fallback"],"lhs":"<tab>"},{"actions":["snippet_backward","fallback"],"lhs":"<s-tab>"}],"cmdline":[{"actions":["select_and_accept","fallback"],"lhs":"<c-y>"},{"actions":["cancel","fallback"],"lhs":"<c-e>"},{"actions":["select_next","fallback"],"lhs":"<c-n>"},{"actions":["show_and_insert_or_accept_single","select_next"],"lhs":"<tab>"},{"actions":["select_prev","fallback"],"lhs":"<c-p>"},{"actions":["select_prev","fallback"],"lhs":"<left>"},{"actions":["show","fallback"],"lhs":"<c-space>"},{"actions":["select_next","fallback"],"lhs":"<right>"},{"actions":["hide","fallback"],"lhs":"<end>"},{"actions":["function","select_prev"],"lhs":"<s-tab>"}],"term":[{"actions":["cancel","fallback"],"lhs":"<c-e>"},{"actions":["select_prev","fallback"],"lhs":"<up>"},{"actions":["scroll_documentation_up","fallback"],"lhs":"<c-b>"},{"actions":["select_next","show_and_insert"],"lhs":"<c-n>"},{"actions":["select_next","fallback"],"lhs":"<down>"},{"actions":["select_prev","function"],"lhs":"<c-p>"},{"actions":["scroll_documentation_down","fallback"],"lhs":"<c-f>"},{"actions":["show","show_documentation","hide_documentation"],"lhs":"<c-space>"},{"actions":["select_and_accept","fallback"],"lhs":"<c-y>"},{"actions":["snippet_forward","function","function","fallback"],"lhs":"<tab>"},{"actions":["snippet_backward","fallback"],"lhs":"<s-tab>"}]},"flash":{"multi_line":false,"jump_labels":false,"char_keys":["f","F","t","T",";",","]}};
// ---- Basics -------------------------------------------------------------------
// Every DATA section is optional: missing pieces render as empty, never crash.
const D = DATA && typeof DATA === "object" ? DATA : {};
const arr = (x) => (Array.isArray(x) ? x : []);
const obj = (x) => (x && typeof x === "object" && !Array.isArray(x) ? x : {});
const META = obj(D.meta);
const $ = (id) => document.getElementById(id);
const esc = (s) => String(s ?? "").replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
const stripTags = (h) => String(h ?? "").replace(/<[^>]*>/g, " ");
const TIMEOUT = META.timeoutlen ?? obj(META.options).timeoutlen ?? 1000;
const REDUCE = window.matchMedia && matchMedia("(prefers-reduced-motion: reduce)").matches;
const scrollToEl = (el) => el && el.scrollIntoView({ behavior: REDUCE ? "auto" : "smooth", block: "start" });
// ---- Theme ----------------------------------------------------------------------
const THEME_KEY = "nvim-cheatsheet-theme";
function setTheme(t, save) {
const root = document.documentElement;
if (t === "light" || t === "dark") root.setAttribute("data-theme", t);
else { root.removeAttribute("data-theme"); t = "auto"; }
for (const b of document.querySelectorAll("[data-theme-set]")) b.setAttribute("aria-pressed", String(b.dataset.themeSet === t));
if (save) { try { localStorage.setItem(THEME_KEY, t); } catch (e) { /* storage blocked: theme just isn't remembered */ } }
}
{
let saved = "auto";
try { saved = localStorage.getItem(THEME_KEY) || "auto"; } catch (e) { /* ignore */ }
setTheme(saved, false);
}
$("theme").addEventListener("click", (e) => {
const b = e.target.closest("[data-theme-set]");
if (b) setTheme(b.dataset.themeSet, true);
});
// ---- Toast & clipboard -----------------------------------------------------------
let toastTimer;
function toast(msg) {
$("toast").textContent = msg;
$("toast").hidden = false;
clearTimeout(toastTimer);
toastTimer = setTimeout(() => ($("toast").hidden = true), 1800);
}
async function copy(text) {
try { await navigator.clipboard.writeText(text); toast(`Copied ${text}`); }
catch (e) {
// Older browsers / file:// without clipboard permission: fall back to a hidden textarea.
const ta = document.createElement("textarea");
ta.value = text; ta.setAttribute("readonly", ""); ta.style.position = "fixed"; ta.style.opacity = "0";
document.body.appendChild(ta); ta.select();
let ok = false;
try { ok = document.execCommand("copy"); } catch (err) { ok = false; }
ta.remove();
toast(ok ? `Copied ${text}` : "Copy blocked by the browser — select the text instead");
}
}
document.addEventListener("click", (e) => {
const b = e.target.closest("[data-copy]");
if (b) copy(b.dataset.copy);
});
// ---- Key notation ------------------------------------------------------------------
// Vim notation is split into tokens: <C-w>, <Space>, {motion}, ["x], or one character.
const TOKEN_RE = /\["x\]|\{[^}\s]+\}|<(?:[A-Za-z0-9]+-)*(?:\{[^}]+\}|[A-Za-z0-9]+|[^>\s])>|[\s\S]/g;
const tokenize = (k) => String(k ?? "").match(TOKEN_RE) || [];
const isPh = (t) => t === '["x]' || (t.length > 2 && t[0] === "{" && t[t.length - 1] === "}");
const LEADER = typeof META.leader === "string" && META.leader ? META.leader : "\\";
const LOCAL = typeof META.localleader === "string" && META.localleader ? META.localleader : "\\";
const charTok = (c) => (c === " " ? "<Space>" : c);
const LEADER_TOK = charTok(LEADER);
const LOCAL_TOK = charTok(LOCAL);
const NAMED = {
cr: "CR", return: "CR", enter: "CR", esc: "Esc", escape: "Esc", tab: "Tab", bs: "BS", backspace: "BS", space: "Space",
nl: "NL", del: "Del", delete: "Del", insert: "Insert", ins: "Insert", up: "Up", down: "Down", left: "Left", right: "Right",
home: "Home", end: "End", pageup: "PageUp", pagedown: "PageDown", pgup: "PageUp", pgdn: "PageDown", help: "Help",
undo: "Undo", nop: "Nop", plug: "Plug", ignore: "Ignore", cmd: "Cmd", sid: "SID", snr: "SNR",
};
const MOD_ALIAS = { c: "C", ctrl: "C", control: "C", s: "S", shift: "S", m: "M", a: "M", alt: "M", meta: "M", d: "D", cmd: "D", super: "D", t: "T" };
/** Canonical form of one token, matching the generator's keytrans style: <C-W>, <M-p>, <CR>, <Space>. */
function canonTok(t) {
if (t.length < 3 || t[0] !== "<" || t[t.length - 1] !== ">") return t;
const inner = t.slice(1, -1);
const low = inner.toLowerCase();
if (low === "leader") return LEADER_TOK;
if (low === "localleader") return LOCAL_TOK;
if (low === "lt") return "<";
if (low === "bar") return "|";
if (low === "bslash") return "\\";
const parts = inner.split("-");
let key = parts.pop();
if (key === "") key = "-";
const mods = parts.filter(Boolean).map((m) => MOD_ALIAS[m.toLowerCase()] || m.toUpperCase());
if (key.length > 1 && key[0] !== "{") {
key = NAMED[key.toLowerCase()] || (/^f\d+$/i.test(key) ? key.toUpperCase() : key[0].toUpperCase() + key.slice(1));
} else if (mods.length && mods.every((m) => m === "C") && /^[a-z]$/i.test(key)) {
key = key.toUpperCase();
}
if (!mods.length) return key.length === 1 ? key : `<${key}>`;
return `<${mods.join("-")}-${key}>`;
}
const canonKeys = (k) => tokenize(k).map(canonTok);
/** Split a canonical token into modifiers and key ("<C-S-Tab>" → C,S + Tab). */
function splitTok(t) {
if (t.length < 3 || t[0] !== "<" || t[t.length - 1] !== ">") return { mods: [], key: t, plain: true };
const parts = t.slice(1, -1).split("-");
let key = parts.pop();
if (key === "") key = "-";
return { mods: parts.filter(Boolean), key, plain: false };
}
const NICE = {
CR: "Enter", Esc: "Esc", Tab: "Tab", BS: "Bksp", Space: "Space", NL: "NL", Del: "Del", Insert: "Ins", Up: "↑", Down: "↓",
Left: "←", Right: "→", Home: "Home", End: "End", PageUp: "PgUp", PageDown: "PgDn", Bar: "|", Bslash: "\\",
};
const MODN = { C: "Ctrl", S: "Shift", M: "Alt", A: "Alt", D: "Cmd", T: "Meta" };
const WORDN = { CR: "enter", BS: "backspace", Up: "up", Down: "down", Left: "left", Right: "right", Space: "space", Esc: "esc" };
/** Words for a token, so "ctrl-w", "space" and "enter" find keys in the search haystack. */
function humanTok(t) {
const { mods, key, plain } = splitTok(t);
if (plain) return t === " " ? "space" : t;
const k = (WORDN[key] || key).toLowerCase();
return mods.length ? [...mods.map((m) => (MODN[m] || m).toLowerCase()), k].join("-") + ` ^${k}` : k;
}
/** Short text form of tokens for keycap glyphs and chips ("^W h", "Space f"). */
function glyphTok(t) {
const { mods, key, plain } = splitTok(t);
if (plain) return t === " " ? "Space" : t;
const k = NICE[key] || key;
if (!mods.length) return k;
if (mods.length === 1 && mods[0] === "C") return "^" + k;
// Compact for keycaps: ⇧ for Shift, ^ for Ctrl ("⇧↑", "^⇧Tab", "Alt+x").
return mods.map((m) => (m === "S" ? "⇧" : m === "C" ? "^" : (MODN[m] || m) + "+")).join("") + k;
}
// ---- Source & category styling ------------------------------------------------------
const RUNTIME_SRC = new Set(["neovim", "ftplugin", "matchit"]);
const srcKind = (s) => (s === "builtin" ? "builtin" : RUNTIME_SRC.has(s) ? "neovim" : s === "config" ? "config" : "plugin");
const SRC_LABEL = { builtin: "Built-in", neovim: "Neovim default", ftplugin: "Runtime ftplugin", matchit: "matchit (runtime)", config: "Your config" };
const srcLabel = (s) => SRC_LABEL[s] || s;
const srcBadge = (s) => `<span class="src ${srcKind(s)}">${esc(srcLabel(s))}</span>`;
const CAT_ORDER = ["Motion", "Text object", "Operator", "Edit", "Insert", "Visual", "Search", "Mark & jump", "Register & macro",
"Undo & repeat", "Scroll & view", "Window", "Buffer & tab", "Fold", "Quickfix & lists", "LSP & diagnostics", "Git",
"Find & pick", "Surround", "Pairs", "Comment", "Completion & AI", "Session", "Terminal", "Command line", "Files", "Tags",
"Diff", "Spell", "Notes", "UI & toggles", "Help", "Misc"];
const CAT_HUE = {
"Motion": 1, "Text object": 2, "Operator": 3, "Edit": 3, "Insert": 4, "Visual": 5, "Search": 6, "Mark & jump": 7,
"Register & macro": 8, "Undo & repeat": 8, "Scroll & view": 9, "Window": 10, "Buffer & tab": 10, "Fold": 9,
"Quickfix & lists": 12, "LSP & diagnostics": 7, "Git": 11, "Find & pick": 6, "Surround": 2, "Pairs": 2, "Comment": 9,
"Completion & AI": 4, "Session": 10, "Terminal": 12, "Command line": 12, "Files": 12, "Tags": 7, "Diff": 11, "Spell": 5,
"Notes": 5, "UI & toggles": 5, "Help": 13, "Misc": 13,
};
const catVar = (c) => `var(--h${CAT_HUE[c] || 13})`;
const catRank = (c) => { const i = CAT_ORDER.indexOf(c); return i < 0 ? CAT_ORDER.length : i; };
const MODE_INFO = {
n: ["N", "Normal"], x: ["V", "Visual"], v: ["V", "Visual & Select"], o: ["O", "Operator-pending"], i: ["I", "Insert"],
c: ["C", "Command-line"], t: ["T", "Terminal"], s: ["S", "Select"], ":": [":", "Ex command"], l: ["L", "Lang-arg"],
};
const modeBadges = (ms) => arr(ms).map((m) => `<span class="badge m" title="${esc((MODE_INFO[m] || [m, m])[1])} mode">${esc((MODE_INFO[m] || [m])[0])}</span>`).join("");
const modeNames = (ms) => arr(ms).map((m) => (MODE_INFO[m] || [m, m])[1]).join(", ");
// neovim.io serves each help file at /doc/user/<name>/ (index.txt is "vimindex") and its tag ids are
// percent-encoded like encodeURIComponent plus "!" → %21 (checked against the live site: 1251 links).
const helpURL = (file, tag) => {
const name = String(file).replace(/\.txt$/, "");
return `https://neovim.io/doc/user/${encodeURIComponent(name === "index" ? "vimindex" : name)}/#${encodeURIComponent(tag).replace(/!/g, "%21")}`;
};
// ---- Entries ----------------------------------------------------------------------------
// One normalised object per built-in, live map, curated entry and command.
// tok: canonical tokens btok: without a leading register/count core: also without trailing {placeholders}
function mk(e, kind, idx) {
e = obj(e);
const raw = String(e.k ?? "");
const ex = kind === "cmd" || !!e.ex;
const x = { kind, idx, ref: e, raw, ex };
x.s = kind === "builtin" ? "builtin" : String(e.s || "other");
x.sk = srcKind(x.s);
x.ld = !!e.ld || /^<leader>/i.test(raw);
x.lld = /^<localleader>/i.test(raw);
x.tok = ex ? [raw] : canonKeys(raw);
let b = 0;
while (!ex && b < x.tok.length && isPh(x.tok[b])) b++;
x.btok = x.tok.slice(b);
let end = x.btok.length;
while (!ex && end > 0 && isPh(x.btok[end - 1])) end--;
x.core = x.btok.slice(0, end);
x.kb = x.core.join("");
x.kbl = x.kb.toLowerCase();
x.kf = x.btok.join("");
// Keys up to the first placeholder: "/" for "/{pattern}<CR>".
{ const p = x.btok.findIndex(isPh); x.kh = p < 0 ? x.kb : x.btok.slice(0, p).join(""); }
x.m = ex ? [":"] : (arr(e.m).length ? arr(e.m).map(String) : (typeof e.m === "string" ? [e.m] : ["n"]));
x.d = String(e.d ?? "");
x.cat = e.cat || (ex ? "Command line" : "Misc");
x.ctx = e.ctx || null;
x.n = e.n ? String(e.n) : "";
x.e = !!e.e;
x.sl = e.sl ? String(e.sl) : "";
// Help: built-ins carry tag + file; live/curated carry a tag and (when it's a runtime tag) "hf".
x.tag = e.t || (kind === "curated" ? e.h : null) || null;
x.hfile = kind === "builtin" ? e.h || null : e.hf || null;
if (ex) {
// ":s[ubstitute]" → abbreviation "s", full name "substitute".
const m = raw.replace(/^:/, "").match(/^([^[]*)(?:\[([^\]]*)\])?(.*)$/) || ["", raw, "", ""];
x.exAbbr = m[1];
x.exFull = m[1] + (m[2] || "") + m[3];
}
x.changed = kind === "builtin" ? !!(arr(e.ov).length || arr(e.wait).length) : kind === "live" ? !!(arr(e.rep).length || arr(e.sh).length) : false;
return x;
}
function finishHay(x) {
const e = x.ref;
x.hay = [x.raw, x.kf, x.ex ? "" : x.tok.map(humanTok).join(" "), x.ld ? "leader" : "", x.d, x.cat, srcLabel(x.s), x.s, x.ctx,
x.tag, stripTags(x.n), e.rhs, e.sec, e.f].filter(Boolean).join(" ").toLowerCase();
x.dl = x.d.toLowerCase();
x.words = new Set(x.hay.split(/[^a-z0-9_]+/).filter(Boolean));
}
// index.txt lists some keys twice (the Visual-mode table repeats every text object, e.g. "as" with tag
// v_as): fold an entry with the same keys and help tag into the first one, keeping its index as an alias.
const BUILT_ALL = arr(D.builtins).map((e, i) => mk(e, "builtin", i));
{
const first = new Map();
for (const x of BUILT_ALL) {
if (x.ex || !x.tag) continue;
const key = `${x.raw}\u0000${x.tag}`;
const p = first.get(key);
if (!p) { first.set(key, x); continue; }
x.dup = p;
p.m = [...new Set([...p.m, ...x.m])];
for (const f of ["ov", "wait"]) if (arr(x.ref[f]).length) p.ref[f] = [...arr(p.ref[f]), ...arr(x.ref[f])];
if (!p.n && x.n) p.n = x.n;
p.e = p.e || x.e;
p.changed = !!(arr(p.ref.ov).length || arr(p.ref.wait).length);
}
}
// "{char1}<BS>{char2}" (digraphs) starts with a typed character, so a map of <BS> doesn't replace it;
// only a register or count may come before the keys a mapping can take over.
for (const x of BUILT_ALL) {
if (x.ex || !x.tok.length || !isPh(x.tok[0]) || /^(\["x\]|\{count\})$/.test(x.tok[0])) continue;
x.noOv = true;
x.ref.ov = []; x.ref.wait = [];
x.changed = false;
}
const BUILT = BUILT_ALL.filter((x) => !x.dup);
const LIVE = arr(D.live).map((e, i) => mk(e, "live", i));
for (const x of LIVE) {
const r = arr(x.ref.rep).filter((o) => !(BUILT_ALL[o.b] && BUILT_ALL[o.b].noOv));
if (r.length !== arr(x.ref.rep).length) { x.ref.rep = r; x.changed = !!(r.length || arr(x.ref.sh).length); }
}
const CUR = arr(D.curated).filter((e) => e && e.k).map((e, i) => mk(e, "curated", i));
const CMDS = arr(D.commands).filter((e) => e && e.k).map((e, i) => mk(e, "cmd", i));
// mini.ai's own text objects (verified in mini.ai/lua/mini/ai.lua, H.builtin_textobjects): used only
// when the curated data doesn't describe them, so the keyboard and composer still know about them.
const MINI_AI = LIVE.some((x) => x.s === "mini.ai" && x.kb === "i" && x.m.includes("o"));
// mini.ai's next/last suffix keys as configured (the config moves "next" to aN/iN so Neovim's an/in stay free).
const aiSuffix = (word, dflt) => {
const e = LIVE.find((x) => x.s === "mini.ai" && /^i.$/.test(x.kb) && new RegExp(word, "i").test(x.d));
return e ? e.kb.slice(1) : dflt;
};
const AI_NEXT = aiSuffix("next", "n"), AI_LAST = aiSuffix("last", "l");
const MINI_AI_IDS = {
a: "argument", f: "function call", q: "any quote \" ' `", b: "any bracket ( [ {", t: "tag", "?": "prompted left/right edges",
// "(" "[" "{" "<": inner part trims edge whitespace; ")" "]" "}" ">" keep it (mini.ai's builtin table).
"(": "( ) · i trims spaces", ")": "( ) block", "[": "[ ] · i trims spaces", "]": "[ ] block", "{": "{ } · i trims spaces", "}": "{ } block",
"<": "< > · i trims spaces", ">": "< > block", '"': "double-quoted string", "'": "single-quoted string", "`": "backtick string",
};
if (MINI_AI) {
const have = new Set(CUR.filter((x) => x.s === "mini.ai").map((x) => x.kb));
for (const id of ["a", "f", "q", "?"]) {
for (const ai of ["i", "a"]) {
if (have.has(ai + id)) continue;
const x = mk({ k: ai + id, m: ["o", "x"], s: "mini.ai", cat: "Text object", h: "MiniAi-builtin-textobjects",
d: `${ai === "i" ? "Inside" : "Around"} ${MINI_AI_IDS[id]} (mini.ai)` }, "curated", CUR.length);
x.synthetic = true;
CUR.push(x);
}
}
}
const ALL = [...BUILT, ...LIVE, ...CUR, ...CMDS];
ALL.forEach((x, i) => { x.id = i; finishHay(x); });
const liveAt = (j) => LIVE[j];
const builtAt = (i) => { const x = BUILT_ALL[i]; return x ? x.dup || x : undefined; };
// A printable key mapped in Select mode: snippet placeholders are Select mode, so typing that key
// over a placeholder runs the map instead of replacing the placeholder text.
const selectTrap = (x) => x.kind === "live" && x.m.includes("s") && !x.ctx && x.tok.length > 0 && (x.tok[0].length === 1 || x.tok[0] === "<Space>");
// Leader groups: "<leader>f" → { name, cat }
const GROUPS = new Map();
for (const [k, v] of Object.entries(obj(D.groups))) {
const g = obj(v);
GROUPS.set(canonKeys(k).join(""), { k, name: String(g.name || ""), cat: g.cat || null });
}
// ---- Header -----------------------------------------------------------------------------
{
const ver = String(META.version || "").replace(/\+.*$/, "");
$("eyebrow").textContent = `Rootiest Neovim · NVIM ${ver || "?"} · generated ${META.date || "?"}`;
const builtinKeys = BUILT.filter((x) => !x.ex).length;
const exCount = BUILT.filter((x) => x.ex).length;
const mine = LIVE.filter((x) => x.sk === "config").length;
const plug = LIVE.filter((x) => x.sk === "plugin").length;
const nv = LIVE.filter((x) => x.sk === "neovim").length;
const changed = BUILT.filter((x) => arr(x.ref.ov).length).length;
const leaderCap = LEADER === " " ? `<kbd>Space</kbd>` : `<kbd>${esc(LEADER)}</kbd>`;
const localCap = LOCAL === " " ? `<kbd>Space</kbd>` : `<kbd>${esc(LOCAL)}</kbd>`;
const st = [
[leaderCap, "Leader"], [localCap, "Local leader"],
[builtinKeys.toLocaleString(), `Built-in keys (+ ${exCount.toLocaleString()} Ex commands)`],
[mine.toLocaleString(), "Your maps"], [plug.toLocaleString(), "Plugin maps"], [nv.toLocaleString(), "Neovim default maps"],
[changed.toLocaleString(), "Built-ins changed by the config"],
];
$("stats").innerHTML = st.map(([v, l]) => `<li><b>${v}</b><span>${esc(l)}</span></li>`).join("");
}
// ---- Rendering helpers --------------------------------------------------------------------
/** One token as keycap HTML. The first token of a leader map renders as a distinct Leader cap. */
function capHTML(t, first, x) {
if (t === '["x]') return `<span class="reg" title="Optional register: type &quot; and a register name first">"x</span>`;
if (isPh(t)) return `<span class="ph" title="Placeholder">${esc(t)}</span>`;
if (first && x && x.ld && t === LEADER_TOK) return `<kbd class="lead" title="Leader">${LEADER === " " ? "Space" : esc(LEADER)}<small>leader</small></kbd>`;
if (first && x && x.lld && t === LOCAL_TOK) return `<kbd class="lead" title="Local leader">${LOCAL === " " ? "Space" : esc(LOCAL)}<small>local</small></kbd>`;
const { mods, key, plain } = splitTok(t);
if (plain) return `<kbd>${t === " " ? "Space" : esc(t)}</kbd>`;
const label = NICE[key] || key;
const cap = `<kbd${label.length > 1 ? ' class="named"' : ""} title="${esc(t)}">${esc(label)}</kbd>`;
if (!mods.length) return cap;
return `<span class="combo" title="${esc(t)}">${mods.map((m) => `<kbd class="mod">${esc(MODN[m] || m)}</kbd>`).join("")}${cap}</span>`;
}
function exHTML(raw) {
const m = raw.match(/^([^[]*)(\[[^\]]*\])?(.*)$/);
return `<code class="exk">${esc(m[1])}${m[2] ? `<span class="opt">${esc(m[2])}</span>` : ""}${esc(m[3])}</code>`;
}
function keysHTML(x, toks) {
if (x && x.ex) return `<span class="keys">${exHTML(x.raw)}</span>`;
// Curated alternatives written as "K / gx": one cap group per alternative.
if (!toks && x.raw && / \/ /.test(x.raw)) {
const alts = x.raw.split(/ \/ /).map((s) => s.trim()).filter(Boolean);
return `<span class="keys" aria-label="${esc(x.raw)}">${alts.map((a) => canonKeys(a).map((t, i) => capHTML(t, i === 0, x)).join("")).join(`<span class="alt" aria-hidden="true">/</span>`)}</span>`;
}
toks = toks || x.tok;
const aria = esc(toks.join(""));
return `<span class="keys" aria-label="${aria}">${toks.map((t, i) => capHTML(t, i === 0, x)).join("")}</span>`;
}
const tokCaps = (toks, opts = {}) => keysHTML({ tok: toks, ld: !!opts.ld, lld: false }, toks);
function fileLine(x) {
const e = x.ref;
if (!e.f) return "";
const path = x.sk === "config" ? e.f : x.sk === "neovim" ? `$VIMRUNTIME/${e.f}` : `${x.s}/${e.f}`;
return `<span title="Defined in">${esc(path)}${e.l ? ":" + esc(e.l) : ""}</span>`;
}
function helpHTML(x) {
if (!x.tag) return "";
const link = x.hfile ? `<a href="${esc(helpURL(x.hfile, x.tag))}" target="_blank" rel="noopener">:h ${esc(x.tag)}</a>` : `<span class="fl">:h ${esc(x.tag)}</span>`;
return `${link} <button type="button" class="copy" data-copy=":h ${esc(x.tag)}" aria-label="Copy :h ${esc(x.tag)}">copy</button>`;
}
const groupBy = (list, f) => { const m = new Map(); for (const v of list) { const k = f(v); if (!m.has(k)) m.set(k, []); m.get(k).push(v); } return m; };
const modeList = (list) => [...new Set(list.map((o) => o.m))];
/** Warning chips: replaced, replaces, unreachable, waits, nowait, Select-mode trap. */
function flagsHTML(x, onlyMode) {
const e = x.ref, out = [];
const fit = (o) => !onlyMode || o.m === onlyMode;
if (x.kind === "builtin") {
for (const [j, list] of groupBy(arr(e.ov).filter(fit), (o) => o.by)) {
const L = liveAt(j);
if (!L) continue;
out.push(`<span class="flag over">Replaced${onlyMode ? "" : ` in ${esc(modeNames(modeList(list)))}`} by <b>${esc(L.d)}</b> · ${esc(srcLabel(L.s))}${L.ctx ? ` (${esc(L.ctx)})` : ""}</span>`);
}
for (const w of arr(e.wait).filter(fit)) {
const ext = arr(w.ext);
out.push(`<span class="flag" title="A longer mapping starts with this key, so Neovim waits 'timeoutlen' before running it">Waits ${esc(TIMEOUT)} ms${onlyMode ? "" : ` in ${esc(modeNames([w.m]))}`}: ${ext.map((k) => `<code>${esc(k)}</code>`).join(" ")}${w.n > ext.length ? ` +${w.n - ext.length} more` : ""}</span>`);
}
} else if (x.kind === "live") {
const seen = new Set();
for (const [i, list] of groupBy(arr(e.rep).filter(fit), (o) => o.b)) {
const B = builtAt(i);
if (!B || seen.has(B.d)) continue;
seen.add(B.d);
out.push(`<span class="flag rep">Replaces built-in${onlyMode ? "" : ` (${esc(modeList(list).join(""))})`}: <s>${esc(B.d)}</s></span>`);
}
for (const s of arr(e.sh).filter(fit)) {
const L = liveAt(s.by);
if (L) out.push(`<span class="flag dead">Unreachable: <code>${esc(L.raw)}</code> (${esc(L.d)}) is <code>nowait</code> and fires first</span>`);
}
if (e.nw) out.push(`<span class="flag info">nowait</span>`);
if (selectTrap(x)) out.push(`<span class="flag">Also in Select mode: typing it over a snippet placeholder runs this map</span>`);
}
return out.join("");
}
// ---- Short labels for keycaps --------------------------------------------------------------
// entry.sl wins; then these by help tag (meanings from index.txt); else a label derived from the description.
const SL = {
"h": "←", "j": "↓", "k": "↑", "l": "→", "w": "word →", "W": "WORD →", "b": "← word", "B": "← WORD", "e": "word end",
"E": "WORD end", "0": "line start", "^": "first char", "$": "line end", "gg": "first line", "G": "last line",
"f": "find →", "F": "← find", "t": "till →", "T": "← till", ";": "repeat f/t", ",": "f/t back", "n": "next match",
"N": "prev match", "star": "word →", "#": "← word", "%": "match pair", "{": "← para", "}": "para →", "(": "← sentence",
")": "sentence →", "H": "screen top", "M": "screen mid", "L": "screen bottom", "i": "insert", "a": "append",
"I": "insert line", "A": "append line", "o": "open below", "O": "open above", "x": "delete char", "X": "delete ←",
"d": "delete", "c": "change", "y": "yank", "p": "put after", "P": "put before", "u": "undo", "CTRL-R": "redo",
"U": "undo line", "r": "replace char", "R": "replace mode", "s": "subst char", "S": "subst line", "C": "change to end",
"D": "delete to end", "Y": "yank line", "J": "join", "K": "keyword help", "v": "visual", "V": "visual line",
"CTRL-V": "visual block", ".": "repeat", "q": "record", "@": "run macro", "Q": "replay macro", "m": "set mark",
"'": "mark line", "`": "mark", "/": "search →", "?": "← search", ":": "cmdline", "~": "toggle case", ">": "indent",
"<": "dedent", "=": "reindent", "!": "filter", "&": "repeat :s", "quote": "register", "g": "g prefix", "z": "z prefix",
"[": "[ prefix", "]": "] prefix", "bar": "column", "_": "first char ↓", "-": "↑ line start", "+": "↓ line start",
"<CR>": "↓ line start", "count": "count", "<Space>": "→", "CTRL-A": "increment", "CTRL-X": "decrement",
"CTRL-O": "jump back", "<Tab>": "jump fwd", "CTRL-I": "jump fwd", "CTRL-D": "½ page ↓", "CTRL-U": "½ page ↑",
"CTRL-F": "page ↓", "CTRL-B": "page ↑", "CTRL-E": "scroll ↓", "CTRL-Y": "scroll ↑", "CTRL-G": "file info",
"CTRL-L": "redraw", "CTRL-]": "tag jump", "CTRL-T": "tag back", "CTRL-^": "alt file", "CTRL-W": "window…",
"CTRL-Z": "suspend", "CTRL-C": "interrupt", "CTRL-N": "↓", "CTRL-P": "↑", "CTRL-H": "←", "CTRL-J": "↓",
"CTRL-M": "↓ line start", "<BS>": "←", "ZZ": "save & close", "ZQ": "quit no save", "<Esc>": "cancel",
"<Del>": "delete char", "<Insert>": "insert", "<Home>": "line start", "<End>": "line end", "<PageUp>": "page ↑",
"<PageDown>": "page ↓", "<Up>": "↑", "<Down>": "↓", "<Left>": "←", "<Right>": "→", "<F1>": "help", "<Help>": "help",
"<S-Up>": "page ↑", "<S-Down>": "page ↓", "<S-Left>": "← word", "<S-Right>": "word →", "<C-Left>": "← word",
"<C-Right>": "word →", "<C-Home>": "first line", "<C-End>": "last line", "<S-CR>": "page ↓",
// g…
"g~": "toggle case", "gu": "lowercase", "gU": "uppercase", "gq": "format", "gw": "format, stay", "gJ": "join raw",
"gi": "insert at last", "gI": "insert col 1", "gv": "reselect", "gn": "select match", "gN": "← select match",
"gp": "put after+", "gP": "put before+", "g;": "older change", "g,": "newer change", "gf": "open file",
"gF": "file:line", "gd": "local def", "gD": "global def", "gx": "open URL", "gstar": "word →*", "g#": "← word*",
"gj": "↓ display", "gk": "↑ display", "g0": "display start", "g$": "display end", "g_": "last char", "gm": "mid screen",
"gM": "mid line", "ge": "← word end", "gE": "← WORD end", "ga": "char code", "g8": "UTF-8 bytes", "g<": "last output",
"g&": "repeat :s all", "g?": "rot13", "gR": "virt replace", "gr": "virt repl char", "gs": "sleep", "gt": "next tab",
"gT": "prev tab", "g<Tab>": "last tab", "go": "byte N", "gh": "select mode", "gH": "select line", "g@": "operatorfunc",
"g+": "newer state", "g-": "older state", "g]": "tselect", "g_CTRL-]": "tjump", "gV": "no reselect", "g^": "display first",
"g<Home>": "display start", "g<End>": "display end", "g'": "mark (no jump)", "g`": "mark (no jump)", "g?g?": "rot13 line",
"g_CTRL-A": "dump memory", "g_CTRL-G": "word count", "g_CTRL-H": "select block", "gQ": "Ex mode", "g<Down>": "↓ display", "g<Up>": "↑ display",
// z…
"zz": "center", "zt": "top", "zb": "bottom", "z<CR>": "top, BOL", "z.": "center, BOL", "z-": "bottom, BOL",
"za": "toggle fold", "zA": "toggle deep", "zc": "close fold", "zC": "close deep", "zo": "open fold", "zO": "open deep",
"zR": "open all", "zM": "close all", "zr": "fold less", "zm": "fold more", "zf": "create fold", "zF": "fold N lines",
"zd": "delete fold", "zD": "delete deep", "zE": "erase folds", "zj": "next fold", "zk": "prev fold", "zv": "show cursor",
"zx": "update folds", "zX": "reapply", "zn": "folds off", "zN": "folds on", "zi": "toggle folds", "zh": "scroll ←",
"zl": "scroll →", "zH": "½ screen ←", "zL": "½ screen →", "zs": "scroll start", "ze": "scroll end", "zg": "good word",
"zG": "good (temp)", "zw": "bad word", "zW": "bad (temp)", "z=": "spell fix", "zug": "undo zg", "zp": "paste block",
"zP": "paste block ←", "zy": "yank block", "z+": "page ↓", "z^": "page ↑", "z<Left>": "scroll ←", "z<Right>": "scroll →",
// [ ]
"[(": "← unmatched (", "])": "unmatched ) →", "[{": "← unmatched {", "]}": "unmatched } →", "[[": "← section",
"]]": "section →", "[]": "← SECTION", "][": "SECTION →", "[m": "← method", "]m": "method →", "[M": "← method end",
"]M": "method end →", "[s": "← misspelled", "]s": "misspelled →", "[c": "← change", "]c": "change →", "[z": "fold start",
"]z": "fold end", "[p": "put above, indent", "]p": "put below, indent", "['": "← mark line", "]'": "mark line →",
"[`": "← mark", "]`": "mark →", "[/": "← comment", "]/": "comment →", "[#": "← #if", "]#": "#endif →",
"[star": "← comment", "]star": "comment →", "[i": "show def", "]i": "show def", "[I": "list matches", "]I": "list matches",
"[d": "show #define", "]d": "show #define", "[D": "list #defines", "]D": "list #defines", "[f": "open file", "]f": "open file",
"[P": "put, indent", "]P": "put, indent", "[_CTRL-I": "jump to match", "]_CTRL-I": "jump to match",
"[_CTRL-D": "jump #define", "]_CTRL-D": "jump #define",
// CTRL-W …
"CTRL-W_s": "split", "CTRL-W_S": "split", "CTRL-W_v": "vsplit", "CTRL-W_n": "new", "CTRL-W_q": "quit", "CTRL-W_c": "close",
"CTRL-W_o": "only", "CTRL-W_w": "next", "CTRL-W_W": "previous", "CTRL-W_p": "last used", "CTRL-W_h": "← window",
"CTRL-W_j": "↓ window", "CTRL-W_k": "↑ window", "CTRL-W_l": "→ window", "CTRL-W_t": "top window", "CTRL-W_b": "bottom window",
"CTRL-W_H": "move far ←", "CTRL-W_J": "move bottom", "CTRL-W_K": "move top", "CTRL-W_L": "move far →", "CTRL-W_r": "rotate ↓",
"CTRL-W_R": "rotate ↑", "CTRL-W_x": "exchange", "CTRL-W_=": "equalize", "CTRL-W_+": "taller", "CTRL-W_-": "shorter",
"CTRL-W_<": "narrower", "CTRL-W_>": "wider", "CTRL-W__": "max height", "CTRL-W_bar": "max width", "CTRL-W_T": "to new tab",
"CTRL-W_f": "split file", "CTRL-W_F": "split file:line", "CTRL-W_]": "split tag", "CTRL-W_^": "split alt",
"CTRL-W_}": "preview tag", "CTRL-W_z": "close preview", "CTRL-W_P": "to preview", "CTRL-W_d": "split def",
"CTRL-W_i": "split decl", "CTRL-W_g": "g… (tabs)", "CTRL-W_gf": "file in tab", "CTRL-W_gF": "file:line tab",
"CTRL-W_gt": "next tab", "CTRL-W_gT": "prev tab", "CTRL-W_e": "", "CTRL-W_<Up>": "↑ window", "CTRL-W_<Down>": "↓ window",
"CTRL-W_<Left>": "← window", "CTRL-W_<Right>": "→ window",
// Visual
"v_o": "other end", "v_O": "other corner", "v_d": "delete", "v_x": "delete", "v_c": "change", "v_s": "change",
"v_y": "yank", "v_p": "replace", "v_P": "replace, keep", "v_r": "replace chars", "v_u": "lowercase", "v_U": "uppercase",
"v_~": "toggle case", "v_>": "indent", "v_<": "dedent", "v_=": "reindent", "v_J": "join", "v_gJ": "join raw",
"v_:": "cmd on range", "v_b_I": "block insert", "v_b_A": "block append", "v_C": "change lines", "v_S": "change lines",
"v_R": "change lines", "v_X": "delete lines", "v_D": "delete lines", "v_Y": "yank lines", "v_v": "charwise",
"v_V": "linewise", "v_CTRL-V": "blockwise", "v_gv": "swap previous", "v_<Esc>": "exit", "v_CTRL-C": "exit",
"v_CTRL-A": "increment", "v_CTRL-X": "decrement", "v_g_CTRL-A": "sequence +", "v_g_CTRL-X": "sequence −", "v_K": "keyword help",
"v_!": "filter", "v_gq": "format", "v_CTRL-G": "select mode", "v_CTRL-]": "tag jump", "v_CTRL-O": "visual once",
// Text objects
"v_iw": "word", "v_aw": "word + space", "v_iW": "WORD", "v_aW": "WORD + space", "v_is": "sentence", "v_as": "sentence +",
"v_ip": "paragraph", "v_ap": "paragraph +", "v_i(": "( ) inside", "v_a(": "( ) block", "v_i)": "( ) inside",
"v_a)": "( ) block", "v_ib": "( ) inside", "v_ab": "( ) block", "v_i[": "[ ] inside", "v_a[": "[ ] block",
"v_i]": "[ ] inside", "v_a]": "[ ] block", "v_i{": "{ } inside", "v_a{": "{ } block", "v_i}": "{ } inside",
"v_a}": "{ } block", "v_iB": "{ } inside", "v_aB": "{ } block", "v_i<": "< > inside", "v_a<": "< > block",
"v_i>": "< > inside", "v_a>": "< > block", "v_it": "tag inside", "v_at": "tag block", "v_iquote": "\" \" inside",
"v_aquote": "\" \" string", "v_i'": "' ' inside", "v_a'": "' ' string", "v_i`": "` ` inside", "v_a`": "` ` string",
// Insert CTRL-…
"i_CTRL-W": "delete word", "i_CTRL-U": "delete line", "i_CTRL-H": "bksp", "i_CTRL-_": "toggle revins", "i_CTRL-T": "indent", "i_CTRL-D": "dedent",
"i_CTRL-R": "insert register", "i_CTRL-O": "one command", "i_CTRL-N": "complete ↓", "i_CTRL-P": "complete ↑",
"i_CTRL-X": "complete…", "i_CTRL-E": "char below", "i_CTRL-Y": "char above", "i_CTRL-A": "insert last",
"i_CTRL-@": "last + exit", "i_CTRL-V": "literal", "i_CTRL-K": "digraph", "i_CTRL-G": "undo/move…", "i_CTRL-]": "abbreviate",
"i_CTRL-C": "quit insert", "i_CTRL-[": "Esc", "i_CTRL-J": "new line", "i_CTRL-M": "new line", "i_CTRL-I": "Tab",
"i_CTRL-Q": "literal", "i_CTRL-^": "toggle lmap", "i_CTRL-Z": "", "i_<Esc>": "Normal mode", "i_<CR>": "new line",
"i_<Tab>": "Tab", "i_<BS>": "backspace", "i_<Del>": "delete →", "i_<Up>": "↑", "i_<Down>": "↓", "i_<Left>": "←",
"i_<Right>": "→", "i_<Home>": "line start", "i_<End>": "line end", "i_<PageUp>": "page ↑", "i_<PageDown>": "page ↓",
"i_<Insert>": "toggle replace", "i_<F1>": "help", "i_<NL>": "new line", "i_CTRL-B": "", "i_CTRL-L": "",
"i_<C-Left>": "← word", "i_<C-Right>": "word →", "i_<S-Left>": "← word", "i_<S-Right>": "word →",
"i_<C-Home>": "file start", "i_<C-End>": "file end", "i_<S-Up>": "page ↑", "i_<S-Down>": "page ↓",
"o_v": "charwise", "o_V": "linewise", "o_CTRL-V": "blockwise",
};
const STOP = new Set(["the", "a", "an", "to", "of", "n", "nth", "and", "or", "with", "in", "for", "on", "at", "is", "it", "go",
"cursor", "under", "current", "from", "that", "this", "by", "be", "lines", "times", "same", "as", "into", "when", "if", "its", "vim.lsp.buf", "inside", "around", "inner", "…"]);
const UNHELPFUL = /^\((lua function|disabled)\)$|^runs |^:help /i;
/** A 1–2 word label from a description: "Toggle Undotree" → "Toggle Undotree", "same as "j"" → "= j". */
function deriveLabel(d) {
d = String(d || "").trim();
if (!d) return "";
let m = d.match(/^same as\s+["`|]?([^"`|]+?)["`|]?(\s|$)/i);
if (m) return "= " + m[1].trim();
m = d.match(/^vim\.lsp\.buf\.([a-z_]+)\(\)/);
if (m) return m[1].replace(/_/g, " ");
m = d.match(/^:(\S+)/);
if (m) return ":" + m[1];
const words = d.replace(/\([^)]*\)|\[[^\]]*\]/g, " ").replace(/["'`|,.:;]/g, " ").split(/\s+/)
.filter((w) => w && !STOP.has(w.toLowerCase()));
// Sentence-case like the hand-written labels ("Clear search" → "clear search"), keeping acronyms (LSP).
return words.slice(0, 2).map((w) => (/^[A-Z][a-z]/.test(w) ? w[0].toLowerCase() + w.slice(1) : w)).join(" ");
}
function labelOf(x) {
if (!x) return "";
if (x.sl) return x.sl;
if (x.kind === "builtin" && x.tag && SL[x.tag] !== undefined && SL[x.tag] !== "") return SL[x.tag];
if (x.kind === "live" && UNHELPFUL.test(x.d)) {
// A Lua callback without a description: use the meaning of the built-in it replaces.
const rep = arr(x.ref.rep).map((r) => builtAt(r.b)).find(Boolean);
if (rep) return labelOf(rep);
if (/^\(disabled\)$/.test(x.d)) return "disabled";
}
return deriveLabel(x.d);
}
// ---- Lookup by key sequence -------------------------------------------------------------------
// IDX[mode] maps the first base token to every entry that can be typed in that mode.
const IDX = {};
for (const x of ALL) {
if (x.ex || !x.btok.length) continue;
for (const m of new Set(x.m.flatMap((m) => (m === "v" ? ["x", "s"] : [m])))) {
const map = IDX[m] || (IDX[m] = new Map());
const k = x.btok[0];
if (!map.has(k)) map.set(k, []);
map.get(k).push(x);
}
}
const KIND_RANK = { live: 0, curated: 1, builtin: 2, cmd: 3 };
/**
* Everything bound to `seq` in `mode`:
* exact – entries whose keys are exactly seq ("w", "<Space>ff")
* belongs – seq followed only by placeholders (f{char}, ["x]d{motion})
* kids – longer sequences that start with seq (prefix maps)
* primary is what actually happens: exact live maps win over built-ins.
*/
function lookup(mode, seq) {
const cand = (IDX[mode] && IDX[mode].get(seq[0])) || [];
const exact = [], belongs = [], kids = [];
for (const x of cand) {
const t = x.btok;
if (t.length < seq.length) continue;
let ok = true;
for (let i = 1; i < seq.length; i++) if (t[i] !== seq[i]) { ok = false; break; }
if (!ok) continue;
if (t.length === seq.length) exact.push(x);
// "f{char}", "/{pattern}<CR>": the key itself, waiting for an argument.
else if (isPh(t[seq.length])) belongs.push(x);
else kids.push(x);
}
const rank = (a, b) => (a.ctx ? 1 : 0) - (b.ctx ? 1 : 0) || KIND_RANK[a.kind] - KIND_RANK[b.kind];
exact.sort(rank); belongs.sort(rank);
const main = [...exact, ...belongs];
let primary = main.find((x) => !x.ctx && x.kind === "live") || main.find((x) => !x.ctx && x.kind === "curated")
|| exact.find((x) => !x.ctx) || belongs.find((x) => !x.ctx) || null;
// A disabled prefix key (mini.surround's "s") is really just a group of longer keys.
// Keys that only exist in some context (a plugin window, a filetype) never label the cap.
const mainKids = kids.filter((x) => !x.ctx);
// The leader key itself: its built-in meaning (Space = "l") is not what anyone presses it for.
const isLeader = seq.length === 1 && seq[0] === LEADER_TOK && mainKids.some((x) => x.ld);
const asGroup = mainKids.length && (isLeader || !primary || (primary.kind === "live" && /^\(disabled\)$/.test(primary.d)));
return { mode, seq, exact, belongs, kids, mainKids, primary, asGroup: !!asGroup, isLeader };
}
function groupName(seq, kids) {
if (seq.length === 1 && seq[0] === LEADER_TOK && kids.some((x) => x.ld)) return "leader…";
const g = GROUPS.get(seq.join(""));
if (g && g.name) return g.name.replace(/^\+/, "");
const srcs = new Set(kids.filter((k) => !k.ctx).map((k) => k.s));
if (srcs.size === 1) {
const s = [...srcs][0];
if (s !== "builtin" && s !== "config" && s !== "neovim") return s.replace(/^mini\./, "").replace(/[.-]nvim$/, "") + "…";
}
const uniq = [...new Set(kids.map((k) => k.btok.slice(seq.length).map(glyphTok).join("")))];
if (uniq.length === 1) return "→ " + uniq[0];
return `${glyphTok(seq[seq.length - 1])} prefix`;
}
// ---- What's different -------------------------------------------------------------------------
{
const notes = arr(D.notes);
const cards = notes.map((nt) => {
nt = obj(nt);
const kind = ["change", "warn", "tip"].includes(nt.kind) ? nt.kind : "change";
const kindLabel = { change: "changed", warn: "watch out", tip: "tip" }[kind];
const rows = arr(nt.rows).map((r) => `<dt>${arr(r)[0] ?? ""}</dt><dd>${arr(r)[1] ?? ""}</dd>`).join("");
// Note fields (lead, rows, note) are HTML by design; only the title is escaped.
return { kind, html: `<div class="${kind}"><b class="t">${esc(nt.title || "")}<em>${kindLabel}</em></b>${nt.lead ? `<p class="lead">${nt.lead}</p>` : ""}${rows ? `<dl>${rows}</dl>` : ""}${nt.note ? `<p>${nt.note}</p>` : ""}</div>` };
});
// Kind chips + a "show all" fold so 30-odd cards don't bury the rest of the page.
const NOTE_FOLD = 9;
const NK = { all: "All", warn: "Watch out", change: "Changed", tip: "Tips" };
let nkind = "all", nall = false;
function drawNotes() {
const list = cards.filter((c) => nkind === "all" || c.kind === nkind);
const show = nall ? list : list.slice(0, NOTE_FOLD);
$("notecards").innerHTML = show.map((c) => c.html).join("");
$("notemore").hidden = list.length <= NOTE_FOLD;
$("notemore").textContent = nall ? "Show fewer cards" : `Show all ${list.length} cards`;
$("notemore").setAttribute("aria-expanded", String(nall));
for (const b of $("notechips").children) b.setAttribute("aria-pressed", String(b.dataset.v === nkind));
}
$("notechips").innerHTML = Object.entries(NK).map(([k, l]) => {
const n = k === "all" ? cards.length : cards.filter((c) => c.kind === k).length;
return n ? `<button type="button" class="chip" data-v="${k}" aria-pressed="${k === nkind}">${l}<span>${n}</span></button>` : "";
}).join("");
$("notechips").addEventListener("click", (e) => { const b = e.target.closest(".chip"); if (b) { nkind = b.dataset.v; drawNotes(); } });
$("notemore").addEventListener("click", () => { const was = nall; nall = !nall; drawNotes(); if (was) scrollToEl($("notechips")); });
drawNotes();
if (!cards.length) { $("notecards").hidden = true; $("notechips").hidden = true; }
const lists = [];
// 1. Built-ins replaced by a mapping, grouped by who replaced them.
const pairs = new Map(); // "b|live" → {B, L, modes}
for (const B of BUILT) {
for (const o of arr(B.ref.ov)) {
const L = liveAt(o.by);
if (!L) continue;
const key = `${B.kf}|${B.d}|${o.by}`;
if (!pairs.has(key)) pairs.set(key, { B, L, modes: new Set() });
pairs.get(key).modes.add(o.m);
}
}
const bySrc = groupBy([...pairs.values()], (p) => p.L.s);
const srcOrder = [...bySrc.keys()].sort((a, b) => ["config", "plugin", "neovim", "builtin"].indexOf(srcKind(a)) - ["config", "plugin", "neovim", "builtin"].indexOf(srcKind(b)) || a.localeCompare(b));
if (pairs.size) {
lists.push(`<details class="dl"><summary><h3>Built-ins replaced by a mapping <span class="count">${pairs.size}</span></h3></summary>
<p>The original Vim meaning (struck through) and what the key does now.</p>
${srcOrder.map((s) => `<div class="dgroup"><h4>${srcBadge(s)} <span>${bySrc.get(s).length}</span></h4>${bySrc.get(s).map(({ B, L, modes }) => `
<div class="drow"><div>${keysHTML(B)}</div><div><span class="was">${esc(B.d)}</span><span class="arrow" aria-hidden="true">→</span><b>${esc(L.d)}</b>
<div class="meta">${modeBadges([...modes])}${L.ctx ? `<span class="ctx">${esc(L.ctx)}</span>` : ""}${fileLine(L)}</div></div></div>`).join("")}</div>`).join("")}
</details>`);
}
// 2. Mappings made unreachable by a shorter nowait map.
const dead = LIVE.filter((x) => arr(x.ref.sh).length);
if (dead.length) {
lists.push(`<details class="dl"><summary><h3>Mappings made unreachable <span class="count">${dead.length}</span></h3></summary>
<p>A shorter <code>nowait</code> map fires as soon as its keys are typed, so these longer maps can never be reached.</p>
<div class="dgroup">${dead.map((x) => { const by = arr(x.ref.sh).map((s) => liveAt(s.by)).filter(Boolean)[0]; return `
<div class="drow"><div>${keysHTML(x)}</div><div><span class="was">${esc(x.d)}</span> ${srcBadge(x.s)}
<div class="meta">${by ? `blocked by ${keysHTML(by)} ${esc(by.d)} · ${fileLine(by)}` : ""}</div></div></div>`; }).join("")}</div></details>`);
}
// 3. Complete built-ins that now wait 'timeoutlen' because a mapping extends them.
const waits = BUILT.filter((x) => arr(x.ref.wait).length);
if (waits.length) {
lists.push(`<details class="dl"><summary><h3>Keys that now wait ${esc(TIMEOUT)} ms <span class="count">${waits.length}</span></h3></summary>
<p>These built-ins still work, but because longer mappings start with the same keys Neovim pauses for <code>'timeoutlen'</code> (${esc(TIMEOUT)} ms) before running them. Type the next key sooner to pick a longer map.</p>
<div class="dgroup">${waits.map((x) => `
<div class="drow"><div>${keysHTML(x)}</div><div>${esc(x.d)}<div class="meta">${arr(x.ref.wait).map((w) =>
`<span>${modeBadges([w.m])} ${arr(w.ext).map((k) => `<code>${esc(k)}</code>`).join(" ")}${w.n > arr(w.ext).length ? ` +${w.n - arr(w.ext).length} more` : ""}</span>`).join("")}</div></div></div>`).join("")}</div></details>`);
}
// 4. Printable keys mapped in Select mode (snippet placeholders are Select mode).
const traps = LIVE.filter(selectTrap);
if (traps.length) {
lists.push(`<details class="dl"><summary><h3>Printable keys mapped in Select mode <span class="count">${traps.length}</span></h3></summary>
<p>Snippet placeholders are selected in Select mode, where typing a printable key should replace the placeholder. These maps (set with mode <code>"v"</code>, which includes Select) run instead${traps.some((x) => x.tok[0] === "<Space>") ? `, and a typed <kbd>Space</kbd> waits ${esc(TIMEOUT)} ms for the leader maps` : ""}. Mapping <code>"x"</code> instead of <code>"v"</code> avoids this.</p>
<div class="dgroup">${traps.map((x) => `
<div class="drow"><div>${keysHTML(x)}</div><div>${esc(x.d)} ${srcBadge(x.s)}<div class="meta">${modeBadges(x.m)}${fileLine(x)}</div></div></div>`).join("")}</div></details>`);
}
$("difflists").innerHTML = lists.join("") || `<p class="muted">No differences detected.</p>`;
}
// ---- Keyboard ---------------------------------------------------------------------------------
// US ANSI board in key units (1u = one letter key). Printable keys carry base/shifted characters,
// named keys a Vim key name, and modifier keys are toggles.
const KB_W = 18.25, KB_H = 6.25;
const KEYS = [];
function addRow(y, x, items) {
for (const it of items) {
const w = it.w || 1;
if (!it.gap) KEYS.push({ ...it, x, y, w });
x += w;
}
}
const pair = (b, s, w) => ({ b, s, w });
const letters = (s) => s.split("").map((c) => pair(c, c.toUpperCase()));
const fk = (a, b) => Array.from({ length: b - a + 1 }, (_, i) => ({ n: "F" + (a + i) }));
addRow(0, 0, [{ n: "Esc" }, { gap: 1, w: 1 }, ...fk(1, 4), { gap: 1, w: 0.5 }, ...fk(5, 8), { gap: 1, w: 0.5 }, ...fk(9, 12)]);
addRow(1.25, 0, [pair("`", "~"), pair("1", "!"), pair("2", "@"), pair("3", "#"), pair("4", "$"), pair("5", "%"), pair("6", "^"),
pair("7", "&"), pair("8", "*"), pair("9", "("), pair("0", ")"), pair("-", "_"), pair("=", "+"), { n: "BS", w: 2, label: "Backspace" }]);
addRow(1.25, 15.25, [{ n: "Insert", label: "Ins" }, { n: "Home" }, { n: "PageUp", label: "PgUp" }]);
addRow(2.25, 0, [{ n: "Tab", w: 1.5 }, ...letters("qwertyuiop"), pair("[", "{"), pair("]", "}"), pair("\\", "|", 1.5)]);
addRow(2.25, 15.25, [{ n: "Del" }, { n: "End" }, { n: "PageDown", label: "PgDn" }]);
addRow(3.25, 0, [{ mod: "Caps", w: 1.75 }, ...letters("asdfghjkl"), pair(";", ":"), pair("'", '"'), { n: "CR", w: 2.25, label: "Enter" }]);
addRow(4.25, 0, [{ mod: "Shift", w: 2.25 }, ...letters("zxcvbnm"), pair(",", "<"), pair(".", ">"), pair("/", "?"), { mod: "Shift", w: 2.75 }]);
addRow(4.25, 16.25, [{ n: "Up", label: "↑" }]);
addRow(5.25, 0, [{ mod: "Ctrl", w: 1.25 }, { mod: "Super", w: 1.25 }, { mod: "Alt", w: 1.25 }, { n: "Space", w: 6.25 },
{ mod: "Alt", w: 1.25 }, { mod: "Super", w: 1.25 }, { mod: "Menu", w: 1.25 }, { mod: "Ctrl", w: 1.25 }]);
addRow(5.25, 15.25, [{ n: "Left", label: "←" }, { n: "Down", label: "↓" }, { n: "Right", label: "→" }]);
// Layers: a mode, a prefix typed first, and which modifiers start held.
const LAYERS = [
{ id: "normal", name: "Normal", mode: "n", prefix: [], led: "var(--h1)", about: "Normal mode: what each key does on its own." },
{ id: "shift", name: "Shift", mode: "n", prefix: [], shift: true, led: "var(--h3)", about: "Normal mode with <kbd>Shift</kbd> held: capitals and the shifted symbols." },
{ id: "ctrl", name: "Ctrl", mode: "n", prefix: [], ctrl: true, led: "var(--h5)", about: "Normal mode with <kbd>Ctrl</kbd> held." },
{ id: "g", name: "g…", mode: "n", prefix: ["g"], led: "var(--h2)", about: "Press <kbd>g</kbd>, then:" },
{ id: "z", name: "z…", mode: "n", prefix: ["z"], led: "var(--h9)", about: "Press <kbd>z</kbd>, then: (folds, scrolling, spelling)" },
{ id: "lb", name: "[…", mode: "n", prefix: ["["], led: "var(--h7)", about: "Press <kbd>[</kbd>, then: (mostly “go backwards to …”)" },
{ id: "rb", name: "]…", mode: "n", prefix: ["]"], led: "var(--h7)", about: "Press <kbd>]</kbd>, then: (mostly “go forwards to …”)" },
{ id: "cw", name: "Ctrl-W…", mode: "n", prefix: ["<C-W>"], led: "var(--h10)", about: "Press <kbd>Ctrl</kbd><kbd>W</kbd>, then: (windows)" },
{ id: "leader", name: "Leader…", mode: "n", prefix: [LEADER_TOK], led: "var(--s-config)", leader: true, about: "Press the leader key, then:" },
{ id: "visual", name: "Visual", mode: "x", prefix: [], led: "var(--h5)", about: "Visual mode (after <kbd>v</kbd>, <kbd>V</kbd> or <kbd>Ctrl</kbd><kbd>V</kbd>)." },
{ id: "insert", name: "Insert (Ctrl)", mode: "i", prefix: [], ctrl: true, namedPlain: true, led: "var(--h4)", about: "Insert mode with <kbd>Ctrl</kbd> held. Named keys (Tab, Enter, arrows…) are shown without Ctrl." },
{ id: "obj", name: "Text objects", mode: "o", prefix: ["i"], ai: true, led: "var(--h2)", about: "After an operator (<kbd>d</kbd>, <kbd>c</kbd>, <kbd>y</kbd>…) or in Visual mode, type <kbd>i</kbd> or <kbd>a</kbd>, then (click <kbd>Shift</kbd> for <code>( { &lt; \" W B</code>):" },
];
const KB = { layer: 0, shift: false, ctrl: false, ai: "i", cur: -1, infos: [] };
/** The Vim token a physical key produces under the current modifiers (null for modifier keys). */
function keyToken(k, layer) {
if (k.mod) return null;
const ctrl = KB.ctrl && !(k.n && layer.namedPlain);
if (k.n) {
const mods = [...(ctrl ? ["C"] : []), ...(KB.shift ? ["S"] : [])];
if (!mods.length) return k.n === "Space" ? "<Space>" : `<${k.n}>`;
return `<${mods.join("-")}-${k.n}>`;
}
const ch = KB.shift ? k.s : k.b;
if (!ctrl) return ch;
if (/^[a-z]$/.test(k.b)) return KB.shift ? `<C-S-${k.b.toUpperCase()}>` : `<C-${k.b.toUpperCase()}>`;
return `<C-${ch}>`;
}
// Ctrl+symbol keys that terminals send as a different control character.
const CTRL_ALIAS = { "<C-6>": "<C-^>", "<C-2>": "<C-@>", "<C-->": "<C-_>", "<C-/>": "<C-_>" };
function infoFor(k, layer) {
const tok = keyToken(k, layer);
if (!tok) return null;
const prefix = layer.ai ? [KB.ai] : layer.prefix;
const seq = [...prefix, tok];
let info = lookup(layer.mode, seq);
if (!info.primary && !info.kids.length && CTRL_ALIAS[tok]) {
const alt = lookup(layer.mode, [...prefix, CTRL_ALIAS[tok]]);
if (alt.primary || alt.kids.length) info = alt;
}
info.tok = tok;
return info;
}
function capContent(k, info) {
if (k.mod) return { cls: "modkey", g: esc(k.mod), lb: "", mk: "" };
const tok = info.tok;
const g = esc(k.n && !KB.shift && !(KB.ctrl && !LAYERS[KB.layer].namedPlain) ? k.label || glyphTok(tok) : glyphTok(tok));
const p = info.primary;
if (!p && !info.mainKids.length) return { cls: "none", g, lb: "", mk: "" };
let lb, cat, mk, dead = false;
if (info.asGroup) {
lb = groupName(info.seq, info.mainKids);
const g2 = GROUPS.get(info.seq.join(""));
cat = (g2 && g2.cat) || info.mainKids[0].cat;
mk = `<i class="mk group" aria-hidden="true"></i>`;
} else {
lb = labelOf(p);
cat = p.cat;
const waits = p.kind === "builtin" && arr(p.ref.wait).some((w) => w.m === info.mode);
if (p.kind === "builtin") mk = `<i class="mk builtin${waits ? " wait" : ""}" aria-hidden="true"></i>`;
else mk = `<i class="mk live" style="--mkc:var(--s-${p.sk})" aria-hidden="true"></i>`;
dead = p.kind === "live" && arr(p.ref.sh).some((s) => s.m === info.mode);
}
return { cls: `tint${dead ? " dead" : ""}`, g, lb: esc(lb), mk, cat };
}
function drawKB() {
const layer = LAYERS[KB.layer];
for (const t of $("kbtabs").children) t.setAttribute("aria-selected", String(+t.dataset.i === KB.layer));
$("aiswitch").hidden = !layer.ai;
for (const b of $("aiswitch").children) b.setAttribute("aria-pressed", String(b.dataset.ai === KB.ai));
KB.infos = KEYS.map((k) => infoFor(k, layer));
const cats = new Map();
$("kb").innerHTML = KEYS.map((k, i) => {
const info = KB.infos[i];
const c = capContent(k, info || {});
if (c.cat) cats.set(c.cat, (cats.get(c.cat) || 0) + 1);
const style = `left:${(k.x / KB_W) * 100}%;top:${(k.y / KB_H) * 100}%;width:${(k.w / KB_W) * 100}%;height:${(1 / KB_H) * 100}%`;
const pressed = k.mod === "Shift" ? KB.shift : k.mod === "Ctrl" ? KB.ctrl : null;
const aria = k.mod ? `${k.mod}${pressed === null ? "" : pressed ? " (held)" : " (not held)"}`
: `${info ? info.seq.join("") : ""}${c.lb ? ": " + c.lb : ""}`;
return `<button type="button" class="key ${c.cls}${i === KB.cur ? " cur" : ""}" style="${style}" data-i="${i}"${pressed === null ? "" : ` aria-pressed="${pressed}"`}${k.mod && pressed === null ? ' tabindex="-1"' : ""} aria-label="${esc(aria)}">
<span class="cap" style="${c.cat ? `--cat:${catVar(c.cat)}` : ""}">${c.mk || ""}<span class="g">${c.g}</span><span class="lb">${c.lb}</span></span></button>`;
}).join("");
const sorted = [...cats.entries()].sort((a, b) => catRank(a[0]) - catRank(b[0]));
$("kblegend").innerHTML = sorted.map(([c]) => `<span class="c" style="--cat:${catVar(c)}">${esc(c)}</span>`).join("")
+ `<span><i class="mk live" style="--mkc:var(--s-config)"></i>your map</span><span><i class="mk live" style="--mkc:var(--s-plugin)"></i>plugin map</span>`
+ `<span><i class="mk live" style="--mkc:var(--s-neovim)"></i>Neovim default</span><span><i class="mk builtin"></i>plain built-in</span>`
+ `<span><i class="mk builtin wait"></i>waits ${esc(TIMEOUT)} ms</span><span><i class="mk group"></i>prefix: more keys follow</span>`;
const prefixCaps = layer.ai ? `<kbd>${esc(KB.ai)}</kbd>` : "";
const held = [KB.ctrl ? "Ctrl" : "", KB.shift ? "Shift" : ""].filter(Boolean);
$("layermeta").innerHTML = `${layer.about} ${prefixCaps}${layer.leader ? ` ${tokCaps([LEADER_TOK], { ld: true })}` : ""}${held.length ? ` <span class="muted">· holding ${held.map((h) => `<kbd>${h}</kbd>`).join(" ")}</span>` : ""}`;
if (KB.cur >= 0 && KB.infos[KB.cur]) showKey(KB.cur);
else $("keyinfo").innerHTML = `<span class="muted">Hover or focus a key to see everything bound to it in this layer.</span>`;
}
$("kbtabs").innerHTML = LAYERS.map((l, i) =>
`<button type="button" class="tab" role="tab" id="kbtab-${l.id}" style="--led:${l.led}" aria-selected="${i === KB.layer}" aria-controls="kb" data-i="${i}"><i></i>${esc(l.name)}</button>`).join("");
function selectLayer(i) {
KB.layer = i;
KB.shift = !!LAYERS[i].shift;
KB.ctrl = !!LAYERS[i].ctrl;
KB.cur = -1;
drawKB();
}
$("kbtabs").addEventListener("click", (e) => { const b = e.target.closest(".tab"); if (b) selectLayer(+b.dataset.i); });
// Arrow keys move between tabs (tablist pattern).
function tabArrows(listEl, onPick) {
listEl.addEventListener("keydown", (e) => {
if (!["ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key)) return;
const tabs = [...listEl.querySelectorAll('[role="tab"]')];
const i = tabs.indexOf(document.activeElement);
if (i < 0) return;
e.preventDefault();
const j = e.key === "Home" ? 0 : e.key === "End" ? tabs.length - 1 : (i + (e.key === "ArrowRight" ? 1 : -1) + tabs.length) % tabs.length;
onPick(tabs[j]);
const again = [...listEl.querySelectorAll('[role="tab"]')][j];
if (again) again.focus();
});
}
tabArrows($("kbtabs"), (t) => selectLayer(+t.dataset.i));
$("aiswitch").addEventListener("click", (e) => { const b = e.target.closest("[data-ai]"); if (b) { KB.ai = b.dataset.ai; drawKB(); } });
/** Detail panel: every entry for the key in this layer, then the longer keys it starts. */
function entryLI(x, mode) {
const struck = x.kind === "builtin" && arr(x.ref.ov).some((o) => o.m === mode);
return `<li><div class="top">${keysHTML(x)} <span class="${struck ? "was" : ""}">${esc(x.d)}</span></div>
<div class="rm">${srcBadge(x.s)}${x.ctx ? `<span class="ctx">${esc(x.ctx)}</span>` : ""}<span class="catb" style="--cat:${catVar(x.cat)}">${esc(x.cat)}</span>${modeBadges(x.m)}</div>
${(() => { const f = flagsHTML(x, mode); return f ? `<div class="rflags">${f}</div>` : ""; })()}
${x.n ? `<div class="rn">${x.n}</div>` : ""}
<div class="rf">${fileLine(x)}${helpHTML(x)}</div></li>`;
}
function showKey(i) {
const info = KB.infos[i];
if (!info) return;
KB.cur = i;
for (const el of $("kb").querySelectorAll(".key.cur")) el.classList.remove("cur");
const el = $("kb").querySelector(`.key[data-i="${i}"]`);
if (el) el.classList.add("cur");
const layer = LAYERS[KB.layer];
const mode = info.mode;
const head = `<div class="ki-head">${tokCaps(info.seq, { ld: !!layer.leader })}<span class="muted">in ${esc(modeNames([mode]))} mode</span></div>`;
const main = [...info.exact, ...info.belongs];
const kids = info.kids.slice().sort((a, b) => KIND_RANK[a.kind] - KIND_RANK[b.kind] || a.kf.localeCompare(b.kf));
// One chip per distinct continuation; the live map wins over the built-in it replaces.
const seen = new Map();
for (const k of kids) { const rest = k.btok.slice(info.seq.length).join(""); if (!seen.has(rest)) seen.set(rest, k); }
const chips = [...seen.values()];
const MAX = 40;
const g = info.asGroup ? GROUPS.get(info.seq.join("")) : null;
$("keyinfo").innerHTML = head
+ (main.length ? `<ul class="ki-list">${main.map((x) => entryLI(x, mode)).join("")}</ul>` : (info.kids.length ? "" : `<p class="muted">Nothing is bound to this key here.</p>`))
+ (chips.length ? `<div><p class="muted">${g && g.name ? `<b>${esc(g.name)}</b> · ` : ""}Then press (${chips.length}):</p><div class="kids">${chips.slice(0, MAX).map((k) =>
`<span class="kid">${tokCaps(k.btok.slice(info.seq.length))}<span>${esc(k.d)}</span></span>`).join("")}${chips.length > MAX ? `<span class="kid">+${chips.length - MAX} more — search the finder</span>` : ""}</div></div>` : "");
}
$("kb").addEventListener("mouseover", (e) => { const k = e.target.closest(".key"); if (k && KB.infos[+k.dataset.i]) showKey(+k.dataset.i); });
$("kb").addEventListener("focusin", (e) => { const k = e.target.closest(".key"); if (k && KB.infos[+k.dataset.i]) showKey(+k.dataset.i); });
$("kb").addEventListener("click", (e) => {
const el = e.target.closest(".key");
if (!el) return;
const k = KEYS[+el.dataset.i];
if (k.mod === "Shift" || k.mod === "Ctrl") {
if (k.mod === "Shift") KB.shift = !KB.shift; else KB.ctrl = !KB.ctrl;
const i = +el.dataset.i;
drawKB();
const again = $("kb").querySelector(`.key[data-i="${i}"]`);
if (again) again.focus();
return;
}
const info = KB.infos[+el.dataset.i];
if (!info) return;
showKey(+el.dataset.i);
sendToFinder(info.seq.join(""), info.mode);
});
// ---- Leader tree ---------------------------------------------------------------------------------
{
const maps = LIVE.filter((x) => x.ld && !x.ctx && x.tok[0] === LEADER_TOK);
const leaderCap = tokCaps([LEADER_TOK], { ld: true });
$("leaderintro").innerHTML = maps.length
? `${maps.length} maps start with the leader ${leaderCap}${LEADER === " " ? " (Space)" : ""}. Groups follow which-key's names.${arr(META.plugins).includes("which-key") ? " Press the leader and pause (which-key's default delay is 200 ms) to see the popup." : ""}`
: "No leader maps found.";
const groupsSorted = [...GROUPS.entries()].map(([k, g]) => ({ toks: canonKeys(g.k), key: k, ...g })).sort((a, b) => b.toks.length - a.toks.length);
const cards = new Map(); // second token → { items, subs: Map }
const top = [];
const hasKids = (x) => maps.some((y) => y !== x && y.tok.length > x.tok.length && y.tok.slice(0, x.tok.length).join("") === x.kb);
for (const x of maps) {
if (x.tok.length <= 2 && !hasKids(x)) { top.push(x); continue; }
const k2 = x.tok.slice(0, 2).join("");
if (!cards.has(k2)) cards.set(k2, { toks: x.tok.slice(0, 2), items: [], subs: new Map() });
const card = cards.get(k2);
const sub = groupsSorted.find((g) => g.toks.length > 2 && x.tok.length > g.toks.length && g.toks.join("") === x.tok.slice(0, g.toks.length).join(""));
if (sub) {
if (!card.subs.has(sub.key)) card.subs.set(sub.key, { g: sub, items: [] });
card.subs.get(sub.key).items.push(x);
} else card.items.push(x);
}
// Groups with a single item read better at the top level.
for (const [k, c] of [...cards]) if (c.items.length + [...c.subs.values()].reduce((n, s) => n + s.items.length, 0) === 1 && !GROUPS.has(k)) { top.push(...c.items, ...[...c.subs.values()].flatMap((s) => s.items)); cards.delete(k); }
const byKey = (a, b) => a.kb.toLowerCase().localeCompare(b.kb.toLowerCase()) || (a.kb < b.kb ? 1 : -1);
// which-key style: items show only the keys after their card's (or sub-group's) prefix.
const item = (x, skip) => `<div class="litem" title="${esc(x.raw)}">${tokCaps(x.tok.slice(skip))}<span>${esc(x.d)}${x.sk !== "config" ? ` ${srcBadge(x.s)}` : ""}</span><span class="ms">${x.m.length === 1 && x.m[0] === "n" ? "" : modeBadges(x.m)}</span></div>`;
const cardHTML = (toks, name, cat, items, subs) => `<div class="lcard" style="--cat:${catVar(cat)}">
<header>${tokCaps(toks, { ld: true })}<h3>${esc(name)}</h3><span class="count">${items.length + subs.reduce((n, s) => n + s.items.length, 0)}</span></header>
${items.sort(byKey).map((x) => item(x, toks.length)).join("")}
${subs.map((s) => `<h4>${tokCaps(s.g.toks.slice(toks.length))} ${esc(s.g.name || "")}</h4>${s.items.sort(byKey).map((x) => item(x, s.g.toks.length)).join("")}`).join("")}
</div>`;
const out = [];
if (top.length) out.push(cardHTML([LEADER_TOK], "Top level", "Find & pick", top, []));
for (const [k, c] of [...cards].sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase()))) {
const g = GROUPS.get(k);
const name = g && g.name ? g.name.replace(/^\+/, "") : `${glyphTok(c.toks[1])} group`;
const cat = (g && g.cat) || (c.items[0] || [...c.subs.values()][0].items[0]).cat;
out.push(cardHTML(c.toks, name, cat, c.items, [...c.subs.values()]));
}
$("ltree").innerHTML = out.join("");
}
// ---- Finder ------------------------------------------------------------------------------------------
// scope: starter = essentials + everything the config adds or changes (the default view; a typed query
// searches everything), ess = essentials, chg = changed by the config, all = everything.
const F = { mode: "all", src: "all", cat: "All", scope: "starter", limit: 100 };
const PAGE = 100;
let shown = [], shownQuery = false, scoredCount = 0;
let composed = null;
const OP_RE = /\{motion\}$/;
function decompose(toks) {
toks = arr(toks).slice();
let count = "";
while (toks.length && /^[1-9]$/.test(toks[0]) || (count && toks.length && /^\d$/.test(toks[0]))) count += toks.shift();
const eff = (list) => list.sort((a, b) => KIND_RANK[a.kind] - KIND_RANK[b.kind])[0];
for (let i = Math.min(toks.length - 1, 2); i >= 1; i--) {
const opK = toks.slice(0, i).join(""), rest = toks.slice(i).join("");
const op = BUILT.find((x) => x.kb === opK && OP_RE.test(x.kf) && x.m.includes("n"))
|| [...CUR, ...LIVE].find((x) => !x.ctx && x.kb === opK && OP_RE.test(x.kf) && x.m.includes("n"));
if (!op) continue;
const usable = (x) => !x.ex && !x.ctx && x.kind !== "cmd" && (modeHas(x, "o") || (x.kind === "builtin" && x.ref.mo && x.m.includes("n")));
// Exact keys first, then "iN{id}"-style entries whose last key is a placeholder ("iNb", "f(").
const mo = eff(ALL.filter((x) => usable(x) && x.kb === rest))
|| eff(ALL.filter((x) => usable(x) && x.kb && rest.length > x.kb.length && rest.startsWith(x.kb)
&& rest.length - x.kb.length === 1 && x.btok.length > x.core.length));
if (mo) return { op, mo, count, keys: toks };
}
return null;
}
const inStarter = (x) => x.e || x.changed || x.sk === "config";
const MODE_CHIPS = [["all", "All"], ["n", "Normal"], ["x", "Visual"], ["o", "Op-pending"], ["i", "Insert"], ["c", "Cmdline"], ["t", "Terminal"], ["s", "Select"], [":", "Ex commands"]];
$("modechips").innerHTML = `<span class="lbl">Mode</span>` + MODE_CHIPS.map(([m, l]) => `<button type="button" class="chip" data-v="${esc(m)}" aria-pressed="${m === F.mode}">${esc(l)}</button>`).join("");
{
const counts = new Map();
for (const x of ALL) counts.set(x.s, (counts.get(x.s) || 0) + 1);
const kinds = { builtin: 0, neovim: 0, config: 0, plugin: 0 };
for (const [s, n] of counts) kinds[srcKind(s)] += n;
// One chip per kind of source; the 30-odd individual plugins go in a menu so the row stays short.
const plugins = [...counts.entries()].filter(([s]) => srcKind(s) === "plugin").sort((a, b) => a[0].localeCompare(b[0]));
$("srcchips").innerHTML = `<span class="lbl">Source</span>`
+ [["all", "All", ALL.length, ""], ["k:builtin", "Built-in", kinds.builtin, "--s-builtin"], ["k:neovim", "Neovim default", kinds.neovim, "--s-neovim"],
["k:config", "Your config", kinds.config, "--s-config"], ["k:plugin", "Plugins", kinds.plugin, "--s-plugin"]]
.filter(([v, , n]) => v === "all" || n > 0)
.map(([v, l, n, c]) => `<button type="button" class="chip" data-v="${esc(v)}" aria-pressed="${v === F.src}">${c ? `<i style="--dot:var(${c})"></i>` : ""}${esc(l)}<span>${n}</span></button>`).join("")
+ (plugins.length ? `<select class="sel" id="srcsel" aria-label="Only one plugin"><option value="">One plugin…</option>${plugins.map(([s, n]) => `<option value="s:${esc(s)}">${esc(s)} (${n})</option>`).join("")}</select>` : "");
}
// Query parsing: "ctrl-w", "<c-w>", "^w", "C-w", "space f", "leader f" all become canonical keys.
const KEY_WORD = { space: "<Space>", spc: "<Space>", leader: LEADER_TOK, localleader: LOCAL_TOK, esc: "<Esc>", escape: "<Esc>",
enter: "<CR>", return: "<CR>", cr: "<CR>", bs: "<BS>", backspace: "<BS>", tab: "<Tab>" };
const MOD_RE = /^(ctrl|control|shift|alt|meta|cmd|super|opt|option|c|s|m|a|d)[-+](.+)$/i;
function partToTokens(p) {
if (p.includes("<")) return canonKeys(p);
const lw = p.toLowerCase();
if (KEY_WORD[lw]) return [KEY_WORD[lw]];
let m = p.match(/^\^(.)(.*)$/);
if (m) return [canonTok(`<C-${m[1]}>`), ...partToTokens(m[2] || "").filter(Boolean)];
const mods = [];
let rest = p;
while ((m = rest.match(MOD_RE))) { mods.push(MOD_ALIAS[m[1].toLowerCase()] || (/^opt/i.test(m[1]) ? "M" : "C")); rest = m[2]; }
if (mods.length) {
const named = NAMED[rest.toLowerCase()];
if (named) return [canonTok(`<${mods.join("-")}-${named}>`)];
return [canonTok(`<${mods.join("-")}-${rest[0]}>`), ...rest.slice(1).split("")];
}
return p.split("");
}
function parseQuery(raw) {
const q = raw.trim();
if (!q) return null;
const lower = q.toLowerCase();
const P = { raw: q, lower, ex: q.startsWith(":") };
P.words = (P.ex ? lower.slice(1) : lower).split(/\s+/).filter(Boolean);
if (P.ex) {
P.name = q.slice(1).trim().split(/\s+/)[0] || "";
P.nameLower = P.name.toLowerCase();
return P;
}
const parts = q.replace(/<leader>/gi, " leader ").replace(/<localleader>/gi, " localleader ").trim().split(/\s+/);
const toks = [];
for (let i = 0; i < parts.length; i++) {
let p = parts[i];
// "ctrl w", "shift tab": a lone modifier word applies to the next word.
if (/^(ctrl|control|shift|alt|meta|cmd|super)$/i.test(p) && i + 1 < parts.length) p = `${p}-${parts[++i]}`;
toks.push(...partToTokens(p));
}
P.toks = toks;
P.key = toks.join("");
P.keyLower = P.key.toLowerCase();
return P;
}
function score(x, P) {
if (P.ex) {
if (!x.ex) return 0;
let s = 0;
if (!P.name) s = 1;
else if (x.exAbbr === P.name || x.exFull === P.name) s = 1000;
else if (x.exFull.startsWith(P.name) && P.name.length >= x.exAbbr.length) s = 800;
else if (x.exFull.toLowerCase().startsWith(P.nameLower)) s = 500 - Math.min(x.exFull.length, 100);
if (!s && P.words.length && P.words.every((w) => x.hay.includes(w))) s = 100;
return s ? s + (x.kind === "cmd" ? 5 : 0) : 0;
}
let s = 0;
const k = P.key;
if (k && !x.ex) {
if (x.kb === k || x.kf === k) s = 1000;
else if (x.kh === k) s = 950;
else if (x.kbl === P.keyLower) s = 600;
else if (x.kb.startsWith(k)) s = 400 - Math.min(x.kb.length - k.length, 50) * 4;
else if (k.length > 1 && x.kbl.startsWith(P.keyLower)) s = 250;
}
// Words: short ones (1–2 chars) must be whole words so "d" doesn't match every description.
const okWords = P.words.every((w) => (w.length < 3 && /^[a-z0-9_]+$/.test(w) ? x.words.has(w) : x.hay.includes(w)));
if (okWords) {
let ds = 100;
if (x.dl.startsWith(P.lower)) ds += 60;
else if (x.dl.includes(P.lower)) ds += 30;
s = Math.max(s, ds);
}
if (!s) return 0;
// Global keys before ones that only work in a plugin window or filetype; Normal mode first.
return s + (x.e ? 15 : 0) + (x.kind === "live" ? 8 : 0) - (arr(x.ref.ov).length ? 5 : 0) - (x.ctx ? 60 : 0) + (x.m.includes("n") ? 3 : 0);
}
const modeHas = (x, m) => x.m.includes(m) || (x.m.includes("v") && (m === "x" || m === "s"));
function srcOK(x) {
if (F.src === "all") return true;
if (F.src.startsWith("k:")) return x.sk === F.src.slice(2);
return x.s === F.src.slice(2);
}
const byDefault = (a, b) => catRank(a.cat) - catRank(b.cat) || (b.e - a.e) || KIND_RANK[a.kind] - KIND_RANK[b.kind] || a.kf.localeCompare(b.kf);
function rowHTML(x) {
const flags = flagsHTML(x);
const struck = x.kind === "builtin" && arr(x.ref.ov).length && x.m.every((m) => arr(x.ref.ov).some((o) => o.m === m));
const rhs = x.kind === "live" && x.ref.rhs && !/^runs /.test(x.d) ? `<span class="fl">rhs <code>${esc(x.ref.rhs)}</code></span>` : "";
const extra = x.kind === "cmd" ? [x.ref.na && x.ref.na !== "0" ? `<span class="fl">args ${esc(x.ref.na)}</span>` : "", x.ref.r ? `<span class="fl">range</span>` : ""].join("") : "";
const fl = fileLine(x);
return `<article class="row${struck ? " dimmed" : ""}" style="--cat:${catVar(x.cat)}">
<div class="rk">${keysHTML(x)}</div>
<div class="rb">
<p class="rd">${esc(x.d || "(no description)")}</p>
<div class="rm">${modeBadges(x.m)}${srcBadge(x.s)}<span class="catb" style="--cat:${catVar(x.cat)}">${esc(x.cat)}</span>${x.e ? `<span class="badge" title="Essential">★ essential</span>` : ""}${x.ctx ? `<span class="ctx">${esc(x.ctx)}</span>` : ""}${fl ? `<span class="fl">${fl}</span>` : ""}${rhs}${extra}${helpHTML(x)}</div>
${flags ? `<div class="rflags">${flags}</div>` : ""}
${x.n ? `<div class="rn">${x.n}</div>` : ""}
</div></article>`;
}
/** Rows from..to, with a category heading wherever the category changes (browse view only). */
function rowsHTML(from, to) {
const heads = !shownQuery && F.cat === "All";
let out = "";
for (let i = from; i < Math.min(to, shown.length); i++) {
const x = shown[i];
if (heads && (i === 0 || shown[i - 1].cat !== x.cat)) {
out += `<h3 class="rcat" style="--cat:${catVar(x.cat)}">${esc(x.cat)}</h3>`;
}
out += rowHTML(x);
}
return out;
}
const SCOPE_HINT = {
starter: "The keys worth knowing plus everything your config adds or changes. Typing searches every key.",
ess: "Only the essentials.", chg: "Only built-ins your config replaces or delays, and maps that override them.", all: "",
};
function runFinder(keepLimit) {
const P = parseQuery($("q").value);
// Browsing shows the chosen scope; a typed search in the default scope looks through everything.
const scope = P && F.scope === "starter" ? "all" : F.scope;
const exOK = F.mode === ":" || (F.mode === "all" && P && P.ex);
const scored = [];
for (const x of ALL) {
if (x.ex ? !exOK : (F.mode === ":" || (F.mode !== "all" && !modeHas(x, F.mode)))) continue;
if (!srcOK(x)) continue;
if (scope === "starter" ? !inStarter(x) : scope === "ess" ? !x.e : scope === "chg" ? !x.changed : false) continue;
const s = P ? score(x, P) : 1;
if (s > 0) scored.push([s, x]);
}
// "ciw", "3dap", "gUiw": no entry has those keys, so explain them as operator + motion/text object
// and put those two entries first.
composed = P && !P.ex && !scored.some(([sc]) => sc >= 1000) ? decompose(P.toks) : null;
if (composed) {
const rest = scored.filter(([, x]) => x !== composed.op && x !== composed.mo);
scored.length = 0;
scored.push([5000, composed.op], [4999, composed.mo], ...rest);
}
// Category chips count what the other filters and the query leave.
const counts = new Map();
for (const [, x] of scored) counts.set(x.cat, (counts.get(x.cat) || 0) + 1);
const cats = [...counts.keys()];
if (F.cat !== "All" && !counts.has(F.cat)) cats.push(F.cat);
cats.sort((a, b) => catRank(a) - catRank(b));
$("catchips").innerHTML = `<span class="lbl">Category</span><button type="button" class="chip" data-v="All" aria-pressed="${F.cat === "All"}">All<span>${scored.length}</span></button>`
+ cats.map((c) => `<button type="button" class="chip" data-v="${esc(c)}" aria-pressed="${F.cat === c}"><i style="--dot:${catVar(c)}"></i>${esc(c)}<span>${counts.get(c) || 0}</span></button>`).join("");
scoredCount = scored.length;
const list = F.cat === "All" ? scored : scored.filter(([, x]) => x.cat === F.cat);
list.sort(P ? (a, b) => b[0] - a[0] || KIND_RANK[a[1].kind] - KIND_RANK[b[1].kind] || a[1].kf.length - b[1].kf.length || a[1].kf.localeCompare(b[1].kf) : (a, b) => byDefault(a[1], b[1]));
shown = list.map(([, x]) => x);
shownQuery = !!P;
if (!keepLimit) F.limit = PAGE;
$("count").textContent = `${shown.length.toLocaleString()} / ${ALL.length.toLocaleString()}`;
$("scopehint").textContent = P && F.scope === "starter" ? "Searching every key." : SCOPE_HINT[F.scope] || "";
renderRows();
}
function moreButton() {
const rest = shown.length - F.limit;
$("more").hidden = rest <= 0;
$("more").textContent = rest > 0 ? `Show ${Math.min(rest, PAGE)} more (${rest.toLocaleString()} left)` : "";
}
function renderRows() {
const P = parseQuery($("q").value);
const hint = P && !P.ex && F.mode !== ":" && !shown.length ? " Start with “:” to search Ex commands." : "";
const elsewhere = F.cat !== "All" && !shown.length ? scoredCount : 0;
const comp = composed ? `<p class="compose">${tokCaps([...composed.count.split("").filter(Boolean), ...composed.keys])} <span>=</span> ${keysHTML(composed.op, composed.op.core)} <span class="muted">${esc(composed.op.d.replace(/\s*\[into register x\]/, "").replace(/\{motion\}/, "…"))}</span> <span>+</span> ${keysHTML(composed.mo, composed.mo.core)} <span class="muted">${esc(composed.mo.d)}</span>${composed.count ? ` <span class="muted">· count ${esc(composed.count)}</span>` : ""} · <a href="#composer">composer</a></p>` : "";
$("results").innerHTML = comp + (shown.length ? rowsHTML(0, F.limit)
: `<p class="empty">Nothing matches${P ? ` “${esc(P.raw)}”` : ""}${F.cat !== "All" ? ` in ${esc(F.cat)}` : ""} with these filters.${elsewhere ? ` ${elsewhere} in other categories: pick <b>All</b> above.` : hint}</p>`);
moreButton();
}
$("more").addEventListener("click", () => {
const from = F.limit;
F.limit += PAGE;
$("results").insertAdjacentHTML("beforeend", rowsHTML(from, F.limit));
moreButton();
});
let qFrame = 0;
$("q").addEventListener("input", () => { cancelAnimationFrame(qFrame); qFrame = requestAnimationFrame(() => runFinder()); });
$("q").addEventListener("keydown", (e) => { if (e.key === "Escape") { $("q").value = ""; runFinder(); } });
function setChip(el, v) { for (const c of el.querySelectorAll(".chip")) c.setAttribute("aria-pressed", String(c.dataset.v === v)); }
function chipGroup(el, key, after) {
el.addEventListener("click", (e) => {
const b = e.target.closest(".chip");
if (!b) return;
F[key] = b.dataset.v;
setChip(el, F[key]);
if (after) after();
runFinder();
});
}
const srcSel = () => $("srcsel");
function syncSrcSel() { const s = srcSel(); if (!s) return; s.value = F.src.startsWith("s:") ? F.src : ""; s.classList.toggle("on", !!s.value); }
chipGroup($("modechips"), "mode");
chipGroup($("srcchips"), "src", syncSrcSel);
chipGroup($("catchips"), "cat");
if (srcSel()) srcSel().addEventListener("change", () => { F.src = srcSel().value || "all"; setChip($("srcchips"), F.src); syncSrcSel(); runFinder(); });
function setScope(v) {
F.scope = v;
for (const b of $("scope").children) b.setAttribute("aria-pressed", String(b.dataset.scope === v));
}
$("scope").addEventListener("click", (e) => { const b = e.target.closest("[data-scope]"); if (b) { setScope(b.dataset.scope); runFinder(); } });
$("reset").addEventListener("click", () => {
Object.assign(F, { mode: "all", src: "all", cat: "All" });
setScope("starter");
setChip($("modechips"), "all"); setChip($("srcchips"), "all"); syncSrcSel();
runFinder();
});
document.addEventListener("keydown", (e) => {
if (e.key !== "/" || e.ctrlKey || e.metaKey || e.altKey) return;
const a = document.activeElement;
if (a && (a.tagName === "INPUT" || a.tagName === "TEXTAREA" || a.isContentEditable)) return;
e.preventDefault();
$("q").focus();
$("q").select();
});
/** Keyboard → finder: search the key sequence in that mode. */
function sendToFinder(keys, mode) {
$("q").value = keys;
F.mode = MODE_CHIPS.some(([m]) => m === mode) ? mode : "all";
F.cat = "All";
setChip($("modechips"), F.mode);
runFinder();
toast(`Finder: ${keys} in ${modeNames([mode])} mode — ${shown.length} match${shown.length === 1 ? "" : "es"} below`);
}
runFinder();
// ---- Text-object composer --------------------------------------------------------------------------
{
const hasN = (keys) => BUILT.some((x) => x.kb === keys && x.m.includes("n") && /\{motion\}$/.test(x.kf));
const liveN = (keys) => LIVE.find((x) => x.kb === keys && x.m.includes("n") && !x.ctx);
const OPS = [
["d", "delete"], ["c", "change"], ["y", "yank"], [">", "indent"], ["<", "dedent"], ["=", "re-indent"], ["gu", "lowercase"],
["gU", "uppercase"], ["g~", "toggle the case of"], ["gq", "format"], ["gw", "format (cursor stays put)"], ["g?", "ROT13-encode"],
["!", "filter through a command"], ["zf", "create a fold over"], ["g@", "run 'operatorfunc' on"],
].filter(([k]) => hasN(k)).map(([k, v]) => ({ k, v, src: "builtin" }));
OPS.push({ k: "v", v: "select", src: "builtin" });
const gc = liveN("gc");
if (gc) OPS.push({ k: "gc", v: "toggle comments on", src: gc.s });
const sa = liveN("sa"), sd = liveN("sd"), sr = liveN("sr");
if (sa) OPS.push({ k: "sa", v: "surround", src: sa.s, sa: true });
// Other operators described by the curated data (cat "Operator", keys ending in {motion}).
for (const x of [...CUR, ...LIVE]) {
if (x.cat !== "Operator" || x.ctx || !/\{motion\}$/.test(x.kf) || OPS.some((o) => o.k === x.kb) || !x.kb) continue;
OPS.push({ k: x.kb, v: x.d.replace(/\s*\{motion\}.*$/i, "").replace(/^./, (c) => c.toLowerCase()), src: x.s });
}
if (sd) OPS.push({ k: "sd", v: "delete the surrounding", src: sd.s, sur: "d" });
if (sr) OPS.push({ k: "sr", v: "replace the surrounding", src: sr.s, sur: "r" });
// Config maps that change an operator (e.g. d → "dd): shown under the result.
const opNote = (k) => { const L = liveN(k); return L ? L : null; };
// Objects: built-in from index.txt, then mini.ai ones from the curated data.
const NOUN = { w: "word", W: "WORD", s: "sentence", p: "paragraph", "(": "( ) block", ")": "( ) block", b: "( ) block",
"[": "[ ] block", "]": "[ ] block", "{": "{ } block", "}": "{ } block", B: "{ } block", "<": "< > block", ">": "< > block",
t: "tag block", '"': "double-quoted string", "'": "single-quoted string", "`": "backtick string" };
const objs = new Map(); // id → { id, noun, src, desc }
for (const x of BUILT) {
if (x.cat !== "Text object" || x.ref.sec !== "Text objects" || x.tok.length !== 2 || !/^[ia]$/.test(x.tok[0])) continue;
const id = x.tok[1];
if (!objs.has(id)) objs.set(id, { id, noun: NOUN[id] || x.d, src: "builtin", ent: {} });
const o = objs.get(id);
if (!o.ent[x.tok[0]]) o.ent[x.tok[0]] = x;
}
// Curated objects (mini.ai, the config's own): only concrete ids that exist as both i… and a….
const curObj = CUR.filter((x) => x.cat === "Text object" && !x.ctx && x.tok.length >= 2 && /^[ia]$/.test(x.tok[0]) && !x.tok.some(isPh));
const sides = groupBy(curObj, (x) => x.tok.slice(1).join(""));
for (const [id, list] of sides) {
if (!list.some((x) => x.tok[0] === "i") || !list.some((x) => x.tok[0] === "a")) continue;
const inner = list.find((x) => x.tok[0] === "i");
const prev = objs.get(id);
const noun = MINI_AI_IDS[id] || inner.d.replace(/\([^)]*\)/g, "").replace(/^(inside|inner)\s+/i, "").replace(/^(the|a|an)\s+/i, "").split(/[,:;]/)[0].trim().replace(/^./, (c) => c.toLowerCase());
if (!prev || prev.src === "builtin") objs.set(id, { id, noun: noun || id, src: inner.s, ent: { i: inner, a: list.find((x) => x.tok[0] === "a") } });
}
// With mini.ai active it handles every id in its table (and any non-letter); letters it lacks fall back to Vim.
if (MINI_AI) for (const o of objs.values()) if (MINI_AI_IDS[o.id] && o.src === "builtin") { o.src = "mini.ai"; o.noun = MINI_AI_IDS[o.id]; }
const miniIds = new Set([...objs.values()].filter((o) => o.src !== "builtin").map((o) => o.id));
const ORDER = "wWsp()b[]{}B<>t\"'`qfa?";
const rank = (id) => { const i = ORDER.indexOf(id); return id.length === 1 && i >= 0 ? i : ORDER.length; };
const OBJ = [...objs.values()].sort((x, y) => rank(x.id) - rank(y.id) || x.id.localeCompare(y.id));
const short = (t) => (t.length > 22 ? t.slice(0, 21) + "…" : t);
const SUR = ["(", ")", "[", "]", "{", "}", "<", ">", '"', "'", "`", "b", "q", "t", "f", "?"];
const SUR_NOUN = { "(": "( ) with inner spaces", ")": "( )", "[": "[ ] with inner spaces", "]": "[ ]", "{": "{ } with inner spaces",
"}": "{ }", "<": "< > with inner spaces", ">": "< >", b: "brackets: the nearest ( ), [ ] or { }", q: "quotes: the nearest ' \" or `", t: "tag",
f: "function call", "?": "left/right pair (prompted)", '"': '" "', "'": "' '", "`": "` `" };
const SUR_ADD = { b: "( )", q: '" "', t: "a tag (asks for its name)", f: "a function call (asks for its name)", "?": "a left/right pair it asks for" };
const C = { op: OPS[0] ? OPS[0].k : "d", ai: "i", mod: "", id: OBJ.find((o) => o.id === "w") ? "w" : (OBJ[0] || {}).id, count: "", ch: ")" };
const chipsFor = (key, list, cls = "") => list.map(([v, label, small, extra]) => `<button type="button" class="chip ${cls} ${extra || ""}" data-k="${key}" data-v="${esc(v)}" aria-pressed="${String(C[key]) === String(v)}">${esc(label)}${small ? `<small>${esc(small)}</small>` : ""}</button>`).join("");
$("composerintro").innerHTML = `Operators × text objects. ${MINI_AI ? `In this config <b>mini.ai</b> takes over <kbd>i</kbd> and <kbd>a</kbd>: it handles brackets, quotes, tags, <code>f</code> (function call), <code>a</code> (argument) and more, adds <kbd>${esc(AI_NEXT)}</kbd>/<kbd>${esc(AI_LAST)}</kbd> for the next/last match, and falls back to Vim's own objects for the rest (<code>w</code>, <code>s</code>, <code>p</code>…).` : ""}`;
function render() {
const op = OPS.find((o) => o.k === C.op) || OPS[0];
if (!op) { $("comp").innerHTML = `<p class="muted">No operators found.</p>`; return; }
const isSur = !!op.sur;
const rows = [];
rows.push(`<div class="crow"><span class="lbl">Operator</span><div class="chips">${chipsFor("op", OPS.map((o) => [o.k, o.k, o.v.split(" (")[0], o.src !== "builtin" ? "mini" : ""]))}</div></div>`);
if (!isSur) rows.push(`<div class="crow"><span class="lbl">Scope</span><div class="chips">${chipsFor("ai", [["i", "i", "inside"], ["a", "a", "around"]])}</div></div>`);
// next/last only exist for mini.ai's own objects (AI_NEXT/AI_LAST) and for mini.surround's sd/sr
// (always n/l); for Vim's
// objects (w, s, p) mini.ai falls back to the built-in and the suffix would be typed as an object id.
const curObj = OBJ.find((x) => x.id === C.id);
const modOK = isSur || (MINI_AI && curObj && miniIds.has(curObj.id));
if (modOK) rows.push(`<div class="crow"><span class="lbl">Which one</span><div class="chips">${chipsFor("mod", [["", "nearest", "covering or next"], ["n", isSur ? "n" : AI_NEXT, "next"], ["l", isSur ? "l" : AI_LAST, "last (previous)"]])}</div></div>`);
if (isSur) rows.push(`<div class="crow"><span class="lbl">Surrounding</span><div class="chips">${chipsFor("id", SUR.map((s) => [s, s, ["b", "q", "t", "f", "?"].includes(s) ? short(SUR_NOUN[s]) : ""]), "mini")}</div></div>`);
else {
const bi = OBJ.filter((o) => !miniIds.has(o.id)), mi = OBJ.filter((o) => miniIds.has(o.id));
rows.push(`<div class="crow"><span class="lbl">Object</span><div class="stack" style="gap:8px">
${bi.length ? `<div class="chips"><span class="lbl">Built-in</span>${chipsFor("id", bi.map((o) => [o.id, o.id, short(o.noun)]))}</div>` : ""}
${mi.length ? `<div class="chips"><span class="lbl">${esc([...new Set(mi.map((o) => o.src))].join(" · "))}</span>${chipsFor("id", mi.map((o) => [o.id, o.id, short(o.noun)]), "mini")}</div>` : ""}</div></div>`);
rows.push(`<div class="crow"><label class="lbl" for="ccount">Count</label><div><input id="ccount" type="number" min="1" max="99" inputmode="numeric" value="${esc(C.count)}" placeholder="—" aria-label="Optional count"></div></div>`);
}
if (op.sa || op.sur === "r") rows.push(`<div class="crow"><span class="lbl">${op.sa ? "With" : "Replace with"}</span><div class="chips">${chipsFor("ch", SUR.map((s) => [s, s]), "mini")}</div></div>`);
// Result.
const mod = C.mod && modOK ? C.mod : "";
let keys, sentence, objSrc = "", objEnt = null;
if (isSur) {
if (!SUR.includes(C.id)) C.id = ")";
keys = [...canonKeys(op.k), ...(mod ? [mod] : []), C.id, ...(op.sur === "r" ? [C.ch] : [])];
const which = mod === "n" ? " <span class=\"muted\">(the next one after the cursor)</span>" : mod === "l" ? " <span class=\"muted\">(the previous one)</span>" : "";
sentence = op.sur === "d" ? `<b>delete</b> the surrounding ${esc(SUR_NOUN[C.id])}${which}`
: `<b>replace</b> the surrounding ${esc(SUR_NOUN[C.id])} with ${esc(SUR_ADD[C.ch] || SUR_NOUN[C.ch] || C.ch)}${which}`;
} else {
const o = OBJ.find((x) => x.id === C.id) || OBJ[0];
if (!o) { $("comp").innerHTML = rows.join("") + `<p class="muted">No text objects found.</p>`; return; }
C.id = o.id;
const cnt = /^[1-9]\d?$/.test(C.count) ? C.count : "";
const sfx = mod === "n" ? AI_NEXT : mod === "l" ? AI_LAST : "";
keys = [...canonKeys(op.k), ...(cnt ? cnt.split("") : []), C.ai, ...(sfx ? [sfx] : []), ...canonKeys(o.id), ...(op.sa ? [C.ch] : [])];
const which = mod === "n" ? "the next " : mod === "l" ? "the previous " : "";
const scope = C.ai === "i" ? "inside" : "around";
sentence = `<b>${esc(op.v)}</b> ${scope} ${which}${esc(o.noun)}${cnt ? ` <span class="muted">(count ${esc(cnt)})</span>` : ""}${op.sa ? ` with ${esc(SUR_ADD[C.ch] || SUR_NOUN[C.ch] || C.ch)}` : ""}`;
objSrc = o.src;
objEnt = o.ent[C.ai] || o.ent.i || o.ent.a || null;
}
const note = opNote(op.k);
const noteHTML = note && op.src === "builtin" ? `<p class="muted">Your config maps <kbd>${esc(op.k)}</kbd>: ${esc(note.d)}${note.ref.rhs ? ` (<code>${esc(note.ref.rhs)}</code>)` : ""} · ${fileLine(note)}</p>` : "";
rows.push(`<div class="cout" aria-live="polite">${tokCaps(keys)}<p class="sent">${sentence.replace(/^<b>(.)/, (m, c) => `<b>${c.toUpperCase()}`)}</p>
<div class="rm">${srcBadge(op.src)}<span class="muted">operator</span>${isSur ? "" : `${srcBadge(objSrc)}<span class="muted">text object</span>${objEnt ? `<span class="rf">${helpHTML(objEnt)}</span>` : ""}`}
<button type="button" class="copy" data-copy="${esc(keys.join(""))}">copy keys</button></div>${noteHTML}</div>`);
$("comp").innerHTML = rows.join("");
const cc = $("ccount");
if (cc) cc.addEventListener("input", () => { C.count = cc.value.trim(); render(); const again = $("ccount"); if (again) { again.focus(); const v = again.value; again.value = ""; again.value = v; } });
}
$("comp").addEventListener("click", (e) => {
const b = e.target.closest(".chip[data-k]");
if (!b) return;
const k = b.dataset.k;
C[k] = b.dataset.v;
if (k === "op") { const op = OPS.find((o) => o.k === C.op); if (op && op.sur && !SUR.includes(C.id)) C.id = ")"; if (op && !op.sur && !OBJ.some((o) => o.id === C.id)) C.id = "w"; }
render();
const again = $("comp").querySelector(`.chip[data-k="${k}"][data-v="${CSS.escape(C[k])}"]`);
if (again) again.focus();
});
render();
}
// ---- Inside plugin windows ---------------------------------------------------------------------------
// ~40 window contexts are folded into a few top-level groups; each group lists its windows as sections,
// with chips to show one, and one search box filters every window at once.
{
const norm = (s) => String(s || "").toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
const has = (s, ...w) => w.every((x) => s.includes(x));
const human = (a) => String(a || "").replace(/_/g, " ").replace(/^function$/, "custom function").trim();
const picker = obj(D.picker), blink = obj(D.blink), flash = obj(D.flash);
const explorer = arr(D.explorer);
// Top-level groups, in tab order. A window context goes to the first group whose test matches.
const WGROUPS = [
{ id: "picker", name: "Picker", src: "snacks", led: "var(--h6)", test: (c) => c.startsWith("snacks picker") },
{ id: "explorer", name: "Explorer", src: "snacks", led: "var(--h12)", test: (c) => has(c, "explorer") },
{ id: "complete", name: "Completion", src: "blink.cmp", led: "var(--h4)", test: (c) => has(c, "completion") || has(c, "blink") },
{ id: "jump", name: "Flash & Leap", src: "flash", led: "var(--h1)", test: (c) => has(c, "flash") || has(c, "leap") || /\bafter [ft]\b/.test(c) },
{ id: "git", name: "Git", src: "gitsigns", led: "var(--h11)", test: (c) => /\b(git|gitsigns|github|forgejo|pr)\b/.test(c) },
{ id: "notes", name: "Notes", src: "obsidian.nvim", led: "var(--h5)", test: (c) => /\b(obsidian|markdown|haunt)\b/.test(c) },
{ id: "term", name: "Terminal & AI", src: "sidekick", led: "var(--h9)", test: (c) => /\b(terminal|sidekick|kitty|scrollback|nes)\b/.test(c) },
{ id: "other", name: "Other", src: "config", led: "var(--h13)", test: () => true },
];
const groupOf = (ctx) => WGROUPS.find((g) => g.test(norm(ctx))) || WGROUPS[WGROUPS.length - 1];
// Items: { keys (HTML), desc, chain, modes, note (HTML), hay (search text) }.
const itemModes = (it) => (Array.isArray(it.mode) ? it.mode : it.mode ? [it.mode] : []);
const hayOf = (toks, ...rest) => [toks.join(""), toks.map(humanTok).join(" "), toks.map(glyphTok).join(" "), ...rest.map(stripTags)].join(" ").toLowerCase();
function dataItem(it, curMap) {
const toks = canonKeys(it.lhs);
const c = curMap.get(toks.join(""));
if (c) c.used = true;
const actions = arr(it.actions).length ? arr(it.actions) : [it.action];
const chain = actions.map(human).filter(Boolean).join(" → ");
const desc = (c && c.d) || it.desc || chain || "(action)";
const modes = itemModes(it).length ? itemModes(it) : c ? c.m : [];
return { keys: tokCaps(toks), desc, chain: chain !== desc ? chain : "", modes, note: (c && c.n) || "", hay: hayOf(toks, desc, chain, c ? c.n : "") };
}
const curItem = (x) => ({ keys: keysHTML(x), desc: x.d, chain: "", modes: x.m, note: x.n, hay: hayOf(x.tok, x.raw, x.d, x.n) });
const byLhs = (a, b) => String(a.lhs).toLowerCase().localeCompare(String(b.lhs).toLowerCase());
// Sections from the live data (picker, explorer, blink), with curated notes merged in by key.
const SECTIONS = [];
const sec = (s) => { s.items = s.items || []; SECTIONS.push(s); return s; };
const dataSecs = [];
if (arr(picker.input).length || arr(picker.list).length || arr(picker.preview).length) {
const lede = "Any Snacks picker (files, grep, buffers…). Your config adds <kbd>s</kbd> and <kbd>Alt</kbd><kbd>s</kbd> (flash) and <kbd>Alt</kbd><kbd>a</kbd> (send to Sidekick) in the input.";
dataSecs.push({ g: "picker", name: "Input box", src: "snacks", data: arr(picker.input), take: (c) => c === "snacks picker input" || c === "snacks picker", lede });
dataSecs.push({ g: "picker", name: "Result list", src: "snacks", data: arr(picker.list), take: (c) => c === "snacks picker list" });
dataSecs.push({ g: "picker", name: "Preview", src: "snacks", data: arr(picker.preview), take: (c) => c === "snacks picker preview" });
}
if (explorer.length) dataSecs.push({ g: "explorer", name: "Explorer list", src: "snacks", data: explorer, take: (c) => has(c, "explorer"),
lede: "The file explorer (<kbd>Space</kbd><kbd>e</kbd>): its list window, including the picker list keys it inherits." });
const blinkLede = "blink.cmp keys while completing. Each key tries its actions left to right; <i>fallback</i> runs whatever the key would do without blink.";
if (arr(blink.default).length) dataSecs.push({ g: "complete", name: "Insert mode", src: "blink.cmp", data: arr(blink.default), take: (c) => has(c, "completion") && has(c, "insert"), lede: blinkLede });
if (arr(blink.cmdline).length) dataSecs.push({ g: "complete", name: "Command line", src: "blink.cmp", data: arr(blink.cmdline), take: (c) => has(c, "completion") && has(c, "cmdline") });
if (arr(blink.term).length) dataSecs.push({ g: "complete", name: "Terminal", src: "blink.cmp", data: arr(blink.term), take: (c) => has(c, "completion") && has(c, "term") });
// Curated entries with a ctx: merged into a data section, or a section of their own.
const byCtx = groupBy(CUR.filter((x) => x.ctx), (x) => x.ctx);
const ctxSecs = new Map();
for (const [ctx, list] of byCtx) {
const c = norm(ctx);
const ds = dataSecs.find((d) => d.take(c));
if (ds) { (ds.cur || (ds.cur = [])).push(...list); continue; }
ctxSecs.set(ctx, list);
}
for (const d of dataSecs) {
const curMap = new Map((d.cur || []).map((x) => [x.kb || x.kf, x]));
const items = d.data.slice().sort(byLhs).map((it) => dataItem(it, curMap));
items.push(...(d.cur || []).filter((x) => !x.used).map(curItem));
for (const x of d.cur || []) delete x.used;
sec({ g: d.g, name: d.name, src: d.src, lede: d.lede, items });
}
// Flash's enhanced f/t (from the flash config): a section with its own explanation.
if (arr(flash.char_keys).length) {
const keys = arr(flash.char_keys);
const fl = (k) => LIVE.find((x) => x.s === "flash" && x.kb === k && !x.ctx);
sec({ g: "jump", name: "Flash f / t", src: "flash",
lede: `Flash replaces the built-in character motions. ${flash.multi_line === false ? "<b>Current line only</b> (<code>multi_line = false</code>), like stock Vim." : "Searches across lines."}
${flash.jump_labels ? "Shows jump labels." : "No jump labels:"} after <kbd>f</kbd>/<kbd>t</kbd>, press the same key again for the next match and its capital (<kbd>F</kbd>/<kbd>T</kbd>) for the previous one; <kbd>;</kbd> and <kbd>,</kbd> also work.`,
items: keys.map((k) => {
const x = fl(k), b = BUILT.find((y) => y.kb === k && y.m.includes("n"));
const desc = x && !UNHELPFUL.test(x.d) ? x.d : b ? b.d : "";
return { keys: tokCaps(canonKeys(k)), desc, chain: x ? stripTags(fileLine(x)) : "", modes: x ? x.m : [], note: "", hay: hayOf(canonKeys(k), desc, "flash") };
}) });
}
for (const [ctx, list] of [...ctxSecs].sort((a, b) => b[1].length - a[1].length || a[0].localeCompare(b[0]))) {
const g = groupOf(ctx);
// Inside the Picker group "Snacks picker · git_log" reads better as "git_log".
const name = g.id === "picker" ? ctx.replace(/^Snacks picker\s*·\s*/i, "") : ctx;
sec({ g: g.id, name, src: list[0].s, items: list.map(curItem) });
}
SECTIONS.forEach((s, i) => { s.id = `w-${i}`; s.hayName = norm(s.name); });
const GROUPS_W = WGROUPS.map((g) => ({ ...g, secs: SECTIONS.filter((s) => s.g === g.id) })).filter((g) => g.secs.length);
// Big groups (the picker has ~150 keys over 30 windows) open on their first window, small ones show all.
const firstSub = (g) => (g && g.secs.length > 1 && g.secs.reduce((k, s) => k + s.items.length, 0) > 60 ? g.secs[0].id : "all");
const W = { g: 0, sub: firstSub(GROUPS_W[0]), q: "" };
const itemHTML = (it) => `<div class="witem">${it.keys}<div class="act"><span>${esc(it.desc)}${it.modes.length ? `<span class="ms">${modeBadges(it.modes)}</span>` : ""}</span>
${it.chain ? `<span class="chain">${esc(it.chain)}</span>` : ""}${it.note ? `<span class="rn">${it.note}</span>` : ""}</div></div>`;
const secHTML = (s, items, showGroup) => `<div class="wgroup" id="${s.id}"><h3>${esc(s.name)} ${srcBadge(s.src)}${showGroup ? `<span class="ctx">${esc(WGROUPS.find((g) => g.id === s.g).name)}</span>` : ""} <span class="count">${items.length}</span></h3>
${s.lede && !W.q ? `<p class="lede">${s.lede}</p>` : ""}<div class="wlist">${items.map(itemHTML).join("")}</div></div>`;
function matches(s) {
if (!W.q) return s.items;
const words = W.q.split(/\s+/).filter(Boolean);
const nameHit = words.every((w) => s.hayName.includes(w));
return nameHit ? s.items : s.items.filter((it) => words.every((w) => it.hay.includes(w)));
}
function draw() {
if (!GROUPS_W.length) { $("wpanel").innerHTML = `<p class="muted">No plugin window keys in the data.</p>`; return; }
const total = SECTIONS.reduce((n, s) => n + s.items.length, 0);
if (W.q) {
// Search: every group, only the matching keys; tabs show how many each group has.
const hits = SECTIONS.map((s) => [s, matches(s)]).filter(([, it]) => it.length);
const n = hits.reduce((k, [, it]) => k + it.length, 0);
for (const t of $("wtabs").children) {
const g = GROUPS_W[+t.dataset.i];
t.querySelector("span").textContent = hits.filter(([s]) => s.g === g.id).reduce((k, [, it]) => k + it.length, 0);
t.setAttribute("aria-selected", "false");
}
$("wsubs").innerHTML = "";
$("wcount").textContent = `${n} / ${total}`;
$("wpanel").removeAttribute("aria-labelledby");
$("wpanel").innerHTML = hits.length ? hits.map(([s, it]) => secHTML(s, it, true)).join("") : `<p class="empty">No key in a plugin window matches “${esc(W.q)}”.</p>`;
return;
}
const g = GROUPS_W[W.g];
for (const t of $("wtabs").children) {
const tg = GROUPS_W[+t.dataset.i];
t.querySelector("span").textContent = tg.secs.reduce((k, s) => k + s.items.length, 0);
t.setAttribute("aria-selected", String(+t.dataset.i === W.g));
}
$("wcount").textContent = `${total} keys`;
$("wsubs").innerHTML = g.secs.length > 1 ? `<button type="button" class="chip" data-v="all" aria-pressed="${W.sub === "all"}">All<span>${g.secs.reduce((k, s) => k + s.items.length, 0)}</span></button>`
+ g.secs.map((s) => `<button type="button" class="chip" data-v="${s.id}" aria-pressed="${W.sub === s.id}">${esc(s.name)}<span>${s.items.length}</span></button>`).join("") : "";
$("wpanel").setAttribute("aria-labelledby", `wtab-${g.id}`);
$("wpanel").innerHTML = g.secs.filter((s) => W.sub === "all" || s.id === W.sub).map((s) => secHTML(s, s.items, false)).join("");
}
$("wtabs").innerHTML = GROUPS_W.map((g, i) => `<button type="button" class="tab" role="tab" id="wtab-${g.id}" style="--led:${g.led}" aria-selected="${i === W.g}" aria-controls="wpanel" data-i="${i}"><i></i>${esc(g.name)} <span></span></button>`).join("");
const pick = (i) => { W.g = i; W.sub = firstSub(GROUPS_W[i]); if (W.q) { W.q = ""; $("wq").value = ""; } draw(); };
$("wtabs").addEventListener("click", (e) => { const b = e.target.closest(".tab"); if (b) pick(+b.dataset.i); });
tabArrows($("wtabs"), (t) => pick(+t.dataset.i));
$("wsubs").addEventListener("click", (e) => { const b = e.target.closest(".chip"); if (b) { W.sub = b.dataset.v; draw(); } });
let wFrame = 0;
$("wq").addEventListener("input", () => { cancelAnimationFrame(wFrame); wFrame = requestAnimationFrame(() => { W.q = $("wq").value.trim().toLowerCase(); draw(); }); });
$("wq").addEventListener("keydown", (e) => { if (e.key === "Escape") { $("wq").value = ""; W.q = ""; draw(); } });
draw();
}
// ---- Commands -----------------------------------------------------------------------------------------
{
let csrc = "all";
const counts = new Map();
for (const x of CMDS) counts.set(x.s, (counts.get(x.s) || 0) + 1);
const srcs = [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
$("cchips").innerHTML = `<button type="button" class="chip" data-v="all" aria-pressed="true">All<span>${CMDS.length}</span></button>`
+ srcs.map(([s, n]) => `<button type="button" class="chip" data-v="${esc(s)}" aria-pressed="false"><i style="--dot:var(--s-${srcKind(s)})"></i>${esc(srcLabel(s))}<span>${n}</span></button>`).join("");
function draw() {
const q = $("cq").value.trim().toLowerCase().replace(/^:/, "");
const words = q.split(/\s+/).filter(Boolean);
const list = CMDS.filter((x) => (csrc === "all" || x.s === csrc) && words.every((w) => x.hay.includes(w)))
.sort((a, b) => (q ? (b.exFull.toLowerCase().startsWith(q) - a.exFull.toLowerCase().startsWith(q)) : 0) || a.exFull.localeCompare(b.exFull));
$("ccount").textContent = `${list.length} / ${CMDS.length}`;
$("clist").innerHTML = list.length ? list.map((x) => `<div class="crow2"><div class="cn">${esc(x.raw)}</div><div>${esc(x.d || "(no description)")}
<div class="meta">${srcBadge(x.s)}${x.ctx ? `<span class="ctx">${esc(x.ctx)} buffers</span>` : ""}${x.ref.na && x.ref.na !== "0" ? `<span>args ${esc(x.ref.na)}</span>` : ""}${x.ref.r ? "<span>range</span>" : ""}${fileLine(x)}</div></div></div>`).join("")
: `<p class="empty">No command matches.</p>`;
}
$("cq").addEventListener("input", draw);
$("cq").addEventListener("keydown", (e) => { if (e.key === "Escape") { $("cq").value = ""; draw(); } });
$("cchips").addEventListener("click", (e) => {
const b = e.target.closest(".chip");
if (!b) return;
csrc = b.dataset.v;
for (const c of $("cchips").children) c.setAttribute("aria-pressed", String(c === b));
draw();
});
draw();
}
drawKB();
</script>
</body>
</html>