quarto-dev / quarto-dev/quarto

Click-to-source (reverse search) between HTML preview and .qmd source

Open
#1,130 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

vscode
Dominant language
TypeScript
Stars
645
Forks
62
Avg merge
17h 42m
Merged PRs (30d)
13

Description

Feature request

Provide click-to-source (a.k.a. reverse search) between the quarto preview HTML output and the .qmd source, similar to the forward/inverse search Overleaf/SyncTeX provide for LaTeX: double-click an element in the preview and jump to the corresponding line in the editor.

This has sort of come up a few times already: #37 (two-way scroll sync), #492 (open source file for the current preview page), and in quarto-cli discussions #2163 and #12927. Opening this as a single, scoped proposal to consolidate those.

Proposed approach

  • Inject source-position metadata into rendered HTML block elements (e.g. data-sourcepos="file:line:col").
  • Extend the reload script that quarto preview already injects into the page to listen for a dblclick and send the captured position back over the existing WebSocket connection.
  • On the extension side, open the editor at that location — code --goto file:line:col, or the equivalent vscode://file/... URI, which works the same way for Positron.

On feasibility

Pandoc has a native sourcepos extension that adds data-pos attributes to the AST, but per Pandoc's changelog it's limited to the CommonMark-family readers (commonmark, gfm, commonmark_x), not the extended markdown reader that .qmd uses by default. So I don't think this wouldn't be a matter of flipping an existing flag for the current engine.

That said, the underlying problem, bidirectional scroll sync for Pandoc documents, including non-CommonMark markdown and documents with executed code, seems to me to be already been solved in an adjacent tool: Codebraid Preview. It maintains its own source-position tracking when Pandoc's native sourcepos isn't available, and stays in sync through code execution via Jupyter kernels. Worth a look as a reference implementation maybe?

Also relevant: the newer Rust parser work in quarto-dev/quarto-markdown already has a quarto-source-map crate for byte-range source tracking, currently used for diagnostics. That could plausibly be the right long-term foundation, even though I didn't see it wired into quarto preview yet.

Suggested scope for a first version

Given the complications around chunk-executed output, I'd suggest starting with static Markdown content (headings, paragraphs, lists) and explicitly excluding computed chunk output rather than aiming for full fidelity on dynamic content immediately. That alone would cover most of the "find where I need to edit" workflow.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reload script injected by quarto preview, then inspect the quarto-source-map crate and Codebraid Preview as reference points for tracking static Markdown positions. Define a first version for headings, paragraphs, and lists only; done means a preview double-click sends a position over the existing WebSocket and opens the .qmd source in the editor, while computed chunk output remains excluded.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust, typescript, vscode
Domain
developer-experience, tooling, web-dev
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.