This is the reference . VS Code chord / menu path on the left, mnml chord on the right, the command id mnml fires in the middle. For the narrative migration walkthrough — what mnml ships, what’s renamed, what’s intentionally missing — see Coming from VS Code . For the live in-app cheatsheet that walks your current keymap, open the pane with Ctrl+K ? (which-key leader → ?) or run the palette command view.cheatsheet.
How to use this page
Use your browser’s find (Ctrl+F / Cmd+F) to grep for a chord, a command id, or an action verb.
Rows marked (not bound) are honest about VS Code commands that mnml does not implement — either the feature exists under a different chord, or the feature isn’t here yet.
mnml is in standard (modeless / VS Code-style) mode by default. Switch with the palette command editor.use_standard, the ex command :set input=standard, or the bufferline mode chip.
Chord notation: Ctrl+X is Cmd+X on macOS for the chords macOS terminals can transmit. mnml uses Ctrl throughout; your terminal may need an “Option/Alt sends Esc+” toggle to forward Alt+… chords.
mnml’s leader chord in standard mode is Ctrl+K — same prefix VS Code uses for its chord-prefix bindings. Follow with the next-key from the NvChad cheatsheet ’s <leader>… tables.
VS Code mnml Command id Notes Ctrl+N New FileCtrl+Nfile.newPrompts for workspace-relative path Ctrl+S SaveCtrl+Sfile.saveCtrl+K S Save All(not bound under chord) file.save_allPalette: “Save all files” Ctrl+Shift+S Save As…(not bound) — Use :saveas <path> in vim mode; SEV-3 gap Ctrl+W Close EditorCtrl+Wbuffer.closeCtrl+Shift+T Reopen Closed EditorCtrl+Shift+Tbuffer.reopenCtrl+K Ctrl+W Close All(not bound under chord) view.close_others (partial)Closes all but active Ctrl+P Quick OpenCtrl+Ppicker.filesFile picker Ctrl+R RecentCtrl+Rpicker.recentmnml-specific; VS Code uses Ctrl+R for recent folders Ctrl+Shift+N New Window(not bound) — mnml is single-window; launch a second binary Ctrl+, SettingsCtrl+,file.open_settingsOpens the TOML in a buffer (settings UI is view.settings) Ctrl+Shift+Y (none)— — File: Revert (not bound under chord) file.reloadRefuses if dirty
VS Code mnml Command id Notes Ctrl+X CutCtrl+Xedit_op::CutSelection / YankLine+DeleteLineFalls back to cut-line when no selection Ctrl+C CopyCtrl+Cedit_op::YankSelection / YankLineYanks line with no selection Ctrl+V PasteCtrl+Vedit_op::PasteCtrl+Z UndoCtrl+Zedit_op::UndoCtrl+Shift+Z / Ctrl+Y Redoboth edit_op::RedoCtrl+A Select AllCtrl+Aedit_op::SelectAllCtrl+L Select LineCtrl+Ledit_op::SelectLineNote: vim mode rebinds Ctrl+L to view.redraw Ctrl+D Add Selection to Next Find MatchCtrl+Deditor.add_cursor_at_next_wordCtrl+Shift+L Select All OccurrencesCtrl+Shift+Leditor.select_all_occurrencesCtrl+Shift+K Delete LineCtrl+Shift+Keditor.delete_lineCtrl+Shift+D Duplicate LineCtrl+Shift+Dedit_op::DuplicateLineAlt+Up / Alt+Down Move Linesame editor.move_line_{up,down}Aliases: Alt+K / Alt+J Shift+Alt+Up / Shift+Alt+Down Copy Line Up/DownShift+Alt+Up / Shift+Alt+Downedit_op::DuplicateLineSame VS-Code semantic — cursor lands on the new copy. Ctrl+Shift+D still works and stays in place. Ctrl+] IndentTab (with selection)edit_op::Indentmnml indents the selection range Ctrl+[ OutdentShift+Tabedit_op::OutdentCtrl+/ Toggle Line CommentCtrl+/edit_op::ToggleLineCommentShift+Alt+A Block Comment(not bound) — Filetype-aware toggle still in flight Ctrl+Enter Insert Line BelowCtrl+Enter(custom) Open line below Ctrl+Shift+Enter Insert Line AboveCtrl+Shift+Enter(custom) Open line above Alt+Click Add CursorAlt+Click(in-handler) Wired. macOS Terminal swallows Option by default — enable “Use Option as Meta” in your terminal, or use iTerm2 / Alacritty / Kitty where Alt arrives intact. Ctrl+Alt+Up / Ctrl+Alt+Down Add Cursor Above/Belowsame (also Ctrl+Alt+K / Ctrl+Alt+J) editor.add_cursor_{above,below}Escape Clear Multi-Cursor(rebinds Esc to drop selection only) editor.clear_extra_cursorsPalette-only; SEV-3 gap Ctrl+Space Trigger SuggestCtrl+Spacelsp.completionCtrl+. Quick Fix…Ctrl+.lsp.code_actionAlt+Enter Apply First Quick FixAlt+Enterlsp.quick_fixCtrl+Shift+I Format DocumentCtrl+Shift+Ilsp.formatFalls back to external formatter via editor.format Ctrl+K Ctrl+F Format Selection(not bound under chord) — Use Ctrl+Shift+I Shift+Alt+O Organize ImportsAlt+Shift+Olsp.organize_imports
VS Code mnml Command id Notes Arrow keys same edit_op::Move{Left,Right,Up,Down}Shift+Arrows same (SelectStart + motion) Extends selection Ctrl+Left / Ctrl+Rightsame edit_op::MoveWord{Left,Right}Word motion Home / Endsame edit_op::MoveLine{Start,End}Ctrl+Home / Ctrl+Endsame edit_op::MoveBuffer{Start,End}PageUp / PageDownsame edit_op::Page{Up,Down}Ctrl+G Go to Line…Ctrl+Geditor.goto_line1-based Ctrl+Backspace Delete Word Leftsame edit_op::DeleteWordLeftCtrl+Delete Delete Word Rightsame edit_op::DeleteWordRightCtrl+M Toggle Tab Moves Focus(not bound) — mnml’s Tab is always indent / insert spaces
VS Code mnml Command id Notes Ctrl+F FindCtrl+Ffind.findCtrl+H ReplaceCtrl+Hfind.replaceReplace every match of the active find F3 Find NextF3find.nextShift+F3 Find PreviousShift+F3find.prevAlt+R Toggle RegexAlt+Rfind.toggle_regexSticky toggle Ctrl+Shift+F Find in FilesCtrl+Shift+Ffind.grepWorkspace grep (rg / git grep) → results pane Ctrl+Shift+H Replace in Files(not bound under chord) find.grep_replaceRun after find.grep from the results pane Ctrl+G Go to Line — note conflictrebound — Ctrl+G opens go-to-line editor.goto_lineVS Code’s Ctrl+G and mnml’s are the same chord, same action Alt+Enter Select all matches(not bound for find) — mnml uses Alt+Enter for lsp.quick_fix Find: Match Case (toggle) (not bound) — Find is case-insensitive by default; SEV-3 gap Find: Match Whole Word (toggle) (not bound) — Use word-boundary regex with Alt+R
VS Code mnml Command id Notes Alt+Left BackAlt+Leftnav.backAlt+Right ForwardAlt+Rightnav.forwardF12 Go to DefinitionF12lsp.goto_definitionCtrl+F12 Go to Implementation(not bound under chord) lsp.goto_implementationPalette Shift+F12 Go to References(not bound under chord) lsp.referencesPalette / Ctrl+K Ctrl+L chord F2 Rename SymbolF2lsp.renameAdded 2026-06-08 — also surfaced in the editor-body right-click menu Ctrl+Click Go to Definition(not bound — Ctrl+Click not wired) — SEV-3 mouse-pathway gap Ctrl+T Workspace Symbol(not bound under chord) lsp.workspace_symbolsPalette Ctrl+Shift+O Go to Symbol in FileCtrl+Shift+Olsp.symbolsNote: also bound to editor.open_at_cursor — chord conflict (file symbols wins in vim mode, open_at_cursor in standard mode behavior unverified; SEV-3) Ctrl+P @ Symbol picker(not implemented as fuzzy modifier) — Use Ctrl+Shift+O Ctrl+G Go to LineCtrl+Geditor.goto_lineF8 / Shift+F8 Next/Previous Problem(not bound to F-keys) lsp.{next,prev}_diagnosticUse <leader>ln / <leader>lp via Ctrl+K
mnml’s “tab” can mean two things: a buffer (file open in a pane) and a tab page (vim-style window group). VS Code’s tabs are mnml’s buffers.
VS Code mnml Command id Notes Ctrl+Tab Cycle Last OpenedCtrl+Tab (also Ctrl+6)buffer.lastSwap to previously-active buffer Ctrl+PageDown Next TabCtrl+PageDownbuffer.nextCtrl+PageUp Previous TabCtrl+PageUpbuffer.prevCtrl+W Close TabCtrl+Wbuffer.closeCtrl+K W Close All Tabs in Group(not bound under chord) view.close_othersCloses other panes Ctrl+Shift+T Reopen ClosedCtrl+Shift+Tbuffer.reopenCtrl+1 … Ctrl+9 Focus Tab NAlt+1 … Alt+9tab.goto_Nmnml binds Alt+N, not Ctrl+N (which is New File) Middle-click tab to close (not bound) — Use Ctrl+W or palette buffer.close Drag tab to reorder (not bound) tab.move_{left,right} (palette)Drag-reorder is a SEV-3 mouse gap Right-click tab → Close Others (no context menu) palette view.close_others
VS Code mnml Command id Notes Ctrl+\ Split Editor RightCtrl+\view.split_rightSame VS Code chord. (term.scratch_toggle is now Ctrl+` only — the chords were colliding before 2026-06-08.) Ctrl+K Ctrl+\ Split Editor Down(not bound) view.split_downUse Ctrl+K Ss Ctrl+1 Ctrl+2 Ctrl+3 Focus Group N(not bound) — Use Ctrl+K Sh/Sj/Sk/Sl directional focus Ctrl+K Left/Right/Up/Down Move Editor(not bound under chord) view.move_split_*Palette Ctrl+W (split context) Close Editor Group(not bound separately) view.close_splitSame chord as buffer close Drag splitter to resize (not bound) view.split_{grow,shrink}_{width,height}Palette / leader Ctrl+K = Reset Editor Group Sizes(not bound) view.equalize_splitsPalette
VS Code mnml Command id Notes Ctrl+B Toggle SidebarCtrl+Bview.toggle_treeCtrl+Shift+E Show ExplorerCtrl+Shift+Eview.focus_treeFocuses tree (unhides if hidden) Ctrl+Shift+F Show Search(not bound to view-show) view.activity_search (palette)Same chord starts a grep Ctrl+Shift+G Show Source Control(not bound under chord) view.activity_gitPalette Ctrl+Shift+D Show Debug(not bound — Ctrl+Shift+D is duplicate-line) view.activity_debugPalette Ctrl+Shift+X Show Extensions(not bound — mnml has no extensions panel) integrations.addDiscover overlay for family siblings Click folder to expand yes (mouse path works) tree event Right-click → New File / New Folder (no context menu) palette file.new / file.new_folder Right-click → Reveal in Finder (no context menu) palette view.reveal_active Drag-drop to move file (not bound) — SEV-3
VS Code mnml Command id Notes Ctrl+Shift+P Command PaletteCtrl+Shift+P (also F1)paletteF1 Command PaletteF1palette / view.helpF1 toggles between palette + auto-generated help overlay Ctrl+P Quick OpenCtrl+Ppicker.filesCtrl+P @ Symbols(not as modifier) Ctrl+Shift+O insteadCtrl+P # Workspace Symbols(not as modifier) lsp.workspace_symbols paletteCtrl+P : Go to Line(not as modifier) Ctrl+G insteadCtrl+K Ctrl+S Keyboard Shortcuts(not bound under chord) view.cheatsheetPalette; also <leader>?
VS Code mnml Command id Notes Ctrl+` Toggle TerminalCtrl+`term.scratch_toggleQuick scratch strip at bottom. (Ctrl+\ used to also fire this; that binding was dropped in #273 so VS-Code parity could land it on view.split_right.) Ctrl+T New TerminalCtrl+Tterm.focus_or_open_shellFocus existing or open new Terminal: New (palette) term.shellNew shell, splits below Terminal: Rename (palette) term.renameCtrl+Shift+5 Split Terminal(not bound under chord) — Use term.shell again to add a session Ctrl+PageUp/Down (in terminal) Switchsame buffer.{next,prev}mnml’s pty pane has its own tab strip
VS Code mnml Command id Notes Ctrl+Shift+G Source Control(palette) view.activity_gitStage selected (UI) (UI in status pane) git.status_paneCtrl+Enter Commit (in SC view)(palette) git.commitPush (UI button) (palette) git.pushAuto --set-upstream on first push Pull (UI button) (palette) git.pull--ff-onlyFetch (UI button) (palette) git.fetch--all --pruneAlt+F5 / Alt+F3 Next/Prev Change(not bound to Alt+F-keys) git.jump_{next,prev}_changeUse ]c / [c in vim mode Open File at Remote (palette) git.browseGitHub / GitLab / Bitbucket / Azure DevOps GitLens Blame (palette / <leader>gb) git.blame_toggleFile History (palette) git.file_historyCommits touching this file Diff with Working Tree (palette / <leader>gd) git.diff_fileStash (UI) (palette / <leader>gS) git.stashStash Pop (UI) (palette / <leader>gP) git.stash_popReflog (palette) git.reflogPick entry → open commit diff Tag (palette) git.tag / git.push_tags / git.tag_deleteUndo Last Commit (palette) git.undo / git.redoreset --soft HEAD~1 / inverseCherry-Pick (palette, from graph) git.cherry_pickFrom the selected graph commit Revert Commit (palette, from graph) git.revert
VS Code mnml Command id Notes F5 Start DebuggingF5dap.runShift+F5 Stop / ContinueShift+F5dap.continueContinue (resume from breakpoint); dap.terminate for stop F9 Toggle BreakpointF9dap.toggle_breakpointShift+F9 Conditional BreakpointShift+F9dap.toggle_breakpoint_conditionalF10 Step OverF10dap.nextF11 Step IntoF11dap.step_inShift+F11 Step OutShift+F11dap.step_outPause (palette) dap.pauseDebug Console (palette) dap.replEvaluate expressions Watch Expressions (palette) dap.{add,remove,clear}_watchReverse Continue (palette) dap.reverse_continueRequires record-replay adapter Step Backward (palette) dap.step_backRequires record-replay adapter Attach to Process (palette) dap.attachException Breakpoints (palette) dap.exceptionsHit Count Breakpoint (palette) dap.set_breakpoint_hit_count
VS Code mnml Command id Notes Ctrl+Shift+B Run Build TaskCtrl+Shift+B → Toggle right side panel view.toggle_right_panelmnml has no build-task concept yet; the chord is repurposed for the panel toggle. task.run still reachable via <leader>o. See Right side panel . Run Test (palette / <leader>Ta etc.) test.run_*Tasks: Configure (palette) — Use tasks block in TOML — see Settings
VS Code’s AI is via extensions. mnml ships AI as first-class panes.
VS Code AI workflow mnml Command id Notes Copilot inline suggest (palette / config) ai.toggle_inline_suggestionsCursor-style ghost text Copilot accept (Tab) (not bound — Tab is indent) — SEV-3 — need a distinct chord for accept-suggestion Copilot Chat <leader>aC / paletteai.chatOpen Claude Code <leader>ac / paletteai.claude_codeRight dock Open Codex <leader>ax / paletteai.codexRight dock Ask <leader>aaai.askExplain <leader>aeai.explainSelection or file Fix <leader>afai.fixRefactor <leader>arai.refactorWrite Tests <leader>awai.write_testsMirror live session <leader>amai.session_viewCancel (palette) ai.cancelApply Suggested Change (palette) ai.apply
VS Code mnml Command id Notes Ctrl+, SettingsCtrl+,file.open_settingsOpens the TOML in a buffer Ctrl+K Ctrl+T Color Theme(palette / <leader>tt) theme.pickSettings UI (overlay) (palette) view.settingsmnml’s keyboard-driven schema overlay Ctrl+K Z Zen ModeCtrl+Shift+Zview.zenHide tree + bufferline + statusline Ctrl+L Cursor Centered (vim style)(vim mode: zz) view.cursor_to_centerStandard mode rebinds Ctrl+L to redraw Ctrl+K Ctrl+0 Fold All(palette) lsp.fold_allLSP server ranges Ctrl+K Ctrl+J Unfold All(palette) editor.unfold_allWord Wrap (toggle) (palette) view.toggle_wrapMinimap (toggle) (palette) view.toggle_scrollbarmnml has a scrollbar, not a minimap Render Whitespace (palette) view.toggle_whitespaceBracket Pair Colorization (palette) view.toggle_bracket_rainbowSticky Scroll (palette) view.toggle_sticky_contextColor Column (Ruler) (palette) view.toggle_color_columnTrailing Whitespace highlight (palette) view.toggle_highlight_trailing_wsHighlight word under cursor (palette) view.toggle_highlight_wordRender markdown inline (palette) view.toggle_render_markdownrender-markdown.nvim style TODO highlight (palette) view.toggle_todo_highlightTODO / FIXME / HACK / XXX Breadcrumb toggle (palette) view.toggle_breadcrumbBufferline toggle (palette) view.toggle_bufferlineMarkdown Preview <leader>m / palettemarkdown.previewSplit Reveal in Finder/Explorer (palette) view.reveal_active
VS Code uses Live Preview / Live Server extensions. mnml has CDP-driven Chrome control built-in.
VS Code analog mnml Command id Notes Live Preview <leader>Bbrowser.openSpawns Chrome under CDP — console + nav + eval Screenshot extension (palette) browser.screenshot→ .mnml/screenshots/ Print to PDF (palette) browser.print_pdfCookie editor (palette) browser.cookies / browser.edit_cookie / browser.delete_cookie / browser.add_cookieStorage panel (palette) browser.storage / browser.{edit,add,delete}_storagelocalStorage / sessionStorage Network snapshot (palette) browser.snapshot / browser.diff_snapshotCapture + compare Device emulation (palette) browser.device_pickerMobile UA + viewport Performance panel (palette) browser.perfCore Web Vitals DOM picker (palette) browser.domSelectable nodes URL history (palette) browser.url_historyFuzzy pick
VS Code uses REST Client extension. mnml has an HTTP pane built-in (.http / .curl / .rest files).
REST Client mnml Command id Notes Send Request (codelens) <leader>hs / palettehttp.sendCopy as cURL <leader>hy / palettehttp.copy_curlToggle response view (palette) http.toggle_viewEdit ⇄ Response Copy response body (palette) http.copy_response_bodyDebug failing request <leader>hdhttp.ai_debugAsks Claude
Honest gaps — either mnml hasn’t implemented these, or the keyboard path exists but a mouse-only VS Code-shaped path is missing.
VS Code feature Status in mnml Notes Ctrl+Click go-to-definition(not bound) Use F12 or gd — SEV-3 mouse-pathway gap Alt+Click add cursor(not bound) Use Ctrl+Alt+Down/Up — SEV-3 Drag tab to reorder (not bound, palette only) SEV-3 mouse-pathway gap Middle-click tab to close (not bound) Use Ctrl+W — SEV-3 Right-click context menus (not implemented) mnml has no context menus — SEV-3 across the board Splitter drag to resize (not bound) Use view.split_grow_* palette commands — SEV-3 Ctrl+Shift+S Save As(not bound) :saveas <path> in vim mode — SEV-3Settings UI (mouse-driven) (keyboard-only view.settings) mnml’s settings overlay is keyboard-first Extensions Marketplace (no extensions; family integrations instead) Use integrations.add Notebook editor (not implemented) — Outline view (sidebar) (palette outline.show opens a pane) Different shape from VS Code’s sidebar pane Problems panel (sidebar) (palette lsp.diagnostics opens a pane) Same data, different shape Timeline view use git.file_history Remote SSH (not implemented) mnml runs in your terminal — SSH to host first GitHub Pull Requests extension use <leader>Pp pr.picker Cross-host (GitHub + GitLab + Bitbucket + Azure DevOps)
src/input/standard.rs — the modeless input handler (Ctrl shortcuts, arrow motion)
src/command.rs — every command + its default keyspecs
src/input/keymap.rs — keyspec parser + the Keymap overlay engine
src/whichkey.rs — Ctrl+K leader trie root
src/cheatsheet.rs — the in-app cheatsheet pane