Skip to content

All chords

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.
ActionvimstandardCommand 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.files
Open recent pickerCtrl+RCtrl+Rpicker.recent
Save<leader>w / :w / Ctrl+SCtrl+Sfile.save
Save all:wa / :wallfile.save_all
Save as (copy):saveas <path>(vim ex only)
Reload from disk:reload(palette)file.reload
Close buffer<leader>q / <leader>bd / :bdCtrl+Wbuffer.close
Reopen closed buffer<leader>brCtrl+Shift+Tbuffer.reopen
Open settings TOMLCtrl+,Ctrl+,file.open_settings
Open settings overlay(palette)(palette)view.settings
ActionvimstandardCommand id
Next buffer:bn / <leader>bnCtrl+PageDownbuffer.next
Previous buffer:bp / <leader>bpCtrl+PageUpbuffer.prev
Last buffer (toggle)Ctrl+6Ctrl+Tab / Ctrl+6buffer.last
Buffer picker:b <name>Ctrl+Ppicker.buffers / picker.files
List buffers:ls / :buffers(palette)picker.buffers
New tab page:tabnew / :tabe(palette)tab.new
Next tabgt / :tabnext(palette)tab.next
Previous tabgT / :tabprev(palette)tab.prev
First / last tab:tabfirst / :tablast(palette)tab.first / tab.last
Close tab:tabclose(palette)tab.close
Close other tabs:tabonly(palette)tab.only
Focus tab N<leader>1<leader>9 (harpoon)Alt+1Alt+9tab.goto_N
ActionvimstandardCommand id
Split right (vertical)<leader>sv / :vsp / Ctrl+W vCtrl+\ / Ctrl+K Svview.split_right
Split down (horizontal)<leader>ss / :sp / Ctrl+W sCtrl+K Ssview.split_down
Focus leftCtrl+W h / <leader>shCtrl+K Shview.focus_left
Focus downCtrl+W j / <leader>sjCtrl+K Sjview.focus_down
Focus upCtrl+W k / <leader>skCtrl+K Skview.focus_up
Focus rightCtrl+W l / <leader>slCtrl+K Slview.focus_right
Cycle focusCtrl+W w / <leader>swCtrl+K Swview.focus_next_split
Close splitCtrl+W c / <leader>scCtrl+K Scview.close_split
Close other splitsCtrl+W o / :only / <leader>soCtrl+K Soview.close_others
Equalize splitsCtrl+W =(palette)view.equalize_splits
Maximize heightCtrl+W _(palette)view.maximize_height
Maximize width`Ctrl+W`(palette)
Grow / shrink heightCtrl+W + / Ctrl+W -(palette)view.split_grow_height / view.split_shrink_height
Grow / shrink widthCtrl+W > / Ctrl+W <(palette)view.split_grow_width / view.split_shrink_width
Rotate splitsCtrl+W r(palette)view.rotate_splits
Move split directionCtrl+W H/J/K/L(palette)view.move_split_*
Promote split to tabCtrl+W T(palette)view.move_to_new_tab
Split + go to defCtrl+W d(palette)view.split_goto_definition
Split + open path under cursorCtrl+W f / gf(palette)view.split_open_file_under_cursor
Split + scratch bufferCtrl+W n(palette)view.split_new_scratch
ActionvimstandardCommand id
Toggle file rail<leader>e / <leader>teCtrl+Bview.toggle_tree
Focus file rail(palette)Ctrl+Shift+Eview.focus_tree
Cycle focus tree ⇄ editorCtrl+ECtrl+Efocus.cycle
Toggle hidden files (focused tree)<leader>th(palette)view.toggle_hidden
Toggle hidden files (all trees)<leader>tH(palette)view.toggle_hidden_all
Reveal active file(palette)(palette)view.reveal_active
Toggle right side panel:set rightpanel!Ctrl+Shift+Bview.toggle_right_panel
Open 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 / …):

Shift+F10 on a tree row opens the tree context menu; with the editor focused it opens the bufferline tab menu

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.

ActionvimstandardCommand id / source
Left / right / up / downh / l / k / j / / / edit_op::Move*
Word forward / backw / b (variants e, ge, W, B, E)Ctrl+→ / Ctrl+←edit_op::MoveWord*
Line start / end0 / ^ / $ / g_Home / Endedit_op::MoveLine{Start,End}
Buffer start / endgg / GCtrl+Home / Ctrl+Endedit_op::MoveBuffer{Start,End}
Page up / downCtrl+B / Ctrl+FPageUp / PageDownedit_op::Page{Up,Down}
Half-page up / downCtrl+U / Ctrl+Dvim.rs
Go to line NnG / :NCtrl+Geditor.goto_line
Viewport top / middle / bottomH / M / L(palette)view.move_cursor_view_*
Scroll cursor to top / middle / bottomzt / zz / zb(palette)view.cursor_to_*
Scroll one line up / downCtrl+Y / Ctrl+E(palette)view.scroll_buffer_*
Horizontal scrollzh / zl / zH / zL(palette)view.hscroll_*
Char find on linef<c> / F<c> / t<c> / T<c> / ; / ,vim.rs
Matching bracket%(palette)editor.bracket_match
Paragraph / sentence nav{ / } / ( / )vim.rs
Last jump'' / vim.rs
Jumplist back / forwardCtrl+O / Ctrl+IAlt+← / Alt+→nav.back / nav.forward
Changelist back / forwardg; / g,(palette)editor.jump_{prev,next}_edit
ActionvimstandardCommand id
Cutd / dd / D / x (vim operators)Ctrl+Xedit_op::CutSelection
Copy / yanky / yy / YCtrl+Cedit_op::YankSelection / YankLine
Pastep / PCtrl+Vedit_op::Paste
UndouCtrl+Zedit_op::Undo
RedoCtrl+RCtrl+Shift+Z / Ctrl+Yedit_op::Redo
Select allggVGCtrl+Aedit_op::SelectAll
Select lineVCtrl+Ledit_op::SelectLine
Add cursor at next word match(operator-pending)Ctrl+Deditor.add_cursor_at_next_word
Select all occurrences(palette)Ctrl+Shift+Leditor.select_all_occurrences
Delete lineddCtrl+Shift+Keditor.delete_line
Duplicate lineyypCtrl+Shift+D / Shift+Alt+Down (down) / Shift+Alt+Up (up)edit_op::DuplicateLine
Move line up / down(palette)Alt+↑ / Alt+↓ (also Alt+K / Alt+J)editor.move_line_{up,down}
Indent / outdent>> / << / > / < (operators)Tab / Shift+Tabedit_op::Indent / Outdent
Toggle line commentCtrl+/Ctrl+/edit_op::ToggleLineComment
Insert line below / aboveo / OCtrl+Enter / Ctrl+Shift+Enter(custom)
Delete word left / right(operator-pending)Ctrl+Backspace / Ctrl+Deleteedit_op::DeleteWordLeft / DeleteWordRight
Reflow paragraphgq / gqq / gqap / gqip(palette)editor.reflow_paragraph
Join lines (with / without space)J / gJ(palette)vim.rs
Case toggle / upper / lower~ / gU / gu(palette)vim.rs
Add cursor above / below(palette)Ctrl+Alt+↑ / Ctrl+Alt+↓ (also Ctrl+Alt+K / Ctrl+Alt+J)editor.add_cursor_{above,below}
Clear extra cursorsEsc (drops selection too)Esceditor.clear_extra_cursors
Dot repeat.vim.dot_repeat
Macros: record / replayqa…q / @a / @@ / n@avim.macro_{toggle,replay}
Named registers"ay / "ap / "+y / "+p / "0pvim.rs
Marks: set / jumpma / 'a / `avim.rs
Char info / utf-8 infoga / g8(palette)editor.char_info / editor.char_utf8
File info / statsCtrl+G / g Ctrl+G(palette)editor.file_info / editor.file_stats
Repeat last :s& / :&editor.repeat_last_substitute
Toggle foldza(palette)editor.toggle_fold
Unfold allzR(palette)editor.unfold_all
Fold all (LSP ranges)(palette)(palette)lsp.fold_all

These are operator-pending objects — type them after d, c, y, v, etc.

ObjectChordNotes
Word (inner / around)iw / aw
Bracket / paren / quote (inner / around)i( / a( / i" / a"also i{, i[, i<, i', i`
Paragraphip / ap
Sentenceis / as
Function (tree-sitter)if / af
Class (tree-sitter)ic / ac
Parameter / argument (tree-sitter)ia / aa
Conditional (tree-sitter)ii / ai
ActionvimstandardCommand id
Find forward (prompt)/Ctrl+Ffind.find
Find backward (prompt)?(palette)find.find_backward
Next / prev matchn / NF3 / Shift+F3find.next / find.prev
Word under cursor (forward / back)* / #(palette)find.word_{forward,backward}
Partial word under cursorg* / g#(palette)vim.rs
Select next / prev matchgn / gN(palette)find.select_match_{forward,backward}
Clear find highlight:noh / :nohlsearch(palette)find.clear
Toggle regex (in find prompt)Alt+RAlt+Rfind.toggle_regex
Replace (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.grep
Replace across workspace(results pane)(results pane)find.grep_replace
Quickfix next / prev:cn / :cp(palette)qf.next / qf.prev
Quickfix first / last:cfirst / :clast(palette)qf.first / qf.last
Open / close quickfix pane:copen / :cclose(palette)vim.rs
ActionvimstandardCommand id
Code action<leader>laCtrl+.lsp.code_action
Apply first quick fix(palette)Alt+Enterlsp.quick_fix
Trigger completion<leader>lc / Ctrl+SpaceCtrl+Spacelsp.completion
Symbols in file<leader>lsCtrl+Shift+Olsp.symbols
Workspace symbols<leader>lS(palette)lsp.workspace_symbols
Outline pane<leader>lo(palette)outline.show
Go to definitiongd / <leader>ld / F12F12lsp.goto_definition
Go to declarationgD(palette)lsp.goto_declaration
Go to implementation(palette)(palette)lsp.goto_implementation
Hover docsK / <leader>lh(palette)lsp.hover
Find referencesgr / <leader>lr(palette)lsp.references
Rename symbol<leader>lR / F2F2lsp.rename
Diagnostics list<leader>le(palette)lsp.diagnostics
Next / prev diagnostic<leader>ln / <leader>lp(palette / Ctrl+K leader)lsp.next_diagnostic / lsp.prev_diagnostic
Format documentCtrl+Shift+ICtrl+Shift+Ilsp.format (falls back to editor.format)
Organize importsAlt+Shift+OAlt+Shift+Olsp.organize_imports
Open URL under cursor (OS browser)gx(palette)editor.open_url_at_cursor
Open path under cursorgf(palette)editor.open_at_cursor
ActionvimstandardCommand id
Status / staging pane<leader>gs(palette)git.status_pane
Commit (editor for staged)<leader>gc(palette)git.commit
AI (Claude) commit message<leader>gm(palette)git.ai_commit
AI rewrite HEAD message<leader>gM(palette)git.ai_recompose
Codex commit message<leader>gx(palette)git.codex_commit
Blame toggle<leader>gb(palette)git.blame_toggle
Diff active file<leader>gd(palette)git.diff_file
Diff worktree<leader>gD(palette)git.diff
Diff all vs HEAD<leader>gA(palette)git.diff_all
Peek change at cursor<leader>gp(palette)git.peek_change
Commit graph (DAG)<leader>gl(palette)git.graph
Checkout branch<leader>go(palette)git.checkout
New branch<leader>gn(palette)git.new_branch
Worktrees → shell<leader>gw(palette)git.worktrees
Stash (with optional msg)<leader>gS(palette)git.stash
Stash pop<leader>gP(palette)git.stash_pop
Next / prev change hunk]c / [c(palette)git.jump_next_change / git.jump_prev_change
Next / prev file in diff]f / [f(palette)git.diff_next_file / git.diff_prev_file
Push(palette)(palette)git.push
Pull (--ff-only)(palette)(palette)git.pull
Fetch (--all --prune)(palette)(palette)git.fetch
Reflog picker(palette)(palette)git.reflog
File history(palette)(palette)git.file_history
Open in remote (host browser)(palette)(palette)git.browse
Cherry-pick (from graph)(palette)(palette)git.cherry_pick
Revert (from graph)(palette)(palette)git.revert
Undo / redo last commit(palette)(palette)git.undo / git.redo
Tag / push tags / delete tag(palette)(palette)git.tag / git.push_tags / git.tag_delete
ActionvimstandardCommand id
Run task<leader>o(palette)task.run
Run all tests<leader>Ta(palette)test.run_all
Run tests in this file<leader>Tf(palette)test.run_file
Run test at cursor<leader>Tt(palette)test.run_at_cursor
Rerun last-failed<leader>Tl(palette)test.rerun_failed
Heal failing test (Claude)<leader>Th(palette)test.heal
Flaky / wobbly dashboard<leader>Tw(palette)flaky.show
ActionvimstandardCommand id
Start debuggingF5F5dap.run
ContinueShift+F5Shift+F5dap.continue
Toggle breakpointF9F9dap.toggle_breakpoint
Conditional breakpointShift+F9Shift+F9dap.toggle_breakpoint_conditional
Step over / into / outF10 / F11 / Shift+F11F10 / F11 / Shift+F11dap.next / dap.step_in / dap.step_out
Pause(palette)(palette)dap.pause
Debug console (REPL)(palette)(palette)dap.repl
Watch expressions(palette)(palette)dap.{add,remove,clear}_watch
Reverse continue / step back(palette)(palette)dap.reverse_continue / dap.step_back
Attach to process(palette)(palette)dap.attach
Set hit-count / exception breakpoints(palette)(palette)dap.set_breakpoint_hit_count / dap.exceptions
ActionvimstandardCommand id
Scratch terminal toggle (bottom strip)Ctrl+`Ctrl+`term.scratch_toggle
Focus 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.shell
Rename 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.

ActionvimstandardCommand id
Open htop<leader>ih(palette)tools.htop / term.htop
Open iftop<leader>iI(palette)tools.iftop / term.iftop
Open 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.

ActionvimstandardCommand id
Ask Claude<leader>aa(palette)ai.ask
Explain selection / file<leader>ae(palette)ai.explain
Fix bugs<leader>af(palette)ai.fix
Refactor<leader>ar(palette)ai.refactor
Write tests<leader>aw(palette)ai.write_tests
Mirror live Claude session<leader>am(palette)ai.session_view
Claude Code dock<leader>ac(palette)ai.claude_code
Claude chat (with context)<leader>aC(palette)ai.chat
Codex dock<leader>ax(palette)ai.codex
Mixr DJ split<leader>aM(palette)mixr.show
Cancel running AI request(palette)(palette)ai.cancel
Apply suggested change(palette)(palette)ai.apply
Toggle inline ghost-text suggestions(palette)(palette)ai.toggle_inline_suggestions
ActionvimstandardCommand id
Send request<leader>hs(palette)http.send
Copy as curl<leader>hy(palette)http.copy_curl
Ask Claude to debug request<leader>hd(palette)http.ai_debug
Toggle response view(palette)(palette)http.toggle_view
Copy response body(palette)(palette)http.copy_response_body
ActionvimstandardCommand id
Open browser (Chrome under CDP)<leader>B(palette)browser.open
Screenshot(palette)(palette)browser.screenshot
Print to PDF(palette)(palette)browser.print_pdf
Cookies (list / edit / add / delete)(palette)(palette)browser.cookies / browser.{edit,add,delete}_cookie
Storage (localStorage / sessionStorage)(palette)(palette)browser.storage / browser.{edit,add,delete}_storage
Network snapshot / diff(palette)(palette)browser.snapshot / browser.diff_snapshot
Device emulation picker(palette)(palette)browser.device_picker
Performance (Core Web Vitals)(palette)(palette)browser.perf
DOM picker(palette)(palette)browser.dom
URL history picker(palette)(palette)browser.url_history
ActionvimstandardCommand id
Pin active file<leader>Ha(palette)harpoon.add
Menu / picker over pins<leader>Hm(palette)harpoon.menu
Jump to pin N (1–9)<leader>1<leader>9(palette)harpoon.goto_N
ActionvimstandardCommand id
Snippet picker<leader>Is(palette)snippet.pick
Expand snippet at cursor<leader>IxCtrl+Jsnippet.expand (vim Ctrl+J is INSERT-newline)
ActionvimstandardCommand id
PR fuzzy picker (GH + GL + BB + Az)<leader>Pp(palette)pr.picker
Refresh 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.

SiblingvimstandardCommand id
Bitbucket forge viewer<leader>ib(palette)forge.open_bitbucket
GitHub forge viewer<leader>ig(palette)forge.open_github
GitLab forge viewer<leader>il(palette)forge.open_gitlab
Azure DevOps forge viewer<leader>iz(palette)forge.open_azdevops
Jira ticket viewer<leader>ij(palette)forge.open_jira
AWS CodeBuild<leader>ic(palette)forge.open_codebuild
AWS CloudWatch Logs<leader>iw(palette)forge.open_cloudwatch_logs
AWS Amplify<leader>ia(palette)forge.open_amplify
AWS Lambda<leader>iL(palette)forge.open_lambda
AWS EventBridge<leader>ie(palette)forge.open_eventbridge
AWS RDS<leader>iR(palette)forge.open_rds
AWS ECS<leader>iC(palette)forge.open_ecs
AWS ECR<leader>iE(palette)forge.open_ecr
AWS Cognito<leader>io(palette)forge.open_cognito
AWS SQS<leader>iq(palette)forge.open_sqs
AWS SNS<leader>iN(palette)forge.open_sns
Amazon S3 browser<leader>is(palette)forge.open_s3
Azure Blob Storage browser<leader>iA(palette)forge.open_azure_blob
DynamoDB browser<leader>id(palette)forge.open_dynamodb
Datadog<leader>iD(palette)forge.open_datadog
Buttondown newsletter<leader>iB(palette)forge.open_buttondown
Slack browse + post<leader>iS(palette)forge.open_slack
Microsoft Teams<leader>iT(palette)forge.open_teams
Mandrill email<leader>iM(palette)forge.open_mandrill
Docker containers<leader>iK(palette)forge.open_docker
Gmail browse + send<leader>iG(palette)forge.open_gmail
Cloudflare CDN<leader>iF(palette)forge.open_cloudflare
htop<leader>ih(palette)tools.htop
iftop<leader>iI(palette)tools.iftop
Add-integration overlay(rail + chip)(rail + chip)integrations.add
Refresh detection cache(palette)(palette)integrations.refresh
ActionvimstandardCommand id
Command palette<leader>p / Ctrl+Shift+P / F1Ctrl+Shift+P / F1palette
Cheatsheet pane (live)<leader>?(palette)view.cheatsheet
Help overlayF1 (toggle with palette)F1view.help
Theme picker<leader>tt(palette)theme.pick
Vim ⇄ standard runtime swap<leader>tk / :set input=vim / :set input=standard<leader>tk (via Ctrl+K)editor.toggle_keymap
Zen mode (hide tree + bufferline + statusline)(palette)Ctrl+Shift+Zview.zen
RedrawCtrl+L(palette)view.redraw
Word wrap(palette)(palette)view.toggle_wrap
Scrollbar(palette)(palette)view.toggle_scrollbar
Whitespace render(palette)(palette)view.toggle_whitespace
Bracket rainbow(palette)(palette)view.toggle_bracket_rainbow
Sticky context(palette)(palette)view.toggle_sticky_context
Color column / ruler(palette)(palette)view.toggle_color_column
Trailing whitespace highlight(palette)(palette)view.toggle_highlight_trailing_ws
Highlight word under cursor(palette)(palette)view.toggle_highlight_word
Render markdown inline(palette)(palette)view.toggle_render_markdown
TODO highlight(palette)(palette)view.toggle_todo_highlight
Breadcrumb bar(palette)(palette)view.toggle_breadcrumb
Bufferline(palette)(palette)view.toggle_bufferline
Relative line numbers(palette)(palette)view.toggle_relative_numbers
Markdown preview<leader>m(palette)markdown.preview
Restart 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)