Skip to content

Keybindings

The complete reference — the same content the editor shows on F1. is the editor's primary modifier (Cmd on macOS, Ctrl elsewhere).

Views & session

Key Action
⌘R Toggle the source editor ↔ rendered reading view
Esc Step back — leave visual mode, close an overlay, put an expanded image away. Embedded in a host app it also saves & closes the editor (⇧Esc cancels / discards pending changes); standalone it never quits — ⌘Q (Ctrl+Q) does
⌘↵ Toggle full-window width
⌘. Section focus — dim all but the current paragraph (writing) / section (reading)
⌘T Typewriter scrolling — hold the caret line steady while writing (persists)
⌘⇧P Paper surface — grain & light under the text; off = the flat page (persists)
⌘⇧D Dark / light page — the counterpart palette (persists)
⌘+ / ⌘- / ⌘0 Font size bigger / smaller / reset (persists)
⌘⇧→ / ⌘⇧← / ⌘⇧↓ Content column wider / narrower / reset (persists)
⌘J Word-jump overlay (Easymotion-style two-key jump)
⌘P Print
F1 Help

Writing (vim — source editor)

Key Action
h j k l Move left / down / up / right
w / b / e Next word / previous word / word end
0 / $ · gg / G Line start / end · document start / end
i a · I A · o O Enter INSERT: before/after · line start/end · new line below/above
Esc Back to NORMAL mode
x · dd · dw Delete char · line · to next word (into the register)
u · ⌃r Undo · redo the last change
v VISUAL — extend a selection with the motions, then d / y / c
yy · yw · p / P Yank line / word · paste after / before
2j · 3dd A leading count repeats the next motion or edit
Follow the link under the caret — web/mail in the browser, #heading jumps there (NORMAL mode)
go Open another file — history is fuzzy-matched, paths complete per segment
gh Headings overview — an outline of the source (j/k preview, Enter keeps, Esc restores)

Search (/) — both views

Key Action
/ Search the document — matching lines ranked best-first (exact above fuzzy)
(type) Live hit list; the view scrolls to preview the selected hit
⌃n / ⌃p · ↓ / ↑ Move the selection
Enter · Esc Jump to the hit · cancel back to where you were
n / N Next / previous hit (wraps; the query survives ⌘R)
(write view) Reveal replace — replaces this match & advances, ⌃↵ replaces all (literal matches)

Open-file dialog (go)

Key Action
(type) Fuzzy-match your history (files & their folders); a path (with / or ~) also completes the filesystem, segment by segment
⌃n / ⌃p · ↓ / ↑ Move the selection
Tab Complete — extend to the common prefix, else adopt the selected row
Enter Open the selected file (a directory descends into it); with no match, open the typed path as a new file
Esc Cancel, back to the editor

See Opening files for how the matching works.

Reading view — navigate

Key Action
h j k l · w b e · 0 $ Move a caret through the rendered text
gg / G Document start / end
⌃d / ⌃u · ⌃f / ⌃b / Space Half-page · full-page scroll
f Focus reading mode — caret-lock at centre + a spotlight on the reading line, fading text by distance (persists)
gh Headings overview — j/k preview live, Enter keeps, Esc restores your spot
gl Links overview — same jump-list; Enter follows the picked link
Follow the link under the caret — a .md opens in place, web/mail in the browser, #heading jumps there, anything else via the system handler
Follow the source reference under the caret — editor.py, textli/editor.py:2455, view.py:80-95 — opening the file read-only at that line (see Source references)
Expand the image under the caret — an ordinary picture, a chart, a .grafli diagram or a formula fills the window for a closer look. Esc (or again) puts the page back
gb / Back to the document (or source file) the last link or reference was followed from
go Open another file (stays in the reading view)
gs Status — pick from the values the document declares in its frontmatter; Enter sets status: and saves (see Document status)

Source references

Notes about code — a design doc, a review, anything an agent wrote — cite files the way everyone writes them: `textli/editor.py:2455`, `view.py:80-95`, or just `editor.py`. In the reading view those are followable: opens the file in place, read-only, at that line, and gb (or ) brings you back exactly where you were — so you can check the code a decision rests on without leaving the page you're reading.

What counts An inline-code span carrying a file extension (comments.py) or a line anchor (Makefile:12). Prose chips (--read, .md, QWidget) are left alone.
Where it looks Beside the document first, then up through the parent folders — so a doc in mgc/groundwork/ finds textli/editor.py without spelling out ../../. A bare name (editor.py) is then looked up in the repository; if two files share the name, textli says not found rather than guess.
How far it looks Never past the enclosing repository (or your home folder). Nothing resolves outside it.
What you get The file in monospace on the code band, syntax-highlighted, sized and widened for code, with the referenced lines lifted onto the bright page. ⌘+/⌘- zoom, / searches, vim motions move — the page just isn't editable.
What it won't do Comment, suggest, or edit — c/s/⌘R whisper instead. textli annotates Markdown; a peeked file isn't yours to mark up.

A link works too: [the module](../textli/editor.py) opens as source, while a link to something meant to be seen (page.html, an image, a PDF) still goes to the system handler.

Reading view — comments

Key Action
v Visual mode — extend a selection with the motions above
c Comment the selection or the formula under the caret (or reveal/edit the comment there)
]c / [c Step to the next / previous comment
Enter · ⇧D Reveal-edit · delete the active comment

Reading view — suggestions (track changes)

Key Action
s Suggest a change — replace the selection (empty = delete), or insert at the caret
]s / [s Step to the next / previous suggestion
a / x Accept / reject the suggestion under the caret and advance to the next
⇧A / ⇧X Accept / reject all suggestions at once
gc Changes overview — every change & comment, same live preview as gh
p Clean preview — the prose with every suggestion accepted (source untouched)