Live Preview
Markdown renders in place and reveals its source only where your cursor is — one pane, no split, no separate preview tab.
Open any .md file and Suzuri renders it in the editor itself. Syntax markers
— **, *, ~~, backticks, link targets, list bullets, heading prefixes —
are hidden, and block elements become rendered widgets. Move the cursor into a
construct and its raw markdown reappears so you can edit it.
This is Obsidian's Live Preview behavior, implemented on top of the real editor rather than beside it. There is no second pane to keep in sync and no preview-mode toggle to forget: what you see is the buffer.
Reveal rules
Two rules cover almost everything:
- Inline constructs — bold, italic, strikethrough, inline code, links — reveal when the selection touches them.
- Blocks — headings, lists, rules, code fences — reveal when the selection reaches their lines.
Tables, images, and frontmatter are the exception. They are edited through
their widgets, so a cursor landing on them would be ambiguous; they reveal
their source only via the </> button on the widget. See
Tables & Images.
Search keeps headings rendered
A selection that came from search leaves heading prefixes concealed, so
jumping through results doesn't make the document jump around as ## markers
pop in and out.
Because it is the real editor
Live preview writes decorations onto the editor rather than rendering its own view of the document. Everything the editor already does keeps working inside rendered text:
- Vim and Helix modes, multi-cursor, and all your keybindings
- Search and replace, including across a multi-buffer
- LSP diagnostics, code actions, and hover
- Selections, IME input, and accessibility
Headings
Headings stay in the main editor and are restyled rather than replaced: font scale, wrapping width, and line height change, but the text is still editable text on a real line.
{
"markdown_live_preview": {
"heading_styles": {
"h1": { "font_size": 1.75, "font_weight": 600 },
"h2": { "font_size": 1.4, "font_weight": 600 },
"h3": { "font_size": 1.2, "font_weight": 600 },
"h4": { "font_size": 1.0, "font_weight": 600 },
"h5": { "font_size": 0.875, "font_weight": 600 },
"h6": { "font_size": 0.85, "font_weight": 600 }
}
}
}Font sizes multiply the editor's base font size; weights are CSS values from 100 to 900.
Formatting
Live preview hides the asterisks, so you should not have to type them. Cmd+B makes text bold and Cmd+I makes it italic. Document → Format also has headings, strikethrough, inline code, and link. Every one is a toggle: run it again on formatted text and the formatting comes off.
| With | The command |
|---|---|
| A selection | Wraps it, or unwraps it if it is already formatted. Spaces at its edges stay outside the markers, and a selection across paragraphs is wrapped paragraph by paragraph. |
| The cursor in a word | Applies to that word, and leaves the cursor where it was. |
| The cursor between words | Inserts an empty pair to type into; running it again removes the pair. |
Bold and italic nest: italic on bold text makes it ***both***, and bold on
that leaves it italic. Link turns a selection into [text]() with the
cursor where the address goes, a selected URL into [](url) with the cursor
on the label, and a selected link back into its text.
Heading 1 to Heading 6, at the top of Document → Format, turn
every line the selection touches into a heading of that level, replacing the
level it had. Choosing a line's current level again turns it back into body
text, and Body does that for any level. Blank lines inside a selection
stay blank, and a #tag at the start of a line is left alone.
| Command | macOS | Linux |
|---|---|---|
| Heading 1 to Heading 6 | Cmd+Alt+1 to 6 | Ctrl+Alt+1 to 6 |
| Body | Cmd+Alt+0 | Ctrl+Alt+0 |
These are Google Docs' heading shortcuts. Windows has none by default:
Ctrl+Alt is AltGr there, which types
characters such as } on many keyboard layouts. Use the menu, or
bind your own.
The commands edit the markdown source, so the note stays plain text that every other tool reads. They only work in markdown notes, and the Format menu is greyed out everywhere else. Cmd+B and Cmd+I likewise keep Zed's meaning outside markdown (toggle the left dock, signature help). On Linux and Windows they are Ctrl+B and Ctrl+I, except in Vim's normal mode, where those keys stay Vim motions.
Word count
A markdown note shows its word count in the status bar, and with text
selected, how much of the total the selection is: 120 of 4,310 words.
Hovering it gives a reading time.
It counts what a reader of the finished paper would read, the way a journal does. Not counted:
- frontmatter, fenced code, and math
- cite keys such as
[@vaswani2017], and the reference list under a References, Bibliography or Works Cited heading - link addresses (the link text counts), images, embeds, tags, footnote markers, and HTML comments
Each Chinese, Japanese, or Korean character counts as one word, since those
scripts have no spaces between words. Right-click the count to hide it, or
set markdown_live_preview.word_count to false.
Turning it off
Per buffer, run markdown: toggle live preview from the command palette (Cmd+Shift+P), to see the raw markdown.
Globally:
{
"markdown_live_preview": {
"enabled": false
}
}Autosave
Suzuri defaults to delay-based autosave — one second after you stop typing:
{
"autosave": { "after_delay": { "milliseconds": 1000 } }
}Notes are terminal artifacts with no build watchers, and agents read the vault from disk, so the buffer and the file should never diverge for long. This is also what drives typeset preview: the compile loop is type → pause → page updates.
To save only when you choose, open Settings → Editor → Auto Save and set
Auto Save Mode to Off, or in settings.json:
{
"autosave": "off"
}Changes then stay in the buffer until you press Cmd+S
(Ctrl+S on Linux). Two modes sit in between:
"on_focus_change" saves when you leave the file, and "on_window_change"
saves when you leave the Suzuri window. Autosave is one setting for every
file; it cannot be set per language or per project.