Skip to content

Keyboard Reference

Anatoliy Ivanov edited this page Jul 19, 2026 · 1 revision

Keyboard Reference

Notation and dispatch

  • Ctrl+p is written as <C-p> in keys.config.
  • Shift+Space is written as <S-Space>.
  • Sequences such as gg must be completed within 600 ms.
  • m* means m followed by one character. '* means ' followed by one character.
  • Letter and punctuation shortcuts use physical US-key positions where possible, including on non-Latin layouts.
  • Bindings use Ctrl, not Cmd/Meta. Alt and Meta/Cmd shortcuts are left to the operating system.

Only the top input context is active. If it has no matching binding, the global map is checked. An active-context binding wins over the same global chord.

Plain one-character shortcuts are ignored while typing in an input, textarea, or editable element. Named keys and Ctrl chords can still dispatch. In dialogs, : and / are deliberately ignored rather than opening global overlays.

Global fallback

Key Command ID Action
<C-b> view.toggleTree Toggle the file tree
: palette.open Open the command palette
/ search.open Search the current note
<C-p> document.quickOpen Open quick open
<C-n> tree.createNoteAtCurrent Create a note beside the current note

These bindings can work inside other contexts when that context does not claim the same chord and focus is not suppressing it.

Document context

Key Command ID Action
j document.scrollLineDown Scroll down
k document.scrollLineUp Scroll up
h document.scrollLeft Scroll left
l document.scrollRight Scroll right
<C-d> / Space document.scrollHalfDown Scroll half a viewport down
<C-u> / <S-Space> document.scrollHalfUp Scroll half a viewport up
gg document.scrollToTop Go to top
G document.scrollToBottom Go to bottom
n document.nextMatch Next search match
N document.prevMatch Previous search match
s caret.toggle Enter caret mode
: palette.open Open command palette
/ search.open Search current note
o document.outline Open heading outline
b document.links Open links panel
<C-e> editor.open Open current note in editor
= / F9 zoom.fitWidth Fit document width
F10 zoom.fitContentWidth Fit content width
+ zoom.in Zoom in
- zoom.out Zoom out
Escape document.clearSearch Clear search highlight

Tree context

Key Command ID Action
j / ArrowDown tree.moveDown Select next row
k / ArrowUp tree.moveUp Select previous row
l / ArrowRight tree.expand Expand folder
h / ArrowLeft tree.collapse Collapse folder
zM tree.collapseAll Collapse all folders
zR tree.expandAll Expand all folders
gg tree.selectFirst Select first row
G tree.selectLast Select last row
/ tree.openSearch Filter the tree
Enter tree.openSelection Open selected note or toggle folder
% tree.createNote Create note at selected location
d tree.createDirectory Create directory at selected location
R tree.rename Rename selected entry
mf tree.toggleMark Toggle mark
mu tree.clearMarks Clear all marks
mm tree.moveMarks Move marked entries
D tree.delete Move marked or selected entries to trash
Escape tree.close Close the tree

Tree-search context

Key Command ID Action
j / ArrowDown / <C-n> tree.moveDown Select next result
k / ArrowUp / <C-p> tree.moveUp Select previous result
Enter tree.openSelection Open selected note
Escape tree.closeSearch Leave tree search
Backspace tree.searchBackspace Delete one filter character
Printable character (* internal wildcard) tree.searchAppend Add one filter character

Current caveat: Enter from tree search opens the note but leaves the tree context active. Press Escape to close the remaining tree.

Caret context

Key Command ID Action
h caret.moveLeft Previous rendered character
l caret.moveRight Next rendered character
j caret.moveDown Rendered span below
k caret.moveUp Rendered span above
{ caret.paraBackward Previous paragraph
} caret.paraForward Next paragraph
gg caret.moveToStart Document start
G caret.moveToEnd Document end
<C-d> / Space document.scrollHalfDown Scroll half a viewport down
<C-u> / <S-Space> document.scrollHalfUp Scroll half a viewport up
v caret.enterVisual Enter visual mode
Enter / gd caret.smartJump Follow link under caret
n caret.nextMatch Next search match
N caret.prevMatch Previous search match
m* caret.setMark Set one-letter mark
'* caret.jumpMark Jump to one-letter mark
: palette.open Open command palette
/ search.open Search current note
o document.outline Open heading outline
b document.links Open links panel
<C-e> editor.open Open current note in editor
Escape caret.exit Leave caret mode
= / F9 zoom.fitWidth Fit document width
F10 zoom.fitContentWidth Fit content width
+ zoom.in Zoom in
- zoom.out Zoom out

Visual context

Key Command ID Action
h visual.extendLeft Extend left
l visual.extendRight Extend right
j visual.extendDown Extend down
k visual.extendUp Extend up
{ visual.extendParaBackward Extend to previous paragraph
} visual.extendParaForward Extend to next paragraph
y visual.yank Copy selection and return to caret mode
Escape visual.exit Return to caret mode
: palette.open Open command palette
/ search.open Search current note
o document.outline Open heading outline
<C-e> editor.open Open current note in editor
= / F9 zoom.fitWidth Fit document width
F10 zoom.fitContentWidth Fit content width
+ zoom.in Zoom in
- zoom.out Zoom out

Command palette context

Key Command ID Action
Escape palette.close Close
Enter palette.accept Run selected command
ArrowDown / <C-n> palette.moveNext Select next
ArrowUp / <C-p> palette.movePrevious Select previous

Search context

The current-note and vault-search overlays use the same context map.

Key Command ID Action
Escape search.close Close
Enter search.accept Open selected result
ArrowDown / <C-n> search.moveNext Select next
ArrowUp / <C-p> search.movePrevious Select previous

Quick-open context

Key Command ID Action
Escape quickOpen.close Close
Enter quickOpen.accept Open selected note
ArrowDown / <C-n> quickOpen.moveNext Select next
ArrowUp / <C-p> quickOpen.movePrevious Select previous

Outline context

Key Command ID Action
Escape outline.close Close
Enter outline.accept Jump to selected heading
ArrowDown / j outline.moveNext Select next
ArrowUp / k outline.movePrevious Select previous

Links context

Key Command ID Action
Escape links.close Close
Enter links.accept Open selected linked note
ArrowDown / j links.moveNext Select next
ArrowUp / k links.movePrevious Select previous

Templates context

Key Command ID Action
j / ArrowDown templates.moveNext Select next template
k / ArrowUp templates.movePrevious Select previous template
Enter templates.open Open template in editor
R templates.rename Rename template
D templates.delete Move template to trash
Escape templates.close Close manager

Vault-dialog context

These bindings are internal and cannot be remapped.

Key Command ID Action
Escape / <C-b> vaultDialog.cancel Cancel
Enter vaultDialog.submit Submit
ArrowDown / <C-n> vaultDialog.next Next template choice
ArrowUp / <C-p> vaultDialog.previous Previous template choice
: / / vaultDialog.ignore Do nothing

Palette actions with no default binding

Open these with : or bind their IDs in keys.config:

Command ID Palette title
app.openVault Open vault
app.closeVault Close vault
search.openGlobal Open vault search
zoom.fitPage Fit one page height
templates.manage Manage note templates
theme.useSystem Use system theme
theme.useLight Use light theme
theme.useDark Use dark theme
theme.cycle Cycle theme
cache.clearCurrentVault Clear current vault cache
cache.clearApplication Clear application cache

Sequence behavior

The built-in multi-key forms are:

gg  gd  zM  zR  mf  mu  mm  m*  '*

The first key begins a pending sequence. If the second key is wrong, folea clears the pending sequence and does not retry that second key as a fresh command. For example, g then j does not run normal j movement.

Runtime sequence support is narrower than keys.config parsing. The first event must be a single character. Forms such as gEnter can work, while Enterg and sequences needing more than one pending prefix do not.

Remapping

See Configuration: key remapping. Action and navigation commands are remappable. Internal commands, including vaultDialog.* and tree.searchAppend, are fixed.

Evidence for all default tables: src/renderer/input/bindings/keymaps.ts. Command titles and exposure: src/renderer/input/bindings/app.ts, src/renderer/input/bindings/caret.ts, src/renderer/input/bindings/document.ts, src/renderer/input/bindings/overlays.ts, src/renderer/input/bindings/vault.ts, and src/renderer/input/commands.ts. Sequence behavior: src/renderer/input/dispatcher.ts, src/renderer/input/sequence.ts, and tests/unit/input-dispatch.test.ts.