User guide / Language support

Rendered Markdown

Development reference · View source

? in a Markdown document opens it as a page to read; ? again returns to the source. :render (also :markdown) does the same.

SourceRendered page
**strong**strong (bold)
*emphasis*emphasis (italic)
~~struck~~crossed out
# HeadingHeading without hashes; the first level underlined with a rule
- item•, then ◦ and ▪ by depth
1. itemKeeps its number
- [ ] / - [x]☐ / ☑
> quoteMarked in the margin with ▌
---A rule
A tableRe-aligned around │
A fenced code blockIndented, without fences
[text](url)The text followed by its destination, underlined
YAML front matterKept without its --- fences, in the dimmed colour

Anything Runyte does not recognize is passed through as written.

Moving between the two:

  • Both directions move the cursor to the corresponding text and bring it into view.
  • On markup removed by rendering, the page uses the nearest surviving text. Toggling straight back restores the exact source position; moving around the page first takes you to that new place in the source.
  • g f on a link or image label opens its destination, as in the source. Relative paths resolve beside the source document and at the project root.
  • Space e opens the source document’s directory and selects its file.

The page is a buffer. It is a generated read-only buffer beside the document, not a mode the document is in, so both stay open and the source keeps every editing key.

  • Nothing is concealed. The markers are absent because they were never written into the page, so no offset moves and rows and columns mean what they say.
  • Search, selections, splits, and yank work on the page, and find the text actually on screen.
  • It is rendered from the buffer, not the file, so it shows unsaved work. Rendering the same document again reuses and regenerates its one page.

The scratch buffer renders too while editor.scratch_markdown is on — the same option that makes Space p r refill it as Markdown. Its page is named [rendered scratch]. With the option off, the scratchpad is plain text and ? is unbound there.

Tables and soft wrap. Rendered pages, including rendered scratchpads, wrap by default independently of source buffers. Set editor.always_wrap_rendered_markdown: false to follow the general editor.soft_wrap setting controlled by Space p s. Opening or leaving a page does not change the general setting. When the override is active, toggling soft wrap still changes the general setting and the status-line arrow; the feedback explains why the page stays wrapped. Comparison panes and the large-line safety limit still prevent wrapping.

Rendered tables use the same effective wrapping setting as the rest of the page.

  • Columns share the pane’s text width, keeping short columns compact and wrapping longer cells independently.
  • A row is as tall as its tallest cell. Vertical separators continue through its lines, and horizontal rules separate entries.
  • Resizing changes only the visual layout. With soft wrap off, tables keep their natural widths.
  • Columns keep a small minimum width. If the pane is too narrow for them all, the table scrolls horizontally; moving the caret into a hidden column brings it into view. Other text still wraps normally.
  • Up/down follows visual rows and skips added rules. In a shorter cell’s blank continuation, it moves to the nearest cell with text on that row.
  • Clicks on padding place the caret at nearby text; added rules are not click targets.
  • Search and yank use the logical text: wrap breaks, padding, and added rules are not copied. A selection across cells follows that order, so it need not be a rectangle on screen.

Attributes and colours. Bold and underline are drawn by every terminal, italic by most. Each role also has a theme colour, so a terminal that ignores an attribute still shows the difference. The roles are the markup.* entries in Syntax colours , so a theme can recolour them.