Skip to content

VS Code cheatsheet

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.

VS CodemnmlCommand idNotes
Ctrl+N New FileCtrl+Nfile.newPrompts for workspace-relative path
Ctrl+S SaveCtrl+Sfile.save
Ctrl+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.close
Ctrl+Shift+T Reopen Closed EditorCtrl+Shift+Tbuffer.reopen
Ctrl+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 CodemnmlCommand idNotes
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::Paste
Ctrl+Z UndoCtrl+Zedit_op::Undo
Ctrl+Shift+Z / Ctrl+Y Redobothedit_op::Redo
Ctrl+A Select AllCtrl+Aedit_op::SelectAll
Ctrl+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_word
Ctrl+Shift+L Select All OccurrencesCtrl+Shift+Leditor.select_all_occurrences
Ctrl+Shift+K Delete LineCtrl+Shift+Keditor.delete_line
Ctrl+Shift+D Duplicate LineCtrl+Shift+Dedit_op::DuplicateLine
Alt+Up / Alt+Down Move Linesameeditor.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::Outdent
Ctrl+/ Toggle Line CommentCtrl+/edit_op::ToggleLineComment
Shift+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.completion
Ctrl+. Quick Fix…Ctrl+.lsp.code_action
Alt+Enter Apply First Quick FixAlt+Enterlsp.quick_fix
Ctrl+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 CodemnmlCommand idNotes
Arrow keyssameedit_op::Move{Left,Right,Up,Down}
Shift+Arrowssame(SelectStart + motion)Extends selection
Ctrl+Left / Ctrl+Rightsameedit_op::MoveWord{Left,Right}Word motion
Home / Endsameedit_op::MoveLine{Start,End}
Ctrl+Home / Ctrl+Endsameedit_op::MoveBuffer{Start,End}
PageUp / PageDownsameedit_op::Page{Up,Down}
Ctrl+G Go to Line…Ctrl+Geditor.goto_line1-based
Ctrl+Backspace Delete Word Leftsameedit_op::DeleteWordLeft
Ctrl+Delete Delete Word Rightsameedit_op::DeleteWordRight
Ctrl+M Toggle Tab Moves Focus(not bound)mnml’s Tab is always indent / insert spaces
VS CodemnmlCommand idNotes
Ctrl+F FindCtrl+Ffind.find
Ctrl+H ReplaceCtrl+Hfind.replaceReplace every match of the active find
F3 Find NextF3find.next
Shift+F3 Find PreviousShift+F3find.prev
Alt+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-lineeditor.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 CodemnmlCommand idNotes
Alt+Left BackAlt+Leftnav.back
Alt+Right ForwardAlt+Rightnav.forward
F12 Go to DefinitionF12lsp.goto_definition
Ctrl+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_line
F8 / 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 CodemnmlCommand idNotes
Ctrl+Tab Cycle Last OpenedCtrl+Tab (also Ctrl+6)buffer.lastSwap to previously-active buffer
Ctrl+PageDown Next TabCtrl+PageDownbuffer.next
Ctrl+PageUp Previous TabCtrl+PageUpbuffer.prev
Ctrl+W Close TabCtrl+Wbuffer.close
Ctrl+K W Close All Tabs in Group(not bound under chord)view.close_othersCloses other panes
Ctrl+Shift+T Reopen ClosedCtrl+Shift+Tbuffer.reopen
Ctrl+1Ctrl+9 Focus Tab NAlt+1Alt+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 CodemnmlCommand idNotes
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 CodemnmlCommand idNotes
Ctrl+B Toggle SidebarCtrl+Bview.toggle_tree
Ctrl+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 expandyes (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 CodemnmlCommand idNotes
Ctrl+Shift+P Command PaletteCtrl+Shift+P (also F1)palette
F1 Command PaletteF1palette / view.helpF1 toggles between palette + auto-generated help overlay
Ctrl+P Quick OpenCtrl+Ppicker.files
Ctrl+P @ Symbols(not as modifier)Ctrl+Shift+O instead
Ctrl+P # Workspace Symbols(not as modifier)lsp.workspace_symbols palette
Ctrl+P : Go to Line(not as modifier)Ctrl+G instead
Ctrl+K Ctrl+S Keyboard Shortcuts(not bound under chord)view.cheatsheetPalette; also <leader>?
VS CodemnmlCommand idNotes
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.rename
Ctrl+Shift+5 Split Terminal(not bound under chord)Use term.shell again to add a session
Ctrl+PageUp/Down (in terminal) Switchsamebuffer.{next,prev}mnml’s pty pane has its own tab strip
VS CodemnmlCommand idNotes
Ctrl+Shift+G Source Control(palette)view.activity_git
Stage selected (UI)(UI in status pane)git.status_pane
Ctrl+Enter Commit (in SC view)(palette)git.commit
Push (UI button)(palette)git.pushAuto --set-upstream on first push
Pull (UI button)(palette)git.pull--ff-only
Fetch (UI button)(palette)git.fetch--all --prune
Alt+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_toggle
File History(palette)git.file_historyCommits touching this file
Diff with Working Tree(palette / <leader>gd)git.diff_file
Stash (UI)(palette / <leader>gS)git.stash
Stash Pop (UI)(palette / <leader>gP)git.stash_pop
Reflog(palette)git.reflogPick entry → open commit diff
Tag(palette)git.tag / git.push_tags / git.tag_delete
Undo Last Commit(palette)git.undo / git.redoreset --soft HEAD~1 / inverse
Cherry-Pick(palette, from graph)git.cherry_pickFrom the selected graph commit
Revert Commit(palette, from graph)git.revert
VS CodemnmlCommand idNotes
F5 Start DebuggingF5dap.run
Shift+F5 Stop / ContinueShift+F5dap.continueContinue (resume from breakpoint); dap.terminate for stop
F9 Toggle BreakpointF9dap.toggle_breakpoint
Shift+F9 Conditional BreakpointShift+F9dap.toggle_breakpoint_conditional
F10 Step OverF10dap.next
F11 Step IntoF11dap.step_in
Shift+F11 Step OutShift+F11dap.step_out
Pause(palette)dap.pause
Debug Console(palette)dap.replEvaluate expressions
Watch Expressions(palette)dap.{add,remove,clear}_watch
Reverse Continue(palette)dap.reverse_continueRequires record-replay adapter
Step Backward(palette)dap.step_backRequires record-replay adapter
Attach to Process(palette)dap.attach
Exception Breakpoints(palette)dap.exceptions
Hit Count Breakpoint(palette)dap.set_breakpoint_hit_count
VS CodemnmlCommand idNotes
Ctrl+Shift+B Run Build TaskCtrl+Shift+BToggle right side panelview.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

AI (Copilot / Continue / etc. equivalents)

Section titled “AI (Copilot / Continue / etc. equivalents)”

VS Code’s AI is via extensions. mnml ships AI as first-class panes.

VS Code AI workflowmnmlCommand idNotes
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.chat
Open Claude Code<leader>ac / paletteai.claude_codeRight dock
Open Codex<leader>ax / paletteai.codexRight dock
Ask<leader>aaai.ask
Explain<leader>aeai.explainSelection or file
Fix<leader>afai.fix
Refactor<leader>arai.refactor
Write Tests<leader>awai.write_tests
Mirror live session<leader>amai.session_view
Cancel(palette)ai.cancel
Apply Suggested Change(palette)ai.apply
VS CodemnmlCommand idNotes
Ctrl+, SettingsCtrl+,file.open_settingsOpens the TOML in a buffer
Ctrl+K Ctrl+T Color Theme(palette / <leader>tt)theme.pick
Settings 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_all
Word Wrap (toggle)(palette)view.toggle_wrap
Minimap (toggle)(palette)view.toggle_scrollbarmnml has a scrollbar, not a minimap
Render Whitespace(palette)view.toggle_whitespace
Bracket Pair Colorization(palette)view.toggle_bracket_rainbow
Sticky Scroll(palette)view.toggle_sticky_context
Color Column (Ruler)(palette)view.toggle_color_column
Trailing Whitespace highlight(palette)view.toggle_highlight_trailing_ws
Highlight word under cursor(palette)view.toggle_highlight_word
Render 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_breadcrumb
Bufferline toggle(palette)view.toggle_bufferline
Markdown 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 analogmnmlCommand idNotes
Live Preview<leader>Bbrowser.openSpawns Chrome under CDP — console + nav + eval
Screenshot extension(palette)browser.screenshot.mnml/screenshots/
Print to PDF(palette)browser.print_pdf
Cookie editor(palette)browser.cookies / browser.edit_cookie / browser.delete_cookie / browser.add_cookie
Storage 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 ClientmnmlCommand idNotes
Send Request (codelens)<leader>hs / palettehttp.send
Copy as cURL<leader>hy / palettehttp.copy_curl
Toggle response view(palette)http.toggle_viewEdit ⇄ Response
Copy response body(palette)http.copy_response_body
Debug 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 featureStatus in mnmlNotes
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-3
Settings 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 viewuse git.file_history
Remote SSH(not implemented)mnml runs in your terminal — SSH to host first
GitHub Pull Requests extensionuse <leader>Pp pr.pickerCross-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.rsCtrl+K leader trie root
  • src/cheatsheet.rs — the in-app cheatsheet pane