Skip to content

Coming from VS Code

mnml’s default input mode is standard — modeless, Ctrl-shortcut, typing inserts. If you came in from VS Code, almost every chord in your fingers does the thing you expect. Ctrl+S saves. Ctrl+P opens the file picker. Ctrl+Shift+P opens the command palette. Ctrl+/ toggles a line comment. Ctrl+D adds the next occurrence to a multi-cursor.

What’s different: there’s no Lua extension API, no settings JSON, and the file tree is one of several rails. mnml is a terminal app, so anything VS Code does via Electron-specific affordances (drag-from-system-drop, image preview tabs, side-by-side rich diff) either renders the terminal-native equivalent or doesn’t exist. The job of this page is to point out which chords translate, what the mouse can do, where the keyboard alternative lives, and what isn’t here.

Standard is the default — you don’t have to set anything. If you’ve inherited a ~/.config/mnml/config.toml that flipped you into vim mode, change it back:

~/.config/mnml/config.toml
[editor]
input_style = "standard"

Or runtime-toggle (works from either mode):

:set input=standard

That : ex command works in standard mode too — : is one of the few “vim-isms” that always pops the ex line, regardless of input handler. There’s also a palette command: Ctrl+Shift+Peditor: toggle keymap.

Standard mode has no mode chip. There’s nothing to leave; typing inserts; arrows move; Shift+arrow extends a selection.

The internals — why both modes coexist without scattering if vim {} through the editor — are documented on Editing. You don’t need them to be productive.

These tables cover the chords you reach for instinctively. Source of truth: src/command.rs (built-in defaults) and src/input/standard.rs (the standard handler).

VS CodemnmlNotes
Ctrl+S saveCtrl+SApp-level command; works from every pane
Ctrl+N new fileCtrl+N
Ctrl+O open fileCtrl+Pmnml uses VS-Code’s file picker chord (Cmd+P on macOS), not the OS file dialog
Ctrl+P quick-openCtrl+PFuzzy file picker
Ctrl+Shift+P command paletteCtrl+Shift+PAlso F1
Ctrl+W close tabCtrl+WCloses the active buffer
Ctrl+Shift+T reopen closedCtrl+Shift+T
Ctrl+Tab last bufferCtrl+TabAlso Ctrl+6 (vim alias)
Ctrl+PageDown / PageUp next/prev tabCtrl+PageDown / PageUp
Alt+1Alt+9 jump to tab NAlt+1Alt+9
Ctrl+B toggle sidebarCtrl+BToggles the file tree / activity rail
Ctrl+, settingsCtrl+,Opens the schema-driven settings overlay

Ctrl+R is mapped to picker.recent (recent files / workspaces), not to “reload window” — VS Code’s reload doesn’t have an analog here; mnml’s <leader>r (in vim mode) or the app: restart palette command does the same thing.

VS Codemnml
Ctrl+A select allCtrl+A
Ctrl+C / Ctrl+X / Ctrl+VCtrl+C / Ctrl+X / Ctrl+V (system clipboard)
Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y undo / redoAll three present (Ctrl+Y is redo too)
Ctrl+/ toggle line commentCtrl+/
Ctrl+] / Ctrl+[ indent / dedentCtrl+] / Ctrl+[ (standard-mode override of bracket-match); Tab / Shift+Tab also indents a selection
Alt+↑ / Alt+↓ move lineAlt+↑ / Alt+↓ (also Alt+J / Alt+K)
Shift+Alt+↓ duplicate lineCtrl+Shift+D (mnml’s chord); Shift+Alt+↓ doesn’t currently fire
Ctrl+Shift+K delete lineCtrl+Shift+K
Ctrl+Enter open line belowCtrl+Enter
Ctrl+Shift+Enter open line aboveCtrl+Shift+Enter
Ctrl+L select lineCtrl+L
Ctrl+D add next occurrenceCtrl+D
Ctrl+Shift+L select all occurrencesCtrl+Shift+L
Ctrl+Alt+↓ / add cursor below / aboveCtrl+Alt+↓ / (also Ctrl+Alt+J / K)
Esc collapse selection / cursorsEsc
Home / End smart line navHome / End (smart-home: first non-whitespace, then col 0)
Ctrl+Home / End file start / endCtrl+Home / End
Ctrl+G go to lineCtrl+G
Ctrl+← / Ctrl+→ word motionCtrl+← / Ctrl+→ (Shift extends)
Ctrl+Backspace / Delete word-deleteBoth present

Modifier-leak guard. Adding Alt to any Ctrl chord (so Ctrl+Alt+X, Ctrl+Alt+A, etc.) is silently ignored — it does NOT fire the bare-Ctrl variant. macOS keyboards emit Ctrl+Alt+* for OS-level shortcuts and the leak used to cut/select/save by accident. Fixed; explicit !alt guards on every Ctrl arm.

VS Codemnml
Ctrl+F find in fileCtrl+F
F3 / Shift+F3 next / prev matchF3 / Shift+F3
Alt+R toggle regex in findAlt+R
Ctrl+H find + replaceCtrl+H
Ctrl+Shift+F workspace searchCtrl+Shift+F (graphical grep pane)

mnml’s LSP surface mirrors VS Code closely. See LSP for the full story.

VS Codemnml
F12 goto definitionF12
Ctrl+Space trigger completionCtrl+Space
Ctrl+. quick-fix / code actionsCtrl+.
Alt+Enter quick-fix (JetBrains alias)Alt+Enter
Alt+Shift+O organize importsAlt+Shift+O
Ctrl+Shift+I format documentCtrl+Shift+I
Ctrl+Shift+O symbols in fileCtrl+Shift+O
Hover popup (mouse)Hover with mouse, or :Hover ex command
F2 rename symbolF2

Ctrl+click for goto-definition works — mouse-over a symbol with Ctrl/Cmd held, click, mnml fires lsp.goto_definition on the symbol under the cursor. Alt+← / Alt+→ walk the jump history.

The bufferline is the row of file tabs across the top of the editor. mnml supports both VS-Code-style click-and-drag and keyboard navigation.

Mouse actionResult
Left-click tabFocus that buffer
Middle-click tabClose that buffer
Drag tabReorder (drop slot is computed live during drag)
Right-click tabContext menu — Close, Close others, Close all, etc.
Click the × on a tabClose that tab
Click the + (right edge)New empty buffer

Keyboard equivalents are all in the file-ops table above.

VS Codemnml
Ctrl+\ split editorCtrl+\
Drag split dividerClick + drag the divider
Click in a pane to focusClick in the pane
Close active editor groupPalette: view: close split

mnml’s split chord story is in vim’s Ctrl-W prefix — Ctrl-W v / Ctrl-W s, then Ctrl-W h/j/k/l to navigate. Even in standard mode, those work (the Ctrl-W prefix is global). The leader equivalents (<leader>sv / <leader>ss / <leader>sh/sj/sk/sl) need the leader chord (Ctrl+K in standard mode) — see the leader section below.

Mouse actionResult
Click file in treeOpen in preview (italic tab)
Double-click file in treeOpen + pin (regular tab)
Click folderExpand / collapse
Right-click tree nodeContext menu (rename, delete, new file, new folder, reveal in OS)
Click + chip on a sectionAdd — workspace, integration, etc.
Click integration iconLaunch that sibling pane
Hover any chipTooltip — what is this, what’s its state

Keyboard: Ctrl+B toggles the tree. Ctrl+Shift+E focuses the tree from anywhere. Once focused, arrow keys / j k navigate, Enter opens, Space previews, / filters, n creates a new file, Esc returns to the editor.

Ctrl+Shift+P (or F1) opens the palette. Every command — every chord, every ex command, every plugin action — is searchable here by name. Type to filter, walk results, Enter runs, Esc closes.

The palette also reads:

  • Recent commandsCtrl+R lists recently-run commands
  • Palette bar — there’s an optional always-visible search chip in the bufferline ([ui] palette_bar_visible = true); clicking it is the same as Ctrl+Shift+P

The Sublime / VS Code idiom is exactly the same:

ActionChord
Add cursor at next occurrenceCtrl+D
Skip current + add next(palette: editor: skip occurrence)
Select all occurrencesCtrl+Shift+L
Column cursors above / belowCtrl+Alt+↑ / (also Ctrl+Alt+K / J)
Cursor at mouse clickAlt+click
Box selection (column)Shift+Alt+drag
Collapse to single cursorEsc

All cursors apply edits in parallel — type and every cursor inserts, Backspace and every cursor deletes.

Standard VS Code keys all work; see LSP for the language-server side.

VS Codemnml
F5 start / continueF5 continue (run)
Shift+F5 stop / step-out-of-continueShift+F5 continue (no separate stop)
F9 toggle breakpointF9
Shift+F9 conditional breakpointShift+F9
F10 step overF10
F11 step intoF11
Shift+F11 step outShift+F11
VS Codemnml
Ctrl+backtick“ open terminalCtrl+backtick“ — scratch terminal toggle. (Ctrl+\ used to also fire this; today it’s view.split_right for VS Code parity.)
Ctrl+T (not bound by default)Ctrl+T opens / focuses a shell pane

Ctrl+J expands a snippet at the cursor (the snippet-expand chord; VS Code uses Tab after typing a snippet trigger, mnml also accepts Tab from the completion popup but Ctrl+J is the explicit chord).

VS Codemnml
Ctrl+Shift+Z zen modeCtrl+Shift+Z zen mode (full-screen single buffer)
Alt+← / Alt+→ go-back / go-forwardAlt+← / Alt+→ (mnml navigation history)
Ctrl+L (terminal clear)Ctrl+L is SelectLine in editor — for terminal-clear, use a shell pane (Ctrl+L is forwarded)
Ctrl+Q quitCtrl+Q

Hover any tree-rail integration chip, any statusline chip (workspace, branch, mixr now-playing, …), any tab badge, any gutter column — a tooltip explains what you’re looking at and its current state. Move the cursor off and the tooltip dismisses. Move to another chip and it swaps cleanly (no stale tooltip overlap).

mnml’s vim mode has a leader trie under <space>. In standard mode the entry chord is Ctrl+K. The trie is the same — same continuations, same commands. Press Ctrl+K, then the next key paints a which-key popup. Try:

  • Ctrl+K p → command palette (same as Ctrl+Shift+P)
  • Ctrl+K g s → git status / staging pane
  • Ctrl+K l d → goto definition (LSP)
  • Ctrl+K a c → open Claude Code
  • Ctrl+K ? → cheatsheet pane (every chord, searchable)

You can ignore the leader entirely if it doesn’t fit how you think — every leader action has a palette command and a chord. But it’s there as a discoverable “rich menu” that most VS Code users haven’t met.

The full leader map is documented on Coming from NvChad — same trie, same content.

Honest list of places where VS Code muscle memory doesn’t translate cleanly.

Wired today — both chords land. Ctrl+Shift+D still works and keeps the cursor on the original line; the Shift+Alt variant matches VS Code by landing the cursor on the new copy.

Ctrl+, opens a settings overlay (a sectioned keyboard-driven list, not a JSON file). The on-disk source of truth is TOML at ~/.config/mnml/config.toml. You can edit either; both ends up at the same state.

A per-workspace overlay at <workspace>/.mnml/config.toml is the equivalent of VS Code’s workspace settings.

mnml’s plugin model is two parts: registered commands (built-in, in src/command.rs) and out-of-process sibling binaries launched as Pty panes via :term <binary>. The > INTEGRATIONS section of the file tree shows installed siblings; click + to browse + install more. No marketplace, no signing, no auto-updates pushed at you. See Installing integrations.

Built-in things VS Code does via extensions

Section titled “Built-in things VS Code does via extensions”
  • Git — built-in. Status pane, diff pane, blame, commit graph, AI-generated commit messages. See Git.
  • HTTP client — built-in .http / .curl / .rest files with Send chord. See HTTP client.
  • Test runner — built-in via the test pane (palette: test: run all etc.).
  • AI — built-in Claude Code + Claude chat + Codex panes. See AI panes.
  • Debugger (DAP) — built-in, F5 / F9 / F10 / F11 work.
  • Browser via CDP<leader>B opens Chrome via the DevTools Protocol with a coupled live-preview pane.

You don’t install REST Client, GitLens, GitHub Copilot, Thunder Client. They’re all in the box.

The right-click context menu on a tab covers Close, Close others, Close all. “Pin tab” isn’t a state today — preview tabs (italic) become pinned (regular) on first edit, automatically. If you want to keep a file open without pinning, just don’t edit it.

The tree is read-only-for-position. Right-click → rename to move a file. Drag-and-drop reorder for files isn’t a feature.

VS Code’s keyboard-shortcuts editor doesn’t exist. To see every chord, open the cheatsheet pane:

:cheatsheet

…or Ctrl+K ? (leader → ?), or palette → view: cheatsheet (all chords).

To rebind, edit [keys.global] in ~/.config/mnml/config.toml. The remapping surface is still under construction — built-in defaults cover the common chords, but a full [keys.standard] overlay isn’t there yet.

In VS Code, Ctrl+S saves the focused editor — and does nothing on most other surfaces. In mnml, Ctrl+S is an App command (not handler-level), so it fires from any pane that supports saving. From a non-saveable pane (git status, terminal, integration sibling) it no-ops silently.

A 60-second path from “fresh install” to “I can work like I did in VS Code.”

  1. Launch in your workspace — no config needed; standard is the default:

    Terminal window
    mnml ~/some/project
  2. Try Ctrl+P — file picker opens. Type, Enter, file opens.

  3. Try Ctrl+Shift+P — command palette. Type “settings”, Enter, the settings overlay opens. (Or just hit Ctrl+,.)

  4. Try Ctrl+B — toggle the file tree. Click around. Right-click for context menus.

  5. Hit Ctrl+S to save anything you touched. The dirty dot on the tab clears.

You’re in. Treat the leader chord (Ctrl+K) as a nice-to-have — your existing chord vocabulary covers the day-to-day.

  • Editing — the architectural framing, the EditOp model, multi-cursor specifics
  • Settings & configuration — TOML schema, the settings overlay, every config knob
  • LSP — language servers, completion, code actions, refactors
  • Git — built-in git surface (status, diff, blame, AI commits)
  • Coming from NvChad — the other half of the migration story, for vim teammates
  • Installing integrations — adding sibling viewers (forge, AWS, observability)