This page lists every chord mnml ships, grouped by what the chord does. Each row shows the vim binding, the standard binding, and the command id mnml fires when either chord is pressed. When a chord doesn’t exist for a given input style, the cell is —.
vim = the chord under input_style = "vim" (NvChad-style). <leader> is <space> in vim Normal mode.
standard = the chord under input_style = "standard" (modeless / VS Code-style). The standard leader is Ctrl+K.
A chord ending in … means it’s a prompt or picker that opens with the chord.
A “same” entry means vim and standard share the chord (the global keymap routes it before the handler sees it).
Ctrl+X is Cmd+X on macOS for whichever chords your terminal forwards. mnml writes Ctrl throughout because that’s what crossterm sees.
Action vim standard Command id New file (prompt) :enew / :e <path>Ctrl+Nfile.new (vim Ctrl+N is keyword-completion next)Open file picker <leader>ff / Ctrl+PCtrl+Ppicker.filesOpen recent picker Ctrl+RCtrl+Rpicker.recentSave <leader>w / :w / Ctrl+SCtrl+Sfile.saveSave all :wa / :wall— file.save_allSave as (copy) :saveas <path>— (vim ex only) Reload from disk :reload(palette) file.reloadClose buffer <leader>q / <leader>bd / :bdCtrl+Wbuffer.closeReopen closed buffer <leader>brCtrl+Shift+Tbuffer.reopenOpen settings TOML Ctrl+,Ctrl+,file.open_settingsOpen settings overlay (palette) (palette) view.settings
Action vim standard Command id Next buffer :bn / <leader>bnCtrl+PageDownbuffer.nextPrevious buffer :bp / <leader>bpCtrl+PageUpbuffer.prevLast buffer (toggle) Ctrl+6Ctrl+Tab / Ctrl+6buffer.lastBuffer picker :b <name>Ctrl+Ppicker.buffers / picker.filesList buffers :ls / :buffers(palette) picker.buffersNew tab page :tabnew / :tabe(palette) tab.newNext tab gt / :tabnext(palette) tab.nextPrevious tab gT / :tabprev(palette) tab.prevFirst / last tab :tabfirst / :tablast(palette) tab.first / tab.lastClose tab :tabclose(palette) tab.closeClose other tabs :tabonly(palette) tab.onlyFocus tab N <leader>1…<leader>9 (harpoon)Alt+1…Alt+9tab.goto_N
Action vim standard Command id Split right (vertical) <leader>sv / :vsp / Ctrl+W vCtrl+\ / Ctrl+K Svview.split_rightSplit down (horizontal) <leader>ss / :sp / Ctrl+W sCtrl+K Ssview.split_downFocus left Ctrl+W h / <leader>shCtrl+K Shview.focus_leftFocus down Ctrl+W j / <leader>sjCtrl+K Sjview.focus_downFocus up Ctrl+W k / <leader>skCtrl+K Skview.focus_upFocus right Ctrl+W l / <leader>slCtrl+K Slview.focus_rightCycle focus Ctrl+W w / <leader>swCtrl+K Swview.focus_next_splitClose split Ctrl+W c / <leader>scCtrl+K Scview.close_splitClose other splits Ctrl+W o / :only / <leader>soCtrl+K Soview.close_othersEqualize splits Ctrl+W =(palette) view.equalize_splitsMaximize height Ctrl+W _(palette) view.maximize_heightMaximize width `Ctrl+W ` (palette) Grow / shrink height Ctrl+W + / Ctrl+W -(palette) view.split_grow_height / view.split_shrink_heightGrow / shrink width Ctrl+W > / Ctrl+W <(palette) view.split_grow_width / view.split_shrink_widthRotate splits Ctrl+W r(palette) view.rotate_splitsMove split direction Ctrl+W H/J/K/L(palette) view.move_split_*Promote split to tab Ctrl+W T(palette) view.move_to_new_tabSplit + go to def Ctrl+W d(palette) view.split_goto_definitionSplit + open path under cursor Ctrl+W f / gf(palette) view.split_open_file_under_cursorSplit + scratch buffer Ctrl+W n(palette) view.split_new_scratch
Action vim standard Command id Toggle file rail <leader>e / <leader>teCtrl+Bview.toggle_treeFocus file rail (palette) Ctrl+Shift+Eview.focus_treeCycle focus tree ⇄ editor Ctrl+ECtrl+Efocus.cycleToggle hidden files (focused tree) <leader>th(palette) view.toggle_hiddenToggle hidden files (all trees) <leader>tH(palette) view.toggle_hidden_allReveal active file (palette) (palette) view.reveal_activeToggle right side panel :set rightpanel!Ctrl+Shift+Bview.toggle_right_panelOpen right side panel :set rightpanel:set rightpanel— Close right side panel :set norightpanel:set norightpanel— Context menu at focus (keyboard right-click) Shift+F10Shift+F10view.context_menu_at_focus
Shift+F10 is mnml’s keyboard equivalent of right-click — it routes by current focus. With the file tree focused, it opens the tree-row context menu over the selected row (Set as workspace / New file / New folder / Rename / Reveal in Finder / …). With an editor pane focused, it opens the bufferline tab context menu for the active tab (Pin tab / Close / Close others / Split right / …):
These are the chords most likely to differ between handlers. The vim handler interprets hjkl, word motion, and operators directly; the standard handler uses arrow keys, Ctrl+arrow, Home/End, PageUp/Down.
Action vim standard Command id / source Left / right / up / down h / l / k / j← / → / ↑ / ↓edit_op::Move*Word forward / back w / b (variants e, ge, W, B, E)Ctrl+→ / Ctrl+←edit_op::MoveWord*Line start / end 0 / ^ / $ / g_Home / Endedit_op::MoveLine{Start,End}Buffer start / end gg / GCtrl+Home / Ctrl+Endedit_op::MoveBuffer{Start,End}Page up / down Ctrl+B / Ctrl+FPageUp / PageDownedit_op::Page{Up,Down}Half-page up / down Ctrl+U / Ctrl+D— vim.rsGo to line N nG / :NCtrl+Geditor.goto_lineViewport top / middle / bottom H / M / L(palette) view.move_cursor_view_*Scroll cursor to top / middle / bottom zt / zz / zb(palette) view.cursor_to_*Scroll one line up / down Ctrl+Y / Ctrl+E(palette) view.scroll_buffer_*Horizontal scroll zh / zl / zH / zL(palette) view.hscroll_*Char find on line f<c> / F<c> / t<c> / T<c> / ; / ,— vim.rsMatching bracket %(palette) editor.bracket_matchParagraph / sentence nav { / } / ( / )— vim.rsLast jump '' / “— vim.rsJumplist back / forward Ctrl+O / Ctrl+IAlt+← / Alt+→nav.back / nav.forwardChangelist back / forward g; / g,(palette) editor.jump_{prev,next}_edit
Action vim standard Command id Cut d / dd / D / x (vim operators)Ctrl+Xedit_op::CutSelectionCopy / yank y / yy / YCtrl+Cedit_op::YankSelection / YankLinePaste p / PCtrl+Vedit_op::PasteUndo uCtrl+Zedit_op::UndoRedo Ctrl+RCtrl+Shift+Z / Ctrl+Yedit_op::RedoSelect all ggVGCtrl+Aedit_op::SelectAllSelect line VCtrl+Ledit_op::SelectLineAdd cursor at next word match (operator-pending) Ctrl+Deditor.add_cursor_at_next_wordSelect all occurrences (palette) Ctrl+Shift+Leditor.select_all_occurrencesDelete line ddCtrl+Shift+Keditor.delete_lineDuplicate line yypCtrl+Shift+D / Shift+Alt+Down (down) / Shift+Alt+Up (up)edit_op::DuplicateLineMove line up / down (palette) Alt+↑ / Alt+↓ (also Alt+K / Alt+J)editor.move_line_{up,down}Indent / outdent >> / << / > / < (operators)Tab / Shift+Tabedit_op::Indent / OutdentToggle line comment Ctrl+/Ctrl+/edit_op::ToggleLineCommentInsert line below / above o / OCtrl+Enter / Ctrl+Shift+Enter(custom) Delete word left / right (operator-pending) Ctrl+Backspace / Ctrl+Deleteedit_op::DeleteWordLeft / DeleteWordRightReflow paragraph gq / gqq / gqap / gqip(palette) editor.reflow_paragraphJoin lines (with / without space) J / gJ(palette) vim.rsCase toggle / upper / lower ~ / gU / gu(palette) vim.rsAdd cursor above / below (palette) Ctrl+Alt+↑ / Ctrl+Alt+↓ (also Ctrl+Alt+K / Ctrl+Alt+J)editor.add_cursor_{above,below}Clear extra cursors Esc (drops selection too)Esceditor.clear_extra_cursorsDot repeat .— vim.dot_repeatMacros: record / replay qa…q / @a / @@ / n@a— vim.macro_{toggle,replay}Named registers "ay / "ap / "+y / "+p / "0p— vim.rsMarks: set / jump ma / 'a / `a— vim.rsChar info / utf-8 info ga / g8(palette) editor.char_info / editor.char_utf8File info / stats Ctrl+G / g Ctrl+G(palette) editor.file_info / editor.file_statsRepeat last :s & / :&— editor.repeat_last_substituteToggle fold za(palette) editor.toggle_foldUnfold all zR(palette) editor.unfold_allFold all (LSP ranges) (palette) (palette) lsp.fold_all
These are operator-pending objects — type them after d, c, y, v, etc.
Object Chord Notes Word (inner / around) iw / awBracket / paren / quote (inner / around) i( / a( / i" / a"also i{, i[, i<, i', i` Paragraph ip / apSentence is / asFunction (tree-sitter) if / afClass (tree-sitter) ic / acParameter / argument (tree-sitter) ia / aaConditional (tree-sitter) ii / ai
Action vim standard Command id Find forward (prompt) /Ctrl+Ffind.findFind backward (prompt) ?(palette) find.find_backwardNext / prev match n / NF3 / Shift+F3find.next / find.prevWord under cursor (forward / back) * / #(palette) find.word_{forward,backward}Partial word under cursor g* / g#(palette) vim.rsSelect next / prev match gn / gN(palette) find.select_match_{forward,backward}Clear find highlight :noh / :nohlsearch(palette) find.clearToggle regex (in find prompt) Alt+RAlt+Rfind.toggle_regexReplace (in current buffer) :%s/old/new/g / :%s/old/new/gcCtrl+Hfind.replace (vim Ctrl+H is INSERT-backspace)Workspace grep <leader>fg / :Rg <pat> / :Ag / :grep / :vimgrepCtrl+Shift+Ffind.grepReplace across workspace (results pane) (results pane) find.grep_replaceQuickfix next / prev :cn / :cp(palette) qf.next / qf.prevQuickfix first / last :cfirst / :clast(palette) qf.first / qf.lastOpen / close quickfix pane :copen / :cclose(palette) vim.rs
Action vim standard Command id Code action <leader>laCtrl+.lsp.code_actionApply first quick fix (palette) Alt+Enterlsp.quick_fixTrigger completion <leader>lc / Ctrl+SpaceCtrl+Spacelsp.completionSymbols in file <leader>lsCtrl+Shift+Olsp.symbolsWorkspace symbols <leader>lS(palette) lsp.workspace_symbolsOutline pane <leader>lo(palette) outline.showGo to definition gd / <leader>ld / F12F12lsp.goto_definitionGo to declaration gD(palette) lsp.goto_declarationGo to implementation (palette) (palette) lsp.goto_implementationHover docs K / <leader>lh(palette) lsp.hoverFind references gr / <leader>lr(palette) lsp.referencesRename symbol <leader>lR / F2F2lsp.renameDiagnostics list <leader>le(palette) lsp.diagnosticsNext / prev diagnostic <leader>ln / <leader>lp(palette / Ctrl+K leader) lsp.next_diagnostic / lsp.prev_diagnosticFormat document Ctrl+Shift+ICtrl+Shift+Ilsp.format (falls back to editor.format)Organize imports Alt+Shift+OAlt+Shift+Olsp.organize_importsOpen URL under cursor (OS browser) gx(palette) editor.open_url_at_cursorOpen path under cursor gf(palette) editor.open_at_cursor
Action vim standard Command id Status / staging pane <leader>gs(palette) git.status_paneCommit (editor for staged) <leader>gc(palette) git.commitAI (Claude) commit message <leader>gm(palette) git.ai_commitAI rewrite HEAD message <leader>gM(palette) git.ai_recomposeCodex commit message <leader>gx(palette) git.codex_commitBlame toggle <leader>gb(palette) git.blame_toggleDiff active file <leader>gd(palette) git.diff_fileDiff worktree <leader>gD(palette) git.diffDiff all vs HEAD <leader>gA(palette) git.diff_allPeek change at cursor <leader>gp(palette) git.peek_changeCommit graph (DAG) <leader>gl(palette) git.graphCheckout branch <leader>go(palette) git.checkoutNew branch <leader>gn(palette) git.new_branchWorktrees → shell <leader>gw(palette) git.worktreesStash (with optional msg) <leader>gS(palette) git.stashStash pop <leader>gP(palette) git.stash_popNext / prev change hunk ]c / [c(palette) git.jump_next_change / git.jump_prev_changeNext / prev file in diff ]f / [f(palette) git.diff_next_file / git.diff_prev_filePush (palette) (palette) git.pushPull (--ff-only) (palette) (palette) git.pullFetch (--all --prune) (palette) (palette) git.fetchReflog picker (palette) (palette) git.reflogFile history (palette) (palette) git.file_historyOpen in remote (host browser) (palette) (palette) git.browseCherry-pick (from graph) (palette) (palette) git.cherry_pickRevert (from graph) (palette) (palette) git.revertUndo / redo last commit (palette) (palette) git.undo / git.redoTag / push tags / delete tag (palette) (palette) git.tag / git.push_tags / git.tag_delete
Action vim standard Command id Run task <leader>o(palette) task.runRun all tests <leader>Ta(palette) test.run_allRun tests in this file <leader>Tf(palette) test.run_fileRun test at cursor <leader>Tt(palette) test.run_at_cursorRerun last-failed <leader>Tl(palette) test.rerun_failedHeal failing test (Claude) <leader>Th(palette) test.healFlaky / wobbly dashboard <leader>Tw(palette) flaky.show
Action vim standard Command id Start debugging F5F5dap.runContinue Shift+F5Shift+F5dap.continueToggle breakpoint F9F9dap.toggle_breakpointConditional breakpoint Shift+F9Shift+F9dap.toggle_breakpoint_conditionalStep over / into / out F10 / F11 / Shift+F11F10 / F11 / Shift+F11dap.next / dap.step_in / dap.step_outPause (palette) (palette) dap.pauseDebug console (REPL) (palette) (palette) dap.replWatch expressions (palette) (palette) dap.{add,remove,clear}_watchReverse continue / step back (palette) (palette) dap.reverse_continue / dap.step_backAttach to process (palette) (palette) dap.attachSet hit-count / exception breakpoints (palette) (palette) dap.set_breakpoint_hit_count / dap.exceptions
Action vim standard Command id Scratch terminal toggle (bottom strip) Ctrl+`Ctrl+`term.scratch_toggleFocus existing or open new shell <leader>atCtrl+Tterm.focus_or_open_shell (vim Ctrl+T is INSERT-indent / NORMAL nav.back)Shell as a pane <leader>at / :term / :terminal(palette) term.shellRename pty tab (palette) (palette) term.rename
Each launcher opens the named binary in a Pty pane. If the binary isn’t on $PATH, mnml offers to install it via brew (macOS) or apt (Linux) — see the Tools launchers section below.
Action vim standard Command id Open htop <leader>ih(palette) tools.htop / term.htopOpen iftop <leader>iI(palette) tools.iftop / term.iftopOpen btop <leader>ir(palette) tools.btop / term.btop
When the underlying binary isn’t on $PATH, the launcher (chord, palette command, or rail chip click) opens a one-line prompt:
htop — interactive process viewer — install via `brew install htop`? [y/N]
Press y (or accept the seeded answer) to spawn the install command in a Pty pane; n / Esc to cancel. On macOS the hint is brew install <pkg>; on Linux sudo apt install -y <pkg>. On Windows the prompt is skipped and a toast prints the hint — the spawn path assumes POSIX ($SHELL -c …). After install finishes, fire the launcher again — the binary check re-runs against the live $PATH.
Action vim standard Command id Ask Claude <leader>aa(palette) ai.askExplain selection / file <leader>ae(palette) ai.explainFix bugs <leader>af(palette) ai.fixRefactor <leader>ar(palette) ai.refactorWrite tests <leader>aw(palette) ai.write_testsMirror live Claude session <leader>am(palette) ai.session_viewClaude Code dock <leader>ac(palette) ai.claude_codeClaude chat (with context) <leader>aC(palette) ai.chatCodex dock <leader>ax(palette) ai.codexMixr DJ split <leader>aM(palette) mixr.showCancel running AI request (palette) (palette) ai.cancelApply suggested change (palette) (palette) ai.applyToggle inline ghost-text suggestions (palette) (palette) ai.toggle_inline_suggestions
Action vim standard Command id Send request <leader>hs(palette) http.sendCopy as curl <leader>hy(palette) http.copy_curlAsk Claude to debug request <leader>hd(palette) http.ai_debugToggle response view (palette) (palette) http.toggle_viewCopy response body (palette) (palette) http.copy_response_body
Action vim standard Command id Open browser (Chrome under CDP) <leader>B(palette) browser.openScreenshot (palette) (palette) browser.screenshotPrint to PDF (palette) (palette) browser.print_pdfCookies (list / edit / add / delete) (palette) (palette) browser.cookies / browser.{edit,add,delete}_cookieStorage (localStorage / sessionStorage) (palette) (palette) browser.storage / browser.{edit,add,delete}_storageNetwork snapshot / diff (palette) (palette) browser.snapshot / browser.diff_snapshotDevice emulation picker (palette) (palette) browser.device_pickerPerformance (Core Web Vitals) (palette) (palette) browser.perfDOM picker (palette) (palette) browser.domURL history picker (palette) (palette) browser.url_history
Action vim standard Command id Pin active file <leader>Ha(palette) harpoon.addMenu / picker over pins <leader>Hm(palette) harpoon.menuJump to pin N (1–9) <leader>1…<leader>9(palette) harpoon.goto_N
Action vim standard Command id Snippet picker <leader>Is(palette) snippet.pickExpand snippet at cursor <leader>IxCtrl+Jsnippet.expand (vim Ctrl+J is INSERT-newline)
Action vim standard Command id PR fuzzy picker (GH + GL + BB + Az) <leader>Pp(palette) pr.pickerRefresh cross-host cache <leader>Pr(palette) pr.refresh
Each chord launches the matching mnml-* sibling binary as a tab. The sibling must be installed and visible to mnml’s integration detector — otherwise the rail chip is hidden.
Sibling vim standard Command id Bitbucket forge viewer <leader>ib(palette) forge.open_bitbucketGitHub forge viewer <leader>ig(palette) forge.open_githubGitLab forge viewer <leader>il(palette) forge.open_gitlabAzure DevOps forge viewer <leader>iz(palette) forge.open_azdevopsJira ticket viewer <leader>ij(palette) forge.open_jiraAWS CodeBuild <leader>ic(palette) forge.open_codebuildAWS CloudWatch Logs <leader>iw(palette) forge.open_cloudwatch_logsAWS Amplify <leader>ia(palette) forge.open_amplifyAWS Lambda <leader>iL(palette) forge.open_lambdaAWS EventBridge <leader>ie(palette) forge.open_eventbridgeAWS RDS <leader>iR(palette) forge.open_rdsAWS ECS <leader>iC(palette) forge.open_ecsAWS ECR <leader>iE(palette) forge.open_ecrAWS Cognito <leader>io(palette) forge.open_cognitoAWS SQS <leader>iq(palette) forge.open_sqsAWS SNS <leader>iN(palette) forge.open_snsAmazon S3 browser <leader>is(palette) forge.open_s3Azure Blob Storage browser <leader>iA(palette) forge.open_azure_blobDynamoDB browser <leader>id(palette) forge.open_dynamodbDatadog <leader>iD(palette) forge.open_datadogButtondown newsletter <leader>iB(palette) forge.open_buttondownSlack browse + post <leader>iS(palette) forge.open_slackMicrosoft Teams <leader>iT(palette) forge.open_teamsMandrill email <leader>iM(palette) forge.open_mandrillDocker containers <leader>iK(palette) forge.open_dockerGmail browse + send <leader>iG(palette) forge.open_gmailCloudflare CDN <leader>iF(palette) forge.open_cloudflarehtop <leader>ih(palette) tools.htopiftop <leader>iI(palette) tools.iftopAdd-integration overlay (rail + chip) (rail + chip) integrations.addRefresh detection cache (palette) (palette) integrations.refresh
Action vim standard Command id Command palette <leader>p / Ctrl+Shift+P / F1Ctrl+Shift+P / F1paletteCheatsheet pane (live) <leader>?(palette) view.cheatsheetHelp overlay F1 (toggle with palette)F1view.helpTheme picker <leader>tt(palette) theme.pickVim ⇄ standard runtime swap <leader>tk / :set input=vim / :set input=standard<leader>tk (via Ctrl+K)editor.toggle_keymapZen mode (hide tree + bufferline + statusline) (palette) Ctrl+Shift+Zview.zenRedraw Ctrl+L(palette) view.redrawWord wrap (palette) (palette) view.toggle_wrapScrollbar (palette) (palette) view.toggle_scrollbarWhitespace render (palette) (palette) view.toggle_whitespaceBracket rainbow (palette) (palette) view.toggle_bracket_rainbowSticky context (palette) (palette) view.toggle_sticky_contextColor column / ruler (palette) (palette) view.toggle_color_columnTrailing whitespace highlight (palette) (palette) view.toggle_highlight_trailing_wsHighlight word under cursor (palette) (palette) view.toggle_highlight_wordRender markdown inline (palette) (palette) view.toggle_render_markdownTODO highlight (palette) (palette) view.toggle_todo_highlightBreadcrumb bar (palette) (palette) view.toggle_breadcrumbBufferline (palette) (palette) view.toggle_bufferlineRelative line numbers (palette) (palette) view.toggle_relative_numbersMarkdown preview <leader>m(palette) markdown.previewRestart mnml (rebuild via run.sh) <leader>r(palette) app.restart
If a chord in this page is wrong or out of date, these are the files that define the truth:
src/whichkey.rs — the <leader> trie (vim mode <space>, standard mode Ctrl+K)
src/input/vim.rs — every vim chord plus the ex-command set
src/input/standard.rs — every standard-mode Ctrl / Alt / arrow chord
src/input/keymap.rs — the global Keymap overlay that resolves chords before they reach the handler
src/command.rs — the canonical command registry (every command id and its default keyspecs)
src/cheatsheet.rs — the in-app cheatsheet pane (always live for your current keymap)