2076 lines
611 KiB
HTML
2076 lines
611 KiB
HTML
<!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; }
|
||
.kbctl { display: flex; flex-wrap: wrap; gap: 8px 12px; justify-self: start; }
|
||
.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; }
|
||
/* Keyboard colourways: the keyboard has its own dark/light switch, independent of the page theme.
|
||
Dark is shared; light is a cool white-and-grey office board (standard) or the eggshell-white Q5 Max (as in the QMK sheet). */
|
||
.board[data-kb="dark"] {
|
||
--ink: #e6e9ed; --muted: #8e97a2; --line: #2a3038; --panel: #191d22;
|
||
--cap: #252b32; --cap-edge: #0a0c0f; --accent: #4f9bff; --accent-ink: #0b1220;
|
||
--case: linear-gradient(170deg, #22272e, #15191e); --plate: #0e1114;
|
||
--warn: #f0b35c; --warn-bg: #33270f; --danger: #ff6b6b; --danger-bg: #3a1a1c; --ok: #7ccc6c; --ok-bg: #18301a;
|
||
--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;
|
||
}
|
||
.board[data-kb="light"][data-board="standard"] {
|
||
--ink: #1c2128; --muted: #5b6570; --line: #c3cad3; --panel: #f5f6f8;
|
||
--cap: #fafbfc; --cap-edge: #aab2bc; --accent: #0a66e8; --accent-ink: #ffffff;
|
||
--case: linear-gradient(170deg, #e4e8ed, #c4cbd4); --plate: #b9c1cb;
|
||
--warn: #a35a00; --warn-bg: #fdf0dc; --danger: #c62828; --danger-bg: #fde4e4; --ok: #2f7d32; --ok-bg: #e2f3e3;
|
||
--s-builtin: #6b7480; --s-neovim: #0f8a7e; --s-config: #d6336c; --s-plugin: #6a48d7;
|
||
--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;
|
||
}
|
||
.board[data-kb="light"][data-board="q5"] {
|
||
--ink: #34383a; --muted: #6a6e68; --line: #cfcdc3; --panel: #f5f6f8;
|
||
--cap: #f1f0ea; --cap-edge: #c9c7bd; --accent: #0a66e8; --accent-ink: #ffffff;
|
||
--case: linear-gradient(170deg, #f4f4f1, #d8d9d5); --plate: #e4e5e3;
|
||
--warn: #a35a00; --warn-bg: #fdf0dc; --danger: #c62828; --danger-bg: #fde4e4; --ok: #2f7d32; --ok-bg: #e2f3e3;
|
||
--s-builtin: #6b7480; --s-neovim: #0f8a7e; --s-config: #d6336c; --s-plugin: #6a48d7;
|
||
--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;
|
||
}
|
||
.board[data-kb="light"] .case { box-shadow: inset 0 1px 0 #fff, 0 12px 30px -16px rgba(0,0,0,.45); }
|
||
.board[data-kb="light"] .kb { box-shadow: inset 0 1px 3px rgba(0,0,0,.12); }
|
||
.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 & 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="kbctl">
|
||
<div class="seg" id="kblayout" role="group" aria-label="Keyboard layout"></div>
|
||
<div class="seg" id="kbtheme" role="group" aria-label="Keyboard colourway">
|
||
<button type="button" data-kbt="dark" aria-pressed="true">Dark</button>
|
||
<button type="button" data-kbt="light" aria-pressed="false">Light</button>
|
||
</div>
|
||
</div>
|
||
<div class="legend" id="kblegend"></div>
|
||
<div class="board" id="board" data-kb="dark" data-board="standard"><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><C-w></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-05","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":{"autowrite":true,"smartcase":false,"ignorecase":false,"shiftwidth":2,"clipboard":"unnamedplus","relativenumber":true,"undofile":true,"wrap":true,"timeoutlen":1000},"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><Esc><\/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><Tab><\/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><C-n><\/kbd>/<kbd><C-p><\/kbd> open blink's menu instead (first / last item selected). <kbd><C-x><C-n><\/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><C-o>zz<\/kbd>, <kbd><C-o>$<\/kbd>, <kbd><C-o>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><C-r>+<\/kbd> clipboard, <kbd><C-r>\"<\/kbd> unnamed, <kbd><C-r>=<\/kbd> expression (e.g. <code>=5*7<\/code>), <kbd><C-r>/<\/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<C-a><\/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><Tab><\/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><Tab><\/kbd> (Sidekick NES, no fallback) and <kbd><C-i><\/kbd> is not mapped separately, so per <code>:h CTRL-I<\/code> the <kbd><Tab><\/kbd> map also catches <kbd><C-i><\/kbd>, even in kitty or Neovide; use <kbd><leader>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! <C-L><\/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><Plug>(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><C-]><\/kbd> goes to the LSP definition and <kbd><C-t><\/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>&<\/code> → <code>:&&<CR><\/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>\\<word\\><\/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;<Esc><\/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<Esc><\/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>< ><\/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><CR><\/kbd> in Normal mode starts Leap here; press <kbd>i<\/kbd> then <kbd><CR><\/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><Nop><\/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<<\/code> leaves out inner edge whitespace, <code>i><\/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<<\/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><C-w>c<\/kbd> rather than <kbd><C-w><C-c><\/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><C-w>d<\/kbd> / <kbd><C-w><C-d><\/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><C-w><C-w><\/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<C-]><\/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><Esc><\/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<C-a><\/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<<\/code> leaves out inner edge whitespace, <code>i><\/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<<\/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><CR><\/kbd> in Normal mode starts Leap, so press <kbd>i<\/kbd> then <kbd><CR><\/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><Tab><\/kbd> opens its menu and inserts the first match (accepts a lone match), then cycles; <kbd><C-n><\/kbd>/<kbd><C-p><\/kbd> move, <kbd><C-y><\/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/<C-r><C-w>/<\/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><leader>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>&<\/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><C-D><\/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><C-i><\/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><Plug>(leap)<\/code>, lua/keymaps.lua. Bidirectional in the current window, closest targets first; inclusive with operators (<code>d<CR>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><C-L><\/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 <cword><\/code> on the command line with a live preview: edit the name, then <kbd><CR><\/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><Tab><\/kbd>/<kbd><C-I><\/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><CR><\/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><CR><\/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><leader>/<\/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 & 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><Plug>(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<C-]><\/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><Nop><\/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><Tab><\/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><C-_><\/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><C-\\><\/kbd> goes to the job. Snacks terminals also accept a quick double <kbd><Esc><\/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><C-n><\/kbd> and <kbd><C-o><\/kbd> after <kbd><C-\\><\/kbd> are handled by Neovim; <kbd><C-\\><C-\\><\/kbd> sends one <kbd><C-\\><\/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><Esc><\/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><C-/><\/kbd> toggles it back; <kbd>2<C-/><\/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><C-\\><C-n>\"+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><C-r><\/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><CR><\/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><CR><\/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><CR><\/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><C-v>jj$AX<Esc><\/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><C-x><C-n><\/kbd>, <kbd><C-x><C-p><\/kbd>, <kbd><C-x><C-l><\/kbd> (lines) and <kbd><C-x><C-f><\/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><leader>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><a><a></a></a><\/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><<\/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>><\/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><C-w><\/code> to <code><C-S-w><\/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 <sha><\/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 <sha> -- <file><\/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><leader>/<\/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>[ ] [~] [!] [>] [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 <sub><\/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 <cword><\/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 <Plug> 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>[\"<C-k>\"] = 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>><\/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><C-r><\/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><Space><\/kbd>","<code><leader><\/code>: 80+ Normal-mode maps and a few Visual ones, grouped as listed in the which-key popup"],["<kbd>\\<\/kbd>","<code><localleader><\/code> (plugin buffer keys such as Grug-far's)"],["<kbd><Space><\/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><Down><\/kbd> <kbd><Up><\/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><Down><\/kbd> <kbd><Up><\/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><CR><\/code> map wins because those windows have no buffer-local <code><CR><\/code> map.","rows":[["Quickfix / location list <kbd><CR><\/kbd>","Starts a Leap instead of opening the entry under the cursor"],["Command-line window <kbd>q:<\/kbd> <kbd>q/<\/kbd> <kbd><CR><\/kbd>","Starts a Leap instead of running the line"],["Instead","<code>:.cc<\/code> / <code>:.ll<\/code>, <kbd><C-W><CR><\/kbd> (opens the entry in a split), or <kbd>i<\/kbd> then <kbd><CR><\/kbd> in <kbd>q:<\/kbd>"],["Fix","Map <kbd><CR><\/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><leader>ss<\/kbd> <kbd><leader>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><leader>ca<\/kbd> <kbd><leader>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><Tab><\/kbd>","Jump to the next-edit suggestion, press again to apply it; with none, a plain jump forward"],["Insert <kbd><Tab><\/kbd>","In order: next snippet placeholder, Sidekick NES jump/apply, accept the Copilot ghost text, else a normal Tab"],["<kbd><C-I><\/kbd>","Mapped to itself, so where the terminal tells it apart from <kbd><Tab><\/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><C-]><\/kbd>… write first"],["Undo","Persistent ('undofile'): <kbd>u<\/kbd>, <kbd><leader>uu<\/kbd> undotree, <kbd><leader>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><leader>cf<\/kbd>","Format the buffer; in Visual mode only the selected lines"],["<code>:Format<\/code> <code>:'<,'>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><leader>ff<\/kbd>, <kbd><leader>/<\/kbd>, <kbd><leader>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><C-/><\/kbd>","Toggle a floating terminal (Normal and Terminal mode; <kbd><C-_><\/kbd> in legacy terminals)"],["<kbd><C-\\><C-N><\/kbd>","Terminal mode to Normal mode (built-in)"],["<kbd><leader>gg<\/kbd>","Lazygit in a floating terminal"],["<kbd><leader>.<\/kbd> <kbd><leader>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><A-s><\/kbd>","The same from Insert mode"],["<kbd><A-a><\/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><leader>qs<\/kbd> <kbd><leader>ql<\/kbd> <kbd><leader>qS<\/kbd>","Restore the session for this directory + git branch, the last one, or pick one"],["<kbd><leader>qd<\/kbd>","Do not save this session on exit (saved automatically otherwise)"],["<kbd><leader>ha<\/kbd>","Bookmark the line with a note (virtual text), <kbd><leader>ht<\/kbd> shows/hides it"],["<kbd><leader>hn<\/kbd> <kbd><leader>hp<\/kbd> <kbd><leader>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><C-S-v><\/kbd>","Paste the clipboard in every mode (Normal: an empty line is replaced)"],["<kbd><C-S-c><\/kbd>","Copy the selection, or the current line in Normal mode"],["<kbd><C-S-x><\/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>( [ { <<\/code> padded, <code>) ] } ><\/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":[{"lhs":"q","action":"cancel"},{"mode":["i","n"],"lhs":"<C-Down>","action":"history_forward"},{"mode":["i","n"],"lhs":"<M-w>","action":"cycle_win"},{"mode":["i","n"],"lhs":"<C-Up>","action":"history_back"},{"mode":["i","n"],"lhs":"<C-B>","action":"preview_scroll_up"},{"mode":["i","n"],"lhs":"<C-D>","action":"list_scroll_down"},{"lhs":"G","action":"list_bottom"},{"mode":["n","i"],"lhs":"<S-CR>","action":"function"},{"lhs":"gg","action":"list_top"},{"mode":["i","n"],"lhs":"<C-S>","action":"edit_split"},{"lhs":"s","action":"flash"},{"mode":["i","n"],"lhs":"<S-Tab>","action":"select_and_prev"},{"mode":["i","n"],"lhs":"<Tab>","action":"select_and_next"},{"desc":"delete word","mode":["i"],"lhs":"<C-W>","action":"<c-s-w>"},{"mode":["i","n"],"lhs":"<C-F>","action":"preview_scroll_down"},{"lhs":"<C-W>K","action":"layout_top"},{"mode":["i","n"],"lhs":"<C-G>","action":"toggle_live"},{"mode":"i","lhs":"<C-R>#","action":"insert_alt"},{"lhs":"k","action":"list_up"},{"lhs":"<C-W>J","action":"layout_bottom"},{"mode":["n","i"],"lhs":"<C-T>","action":"tab"},{"mode":"i","lhs":"<C-R>%","action":"insert_filename"},{"mode":["n","i"],"lhs":"<C-A>","action":"select_all"},{"mode":["i","n"],"lhs":"<C-J>","action":"list_down"},{"lhs":"?","action":"toggle_help_input"},{"mode":"i","lhs":"<C-R><C-A>","action":"insert_cWORD"},{"mode":"i","lhs":"<C-R><C-F>","action":"insert_file"},{"mode":["i","n"],"lhs":"<C-V>","action":"edit_vsplit"},{"mode":"i","lhs":"<C-C>","action":"cancel"},{"lhs":"/","action":"toggle_focus"},{"mode":["i","n"],"lhs":"<C-U>","action":"list_scroll_up"},{"mode":["i","n"],"lhs":"<C-Q>","action":"qflist"},{"mode":"i","lhs":"<C-R><C-L>","action":"insert_line"},{"mode":"i","lhs":"<C-R><C-P>","action":"insert_file_full"},{"mode":["i","n"],"lhs":"<C-N>","action":"list_down"},{"mode":["i","n"],"lhs":"<M-p>","action":"toggle_preview"},{"mode":"i","lhs":"<C-R><C-W>","action":"insert_cword"},{"lhs":"<C-W>L","action":"layout_right"},{"lhs":"j","action":"list_down"},{"lhs":"<Esc>","action":"cancel"},{"mode":["i","n"],"lhs":"<C-K>","action":"list_up"},{"mode":["i","n"],"lhs":"<C-P>","action":"list_up"},{"mode":["n","i"],"lhs":"<M-d>","action":"inspect"},{"lhs":"<C-W>H","action":"layout_left"},{"mode":["i","n"],"lhs":"<Down>","action":"list_down"},{"mode":["i","n"],"lhs":"<M-f>","action":"toggle_follow"},{"mode":["n","i"],"lhs":"<CR>","action":"confirm"},{"mode":["i","n"],"lhs":"<M-h>","action":"toggle_hidden"},{"mode":["i","n"],"lhs":"<Up>","action":"list_up"},{"mode":["i","n"],"lhs":"<M-i>","action":"toggle_ignored"},{"mode":["n","i"],"lhs":"<M-s>","action":"flash"},{"mode":["i","n"],"lhs":"<M-r>","action":"toggle_regex"},{"mode":["n","i"],"lhs":"<M-a>","action":"sidekick_send"},{"mode":["i","n"],"lhs":"<M-m>","action":"toggle_maximize"}],"list":[{"lhs":"q","action":"cancel"},{"lhs":"<M-w>","action":"cycle_win"},{"lhs":"<C-B>","action":"preview_scroll_up"},{"lhs":"<C-D>","action":"list_scroll_down"},{"lhs":"<C-K>","action":"list_up"},{"lhs":"<S-CR>","action":"function"},{"lhs":"<C-Q>","action":"qflist"},{"lhs":"<C-S>","action":"edit_split"},{"lhs":"<2-LeftMouse>","action":"confirm"},{"mode":["n","x"],"lhs":"<S-Tab>","action":"select_and_prev"},{"lhs":"<C-U>","action":"list_scroll_up"},{"lhs":"zb","action":"list_scroll_bottom"},{"lhs":"<C-W>L","action":"layout_right"},{"lhs":"zt","action":"list_scroll_top"},{"lhs":"<C-F>","action":"preview_scroll_down"},{"lhs":"<C-W>K","action":"layout_top"},{"lhs":"<C-G>","action":"print_path"},{"lhs":"<Down>","action":"list_down"},{"lhs":"k","action":"list_up"},{"lhs":"<C-W>J","action":"layout_bottom"},{"lhs":"<C-T>","action":"tab"},{"lhs":"<C-A>","action":"select_all"},{"lhs":"<CR>","action":"confirm"},{"lhs":"?","action":"toggle_help_list"},{"lhs":"/","action":"toggle_focus"},{"lhs":"<C-N>","action":"list_down"},{"lhs":"<M-p>","action":"toggle_preview"},{"mode":["n","x"],"lhs":"<Tab>","action":"select_and_next"},{"lhs":"<C-V>","action":"edit_vsplit"},{"lhs":"<Esc>","action":"cancel"},{"lhs":"i","action":"focus_input"},{"lhs":"<C-P>","action":"list_up"},{"lhs":"zz","action":"list_scroll_center"},{"lhs":"<C-W>H","action":"layout_left"},{"lhs":"gg","action":"list_top"},{"lhs":"<M-f>","action":"toggle_follow"},{"lhs":"<M-d>","action":"inspect"},{"lhs":"<M-h>","action":"toggle_hidden"},{"lhs":"G","action":"list_bottom"},{"lhs":"<M-i>","action":"toggle_ignored"},{"lhs":"<Up>","action":"list_up"},{"lhs":"<C-J>","action":"list_down"},{"lhs":"j","action":"list_down"},{"lhs":"<M-m>","action":"toggle_maximize"}],"preview":[{"lhs":"q","action":"cancel"},{"lhs":"<Esc>","action":"cancel"},{"lhs":"<M-w>","action":"cycle_win"},{"lhs":"i","action":"focus_input"}]},"explorer":[{"lhs":"<M-w>","action":"cycle_win"},{"lhs":"<C-B>","action":"preview_scroll_up"},{"lhs":"<C-D>","action":"list_scroll_down"},{"lhs":"<C-K>","action":"list_up"},{"lhs":"<S-CR>","action":"function"},{"lhs":"<C-Q>","action":"qflist"},{"lhs":"<C-S>","action":"edit_split"},{"lhs":"<C-U>","action":"list_scroll_up"},{"lhs":"d","action":"explorer_del"},{"lhs":"<C-W>L","action":"layout_right"},{"lhs":"<C-F>","action":"preview_scroll_down"},{"lhs":"<C-W>K","action":"layout_top"},{"lhs":"<C-G>","action":"print_path"},{"lhs":"<Down>","action":"list_down"},{"lhs":"<Up>","action":"list_up"},{"lhs":"<C-W>J","action":"layout_bottom"},{"lhs":"<C-T>","action":"terminal"},{"lhs":"<C-A>","action":"select_all"},{"lhs":"<CR>","action":"confirm"},{"lhs":"?","action":"toggle_help_list"},{"lhs":"<Space>/","action":"picker_grep"},{"lhs":"<C-C>","action":"tcd"},{"lhs":"/","action":"toggle_focus"},{"lhs":"<BS>","action":"explorer_up"},{"lhs":"<M-p>","action":"toggle_preview"},{"lhs":"zz","action":"list_scroll_center"},{"lhs":"<C-W>H","action":"layout_left"},{"lhs":"I","action":"toggle_ignored"},{"lhs":"H","action":"toggle_hidden"},{"lhs":"Z","action":"explorer_close_all"},{"lhs":"q","action":"cancel"},{"lhs":"]g","action":"explorer_git_next"},{"lhs":"[g","action":"explorer_git_prev"},{"lhs":"]d","action":"explorer_diagnostic_next"},{"lhs":"[d","action":"explorer_diagnostic_prev"},{"lhs":"G","action":"list_bottom"},{"lhs":"]w","action":"explorer_warn_next"},{"lhs":"a","action":"explorer_add"},{"lhs":"[w","action":"explorer_warn_prev"},{"lhs":"<2-LeftMouse>","action":"confirm"},{"mode":["n","x"],"lhs":"<S-Tab>","action":"select_and_prev"},{"lhs":"[e","action":"explorer_error_prev"},{"lhs":"zb","action":"list_scroll_bottom"},{"lhs":"zt","action":"list_scroll_top"},{"lhs":"u","action":"explorer_update"},{"lhs":"k","action":"list_up"},{"lhs":"<Esc>","action":"cancel"},{"lhs":"r","action":"explorer_rename"},{"lhs":"m","action":"explorer_move"},{"lhs":"o","action":"explorer_open"},{"mode":["n","x"],"lhs":"<Tab>","action":"select_and_next"},{"mode":["n","x"],"lhs":"y","action":"explorer_yank"},{"lhs":"P","action":"toggle_preview"},{"lhs":"<C-J>","action":"list_down"},{"lhs":"]e","action":"explorer_error_next"},{"lhs":"p","action":"explorer_paste"},{"lhs":"<M-d>","action":"inspect"},{"lhs":"<M-f>","action":"toggle_follow"},{"lhs":"<C-P>","action":"list_up"},{"lhs":"i","action":"focus_input"},{"lhs":"l","action":"confirm"},{"lhs":"gg","action":"list_top"},{"lhs":".","action":"explorer_focus"},{"lhs":"<C-V>","action":"edit_vsplit"},{"lhs":"<M-h>","action":"toggle_hidden"},{"lhs":"<C-N>","action":"list_down"},{"lhs":"<M-i>","action":"toggle_ignored"},{"lhs":"j","action":"list_down"},{"lhs":"c","action":"explorer_copy"},{"lhs":"h","action":"explorer_close"},{"lhs":"<M-m>","action":"toggle_maximize"}],"blink":{"cmdline":[{"lhs":"<c-y>","actions":["select_and_accept","fallback"]},{"lhs":"<c-e>","actions":["cancel","fallback"]},{"lhs":"<right>","actions":["select_next","fallback"]},{"lhs":"<s-tab>","actions":["function","select_prev"]},{"lhs":"<end>","actions":["hide","fallback"]},{"lhs":"<c-n>","actions":["select_next","fallback"]},{"lhs":"<c-p>","actions":["select_prev","fallback"]},{"lhs":"<left>","actions":["select_prev","fallback"]},{"lhs":"<tab>","actions":["show_and_insert_or_accept_single","select_next"]},{"lhs":"<c-space>","actions":["show","fallback"]}],"term":[{"lhs":"<c-f>","actions":["scroll_documentation_down","fallback"]},{"lhs":"<up>","actions":["select_prev","fallback"]},{"lhs":"<s-tab>","actions":["snippet_backward","fallback"]},{"lhs":"<down>","actions":["select_next","fallback"]},{"lhs":"<c-n>","actions":["select_next","show_and_insert"]},{"lhs":"<c-p>","actions":["select_prev","function"]},{"lhs":"<c-y>","actions":["select_and_accept","fallback"]},{"lhs":"<c-e>","actions":["cancel","fallback"]},{"lhs":"<c-space>","actions":["show","show_documentation","hide_documentation"]},{"lhs":"<tab>","actions":["snippet_forward","function","function","fallback"]},{"lhs":"<c-b>","actions":["scroll_documentation_up","fallback"]}],"default":[{"lhs":"<c-f>","actions":["scroll_documentation_down","fallback"]},{"lhs":"<up>","actions":["select_prev","fallback"]},{"lhs":"<s-tab>","actions":["snippet_backward","fallback"]},{"lhs":"<down>","actions":["select_next","fallback"]},{"lhs":"<c-n>","actions":["select_next","show_and_insert"]},{"lhs":"<c-p>","actions":["select_prev","function"]},{"lhs":"<c-y>","actions":["select_and_accept","fallback"]},{"lhs":"<c-e>","actions":["cancel","fallback"]},{"lhs":"<c-space>","actions":["show","show_documentation","hide_documentation"]},{"lhs":"<tab>","actions":["snippet_forward","function","function","fallback"]},{"lhs":"<c-b>","actions":["scroll_documentation_up","fallback"]}]},"flash":{"multi_line":false,"char_keys":["f","F","t","T",";",","],"jump_labels":false}};
|
||
|
||
// ---- 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) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[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 " 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": "left", "j": "down", "k": "up", "l": "right", "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>": "up", "<Down>": "down", "<Left>": "left", "<Right>": "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 ---------------------------------------------------------------------------------
|
||
// Two physical boards in key units (1u = one letter key): a standard US ANSI tenkeyless board and
|
||
// the full-size QMK board (Keychron Q5 Max) from the QMK cheatsheet. Letters are QWERTY on both, so a
|
||
// key does the same Vim thing on either; only where it sits (and which keys exist) changes.
|
||
// Printable keys carry base/shifted characters, named keys a Vim key name, modifier keys are toggles.
|
||
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) }));
|
||
const numrow = [pair("`", "~"), pair("1", "!"), pair("2", "@"), pair("3", "#"), pair("4", "$"), pair("5", "%"), pair("6", "^"),
|
||
pair("7", "&"), pair("8", "*"), pair("9", "("), pair("0", ")"), pair("-", "_"), pair("=", "+")];
|
||
const kp = (n, label, h) => ({ n, label, h });
|
||
function buildBoard(w, h, rows) {
|
||
const keys = [];
|
||
for (const [y, x0, items] of rows) {
|
||
let x = x0;
|
||
for (const it of items) {
|
||
const kw = it.w || 1;
|
||
if (!it.gap) keys.push({ ...it, x, y, w: kw, h: it.h || 1 });
|
||
x += kw;
|
||
}
|
||
}
|
||
return { w, h, keys };
|
||
}
|
||
const BOARDS = {
|
||
standard: { name: "Standard", ...buildBoard(18.25, 6.25, [
|
||
[0, 0, [{ n: "Esc" }, { gap: 1 }, ...fk(1, 4), { gap: 1, w: 0.5 }, ...fk(5, 8), { gap: 1, w: 0.5 }, ...fk(9, 12)]],
|
||
[1.25, 0, [...numrow, { n: "BS", w: 2, label: "Backspace" }]],
|
||
[1.25, 15.25, [{ n: "Insert", label: "Ins" }, { n: "Home" }, { n: "PageUp", label: "PgUp" }]],
|
||
[2.25, 0, [{ n: "Tab", w: 1.5 }, ...letters("qwertyuiop"), pair("[", "{"), pair("]", "}"), pair("\\", "|", 1.5)]],
|
||
[2.25, 15.25, [{ n: "Del" }, { n: "End" }, { n: "PageDown", label: "PgDn" }]],
|
||
[3.25, 0, [{ mod: "Caps", w: 1.75 }, ...letters("asdfghjkl"), pair(";", ":"), pair("'", '"'), { n: "CR", w: 2.25, label: "Enter" }]],
|
||
[4.25, 0, [{ mod: "Shift", w: 2.25 }, ...letters("zxcvbnm"), pair(",", "<"), pair(".", ">"), pair("/", "?"), { mod: "Shift", w: 2.75 }]],
|
||
[4.25, 16.25, [{ n: "Up", label: "↑" }]],
|
||
[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 }]],
|
||
[5.25, 15.25, [{ n: "Left", label: "←" }, { n: "Down", label: "↓" }, { n: "Right", label: "→" }]],
|
||
]) },
|
||
// Positions from the Q5 Max info.json (LAYOUT_ansi_101). It has no Insert key, the nav column is
|
||
// PgUp / PgDn / Home-End (a tap dance: tap Home, double-tap End), the right-hand Alt/Menu are the
|
||
// FN1/FN2 layer keys, and the top-right keys (Print Screen, Calc, Find, knob) have no Vim meaning.
|
||
q5: { name: "Q5 Max (QMK)", ...buildBoard(20.5, 6.5, [
|
||
[0, 0, [{ n: "Esc" }, { gap: 1 }, ...fk(1, 4), { gap: 1, w: 0.5 }, ...fk(5, 8), { gap: 1, w: 0.5 }, ...fk(9, 12), { gap: 1, w: 0.25 },
|
||
{ n: "Del" }, { n: "PrtSc" }, { n: "Calc" }, { n: "Find" }, { n: "Knob", label: "⏯" }]],
|
||
[1.25, 0, [...numrow, { n: "BS", w: 2, label: "Backspace" }, { gap: 1, w: 0.25 }, { n: "PageUp", label: "PgUp" },
|
||
{ n: "NumLock", label: "Num" }, kp("kDivide", "/"), kp("kMultiply", "*"), kp("kMinus", "-")]],
|
||
[2.25, 0, [{ n: "Tab", w: 1.5 }, ...letters("qwertyuiop"), pair("[", "{"), pair("]", "}"), pair("\\", "|", 1.5), { gap: 1, w: 0.25 },
|
||
{ n: "PageDown", label: "PgDn" }, kp("k7", "7"), kp("k8", "8"), kp("k9", "9"), kp("kPlus", "+", 2)]],
|
||
[3.25, 0, [{ mod: "Caps", w: 1.75 }, ...letters("asdfghjkl"), pair(";", ":"), pair("'", '"'), { n: "CR", w: 2.25, label: "Enter" }, { gap: 1, w: 0.25 },
|
||
{ n: "Home", label: "Home" }, kp("k4", "4"), kp("k5", "5"), kp("k6", "6")]],
|
||
[4.25, 0, [{ mod: "Shift", w: 2.25 }, ...letters("zxcvbnm"), pair(",", "<"), pair(".", ">"), pair("/", "?"), { mod: "Shift", w: 1.75 }, { gap: 1, w: 2.5 },
|
||
kp("k1", "1"), kp("k2", "2"), kp("k3", "3"), kp("kEnter", "Ent", 2)]],
|
||
[4.5, 14.25, [{ n: "Up", label: "↑" }]],
|
||
[5.25, 0, [{ mod: "Ctrl", w: 1.25 }, { mod: "Super", w: 1.25 }, { mod: "Alt", w: 1.25 }, { n: "Space", w: 6.25 },
|
||
{ mod: "Fn2" }, { mod: "Fn1" }, { mod: "Ctrl" }, { gap: 1, w: 3.5 }, { n: "k0", label: "0", w: 2 }, kp("kPoint", ".")]],
|
||
[5.5, 13.25, [{ n: "Left", label: "←" }, { n: "Down", label: "↓" }, { n: "Right", label: "→" }]],
|
||
]) },
|
||
};
|
||
let KB_BOARD = "standard";
|
||
try { const b = localStorage.getItem("nvim-cheatsheet-board"); if (BOARDS[b]) KB_BOARD = b; } catch (e) { /* storage blocked: default board */ }
|
||
let KEYS = BOARDS[KB_BOARD].keys;
|
||
let KB_THEME = "dark";
|
||
try { const t = localStorage.getItem("nvim-cheatsheet-kbtheme"); if (t === "light" || t === "dark") KB_THEME = t; } catch (e) { /* storage blocked: default colourway */ }
|
||
|
||
// 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>( { < \" 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 B = BOARDS[KB_BOARD];
|
||
$("kb").style.aspectRatio = `${B.w} / ${B.h}`;
|
||
for (const b of $("kblayout").children) b.setAttribute("aria-pressed", String(b.dataset.board === KB_BOARD));
|
||
$("board").dataset.board = KB_BOARD;
|
||
$("board").dataset.kb = KB_THEME;
|
||
for (const b of $("kbtheme").children) b.setAttribute("aria-pressed", String(b.dataset.kbt === KB_THEME));
|
||
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 / B.w) * 100}%;top:${(k.y / B.h) * 100}%;width:${(k.w / B.w) * 100}%;height:${(k.h / B.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));
|
||
$("kblayout").innerHTML = Object.entries(BOARDS).map(([id, b]) => `<button type="button" data-board="${id}" aria-pressed="${id === KB_BOARD}">${esc(b.name)}</button>`).join("");
|
||
$("kblayout").addEventListener("click", (e) => {
|
||
const b = e.target.closest("[data-board]");
|
||
if (!b || b.dataset.board === KB_BOARD) return;
|
||
KB_BOARD = b.dataset.board;
|
||
KEYS = BOARDS[KB_BOARD].keys;
|
||
KB.cur = -1;
|
||
try { localStorage.setItem("nvim-cheatsheet-board", KB_BOARD); } catch (err) { /* storage blocked: choice isn't remembered */ }
|
||
drawKB();
|
||
});
|
||
$("kbtheme").addEventListener("click", (e) => {
|
||
const b = e.target.closest("[data-kbt]");
|
||
if (!b || b.dataset.kbt === KB_THEME) return;
|
||
KB_THEME = b.dataset.kbt;
|
||
try { localStorage.setItem("nvim-cheatsheet-kbtheme", KB_THEME); } catch (err) { /* storage blocked: choice isn't remembered */ }
|
||
drawKB();
|
||
});
|
||
$("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>
|