Astrolabe Documentation العربية GitHub

Keymap

Every keyboard binding, and why the awkward ones are where they are.


A binding is a key (or a chord of keys, like Ctrl/Cmd P) that does one thing in the app. Ctrl/Cmd / opens the in-app shortcut sheet: every binding, grouped and searchable, in whichever language the instance is in. Inside the sheet, ↑ and ↓ walk the rows that can be run (Home / End jump to the ends), Enter runs the lit row and Esc closes. Typing keeps filtering, and the cursor starts on the best match, so "graph" then Enter is the whole gesture. This page is the same list on paper.

Literally the same list. The tables between here and Menus, gestures and the pointer are a RENDERING of the GROUPS table in client/components/ShortcutsHelp.tsx, and npm run check-keymap fails the build when the two stop agreeing, in either direction. A binding exists in one place, and a key documented here that nothing binds is as much a bug as a key nobody documented. The same gate is what refuses two rows claiming one keystroke; see Development.

Shell

KeysAction
Ctrl/Cmd /Keyboard shortcuts — every binding, grouped and searchable
Ctrl/Cmd PCommand palette (open note, run command)
Ctrl/Cmd KSearch — focuses the sidebar search in the app; opens a centered search overlay on the public blog
Ctrl/Cmd EToggle reading view ⇄ editor
Ctrl/Cmd GOpen the graph tab, or close it
Ctrl/Cmd NNew note
Ctrl/Cmd Alt DOpen today's daily note (folder and name format in Settings → Writing; daily/YYYY-MM-DD.md by default)
Ctrl/Cmd Alt Shift DOpen Today — the day's note, the sigils, cards and tasks due, and on this day, on one page; the third verb of the same idea
Ctrl/Cmd Shift DQuick capture — a line into today's note (or the inbox) without leaving the one you are in; Shift beside the daily note's Alt, because they are one idea with two verbs
Ctrl/Cmd Alt LSwitch to the note's linguistic twin — its other face, in the same tab; L for language
Ctrl/Cmd Alt Shift LSwitch the interface to the other language (English ⇄ العربية) — the chrome, not the note; works with a dialog open. The same as the status bar's language key (Arabic & RTL)
Ctrl/Cmd Shift PPublish / unpublish the open note
Ctrl/Cmd Alt PPrint the open note, or export it to PDF — Alt because Ctrl/Cmd P is the palette
Ctrl/Cmd Shift BBookmark the open note, or take the bookmark off (Bookmarks.md)
Ctrl/Cmd Alt BCollapse / reopen the Notes sidebar
Ctrl/Cmd Alt Shift BCollapse / reopen Outline & backlinks
Ctrl/Cmd Shift .Read the selection aloud — in the editor, the reading view, a book or a feed item; the period because a sentence ends there
Ctrl/Cmd Shift ZZen mode — all chrome steps aside (Esc returns)
Ctrl/Cmd \Split the pane — the new one opens on the same note
Ctrl/Cmd Shift \Split downwards instead of beside
Ctrl/Cmd Alt \Close the pane — its tabs are adopted by a neighbour, never dropped
Ctrl/Cmd Alt PageDown / PageUpNext / previous tab in the focused pane
Ctrl/Cmd Alt WClose this tab
Ctrl/Cmd Alt Shift ↑ / ↓Move to the pane above / below
Ctrl/Cmd Alt Shift ← / →Move to the pane on your left / right — physically, in both languages
← / →Previous / next file in the attachment viewer
EscOut of the shortcut sheet, out of visitor preview, out of zen, out of the attachment viewer, and back to the note from Ctrl/Cmd K

On the public blog shell only Ctrl/Cmd K and Ctrl/Cmd / are claimed; every other combination is handed straight back to the browser.

Writing

KeysAction
Ctrl/Cmd BBold
Ctrl/Cmd IItalic
Ctrl/Cmd UUnderline (<u>)
Ctrl/Cmd Shift XStrikethrough
Ctrl/Cmd Shift HHighlight
Ctrl/Cmd Alt /Comment out the selection — %%…%% in a note, % in a .tex file
Ctrl/Cmd Alt ;Harakat palette — pick an Arabic diacritic for the caret, or point every letter of the selection
Ctrl/Cmd DSelect the next occurrence of the word under the cursor
Ctrl/Cmd SSave now (autosave runs regardless, 600 ms after you stop)
Ctrl/Cmd ↑ / ↓Move the current line up / down
Ctrl/Cmd Z / Ctrl/Cmd Shift ZUndo / redo (inside the editor; see the note on zen below)
Ctrl/Cmd FFind and replace within the note
Ctrl/Cmd Shift FSearch and replace across the vault

Tables

All five live ONLY while the caret sits inside a table block — outside one, Tab still indents, Enter still breaks the line, and Alt with an arrow still belongs to the browser.

KeysAction
TabNext table cell (in the last cell: adds a row)
Shift TabPrevious table cell
EnterDown a row in the table (out of the table from the last row)
Alt ↑ / ↓Move table row
Alt ← / →Move table column, alignment row included (visual arrows — flipped in an RTL table)

The same three keys, inside a drawn table. Click a cell of a rendered table and a box opens in it; Tab, Shift Tab and Enter mean there exactly what the rows above say they mean, so there is one set of table keys and not two. The box adds four of its own that claim no chord outside it: Shift Enter puts a <br> in the cell, ← and → step to the neighbouring cell when the caret is already at the box's edge (mirrored in a right-to-left table), ↑ and ↓ move a row, and Esc puts the caret back in the note just after the table, leaving the cell as it was. Shift F10 in a cell opens the table menu — rows, columns, alignment, sorting, Edit as Markdown — which a right-click opens too, and which a ⋯ under the table opens on a touch screen. See the editor's Tables section.

Templates

KeysAction
Ctrl/Cmd Alt TInsert template… at the cursor
Ctrl/Cmd Alt Shift TNew note from template…

Ctrl/Cmd Alt rather than the obvious Ctrl/Cmd T: that one is the browser's new tab, and Ctrl/Cmd Shift T reopens a closed one. Neither is takeable.

Sections & folding

KeysAction
Ctrl/Cmd Shift [ / ]Fold / unfold the section at the cursor — or the chevron beside the heading
Ctrl/Cmd Alt [ / ]Fold / unfold everything
Ctrl/Cmd Alt FFocus one section — everything else collapses; Esc restores it exactly
Ctrl/Cmd Alt ↑ / ↓Jump to the previous / next heading (scrolls, in reading view)

On macOS both fold rows are spelled differently, and the table above does not say so yet. Both bindings come from CodeMirror's own foldKeymap, which overrides the section fold for Mac (Ctrl-Shift-[ becomes Cmd-Alt-[) and leaves fold-all on Ctrl-Alt-[ for every platform. So on a Mac the section fold is Cmd Alt [ / ] — not Cmd Shift [, which binds nothing — and fold-all keeps its Ctrl. The shortcut sheet prints Ctrl/Cmd for both; the keymap gate compares the sheet against this page and cannot see past either of them into CodeMirror, so this paragraph is the correction until the two rows are given their real Mac spellings.

Ctrl/Cmd G is the graph everywhere, including inside the editor, and that is a decision. CodeMirror's searchKeymap binds Mod-g to "find again", but the shell catches the key before the editor sees it — so that binding has never fired here. It stays that way: find-again already has two other ways to run (F3, and Enter in the find field), while the graph toggle is a documented Astrolabe binding a reader would be surprised to lose halfway through a note. This is the opposite call to the one made for Ctrl/Cmd D and Ctrl/Cmd B, where the editor's meaning is the per-minute one and the shell's was the once-a-day one — the rule is which verb the key is worth more to, not who asked first. Written down because a keymap gate that compares this page to the shortcut sheet cannot see CodeMirror's own keymaps, so the next reader to notice Mod-g would otherwise "fix" it.

Below this line the ledger stops. These are SURFACES rather than bindings: Astrolabe claims no keystroke of its own for them, so the shortcut sheet names the surface where its other rows name a key, and the keymap gate leaves them alone.

HowAction
ClickFollow a rendered wikilink (create it if unresolved)
Ctrl/Cmd-clickFollow a wikilink on the line you're editing
ClickOpen an image or PDF from the tree, in the attachment viewer
Right-click, Shift F10, or the menu keyFormatting menu for the selection — text style, structure, insert, colour
Right-click a misspelled word (nothing selected)Spelling suggestions and "Add to dictionary" — with a selection, right-click means formatting instead
Right-click a heading, or the ⋯ beside itSection menu — the whole subtree, not the line
Drag a row in OutlineReorder a section, and everything under it
/ at line startSlash menu (callout, code fence, table, …)
TabIndent (CodeMirror's indentWithTab)
↑ ↓ Enter EscNavigate / confirm / dismiss the palette (Enter always runs the keyboard's row, never whatever the mouse happens to rest on)
Selection menuExtract the selection into a new linked note — [[link]] left standing, and the toast's Undo restores both files
Selection menu → InsertFootnote — [^n] numbered so existing footnotes stay ordered, definition stub at the note's end; \footnote{…} in a .tex note
Selection menu → StructureTitle Case / UPPERCASE / lowercase over the selection, per cursor — wikilink targets and code spans untouched
Selection menu → CalloutWrap the selection in a > [!type] callout — every line prefixed, blank lines kept inside the callout

Every modal, popover and picker in the product answers the same four keys: Esc to leave, arrows to move, Enter to commit, and type-ahead wherever there is a list. Esc always belongs to the innermost layer that is open.

The book reader

The reader has its own sheet (? inside a book) and its own grammar, deliberately outside the ledger above: j/k scroll, J/K page, gg/G, p go to, o contents, / n N search, +/- zoom, a/s/d fit width, fit page, two pages, i night, r rotate, m<c>/'<c> marks, h highlight, c cite, e margin note, x unmark, A marked passages, : command line, z zen, q close, and a count typed before any of them. The whole table, with what each key does, is in The book reader.

An EPUB keeps the keys that still mean something in a text with no pages — j/k, Space, gg/G, / n N, o, z, l, q, ? — and reads the rest differently: J/K step a chapter rather than a page, +/-/0 (and Ctrl/Cmd with them) set the TYPE size rather than a zoom, and c copies a citation to the selected passage. There is no a/s/d, no i, no r and no : line: fitting, rotating and inverting are things you do to a picture of a page, and this format has none. See EPUB.

Feeds

The Feeds page answers four keys of its own while focus is inside it, outside the ledger for the book reader's reason: they are a surface's grammar, not the shell's, and a letter pressed anywhere else still types a letter. They are matched by the key's position, so they work on an Arabic layout too.

KeysAction
j / kThe next / previous article
oOpen the original page in a new tab
eMark read, and go on to the next

The tour

A deck of illustrated cards, one feature each, with a Show me that really opens the thing it describes. It claims no keystroke of its own, because it is only ever entered on purpose, never shown to you unasked, so its doors are the palette (Take the tour), the quiet line on an empty vault, the foot of the Ctrl/Cmd / sheet, and a line in Welcome.md.

KeysAction
← / →, or h / lFlip a card. Logical: in Arabic, ← goes forward
SwipeThe same flip, on a touch screen — mirrored the same way
EscLeave. The card you were on is where you come back

The designer

KeysAction
Ctrl/Cmd SSave the design draft
SpaceLift / drop a section row
↑ / ↓Move a lifted row (Alt ↑ / ↓ moves any row)
EscCancel a lift, close the section picker, close the designer

Why these keys

The five formatting keys are Obsidian's, checked against its shortcut tables rather than guessed, except underline, which Obsidian has no command for at all (markdown has no underline; Astrolabe's writes <u>, a tag the HTML filter already allowed and the reading view already rendered). All five toggle: press twice and the markers come off. With nothing selected they insert the pair and park the caret between them, so bold-then-type works. Across a multi-line selection they apply per line, because markdown emphasis cannot cross a blank line, and one ** at the top of three paragraphs is two stray asterisks, not bold text. In a .tex note the same five keys write LaTeX instead, and the two that markdown has no spelling for are absent from the menu rather than approximated.

Ctrl/Cmd B used to fold the notes sidebar. Formatting won it: it is the binding every reader arrives with, and a key that bolds a word in one half of the window and folds a pane in the other is a key nobody can describe. The two pane toggles kept their shape (one key, and Shift picks the second pane) and gained one modifier, so the only thing to re-learn is "add Alt". Outside the editor Ctrl/Cmd B and Ctrl/Cmd Shift B are still swallowed, because Firefox's bookmarks sidebar and Chrome's bookmark bar must never open over the app. macOS Option+B (∫) and Option+T (†) work, and every binding declines when AltGr is held, so a European layout's Right-Alt never folds a pane by accident; see Non-Latin keyboards for how that is decided.

The tab keys wear Alt for the same reason the templates do. The world has three chords for tabs, Ctrl Tab, Ctrl PageUp/PageDown and Ctrl W, and the browser owns all three. Two of them can take one more modifier, which is the way out this page keeps taking; the third cannot, because Alt Tab belongs to the window manager. So Ctrl/Cmd Alt PageDown/PageUp walks the strip and Ctrl/Cmd Alt W closes the tab, and your muscle memory transfers with one extra finger. Not arrows: Ctrl Alt ←/→ is GNOME's workspace switcher and macOS Chrome's own tab switcher, and neither hands it back. "Next" means next along the strip in both languages: the bar mirrors with the reading direction, and a tab bar is a list, not a map.

Nothing in the interface calls either pane "the left one": the toggles, the palette and the shortcut sheet say Notes sidebar and Outline & backlinks, in both languages, because in Arabic they swap ends.

In vim mode, Ctrl D and Ctrl B inside the editor keep their half-page scroll and page-up, and Esc stays vim's mode key; use Cmd, the palette, or zen's ✕ instead. On macOS, Cmd Shift Z inside the editor stays redo; Ctrl Shift Z enters zen there.

Non-Latin keyboards

Every binding on this page works with an Arabic, Persian, Russian, Greek or Hebrew system keyboard. That deserves saying out loud, because for a while it was not true: the shortcuts were matched against the letter the keyboard typed, and on an Arabic layout the key marked P types ح, so Ctrl P opened nothing at all. If you run Astrolabe in Arabic, and the interface is fully translated and mirrored for exactly that, your shortcuts are the keys marked with the Latin letters on your keycaps. That includes every chord with Shift in it: Ctrl/Cmd Shift F (find and replace across the vault) is the ب key on an Arabic layout, and npm run check-keymap refuses any handler in the client that compares the typed character instead of the key.

The rule, in one line: a shortcut follows the letter your layout types when that letter is Latin, and the key's position when it is not.

  • On a US, UK or German keyboard nothing changes.
  • On AZERTY and Dvorak the letters have moved, and the shortcut moved with them: Ctrl Shift Z for zen is the key that types z (physical W on AZERTY), not the key sitting where a US keyboard has Z. That key types w, and Ctrl Shift W closes your window.
  • On Arabic, Persian, Russian, Greek or Hebrew there is no Latin letter to follow, so the position answers: the key marked P opens the palette whatever it types.
  • AltGr is always typing, never a command. On layouts where Right-Alt reports as Ctrl+Alt, AltGr E stays ę and does not toggle the reading view.
  • The Ctrl/Cmd / sheet knows this. On a keyboard that types none of these letters it prints the character each key produces beside the letter (P ح), with a line saying why. This works on Chromium; elsewhere it prints the letters alone rather than guessing.

Vim mode is the exception, and it is not one this can fix: in normal mode hjkl are keys your Arabic or Russian layout does not have, so vim is a Latin-layout feature.

Edit this page on GitHub

Astrolabe is free software. These pages are built from the Markdown in the repo's docs folder.