Understanding Ctrl+Tab Flow
Flow reads your template, finds every field that needs your input, and lets you tab through them like a form.
What are fillable fields?
Most LaTeX templates have spots that are clearly meant for you to fill in — things like \title{},
\author{}, or placeholder text like [YOUR NAME HERE]. In a traditional editor, you'd have to
hunt through the source to find each one. Flow finds them automatically.
Fillable fields include:
- Empty command arguments —
\title{},\email{},\section{} - Placeholder text —
[Your Name],TODO: add description,Lorem ipsum... - Template markers —
YOUR_TITLE,<description> - Environment bodies — empty
abstract,itemize, orenumerateblocks
How detection works
When you open a document, Flow runs it through a four-layer analysis pipeline — all happening locally on your machine, in a few milliseconds:
- Parsing — Flow parses your LaTeX into a syntax tree, identifying every command, environment, and argument with their exact positions.
- Signature matching — Each command is matched against a database of 200+ known LaTeX commands (including packages like moderncv, letter classes, and academic templates) to determine how many arguments it expects and what type of content belongs in each.
- Classification — The parser walks the tree and marks nodes as fillable. It distinguishes between required fields (the
{}kind) and optional ones (the[]kind), and skips things that aren't meant for user content — like preamble commands, macro definitions, and verbatim environments. - Content analysis — Each field gets checked against 15+ placeholder patterns. Flow recognizes things like
[YOUR NAME],TODO:markers,Lorem ipsumfiller, andALL_CAPStemplate variables. This step assigns a confidence score to each field.
If you have an AI provider configured, there's an optional fifth layer — semantic analysis — that can enhance hint quality and detect implicit fillables, but the core detection works entirely offline.
Navigating fields
Once Flow has identified the fillable fields, you can move through them:
| Action | Shortcut |
|---|---|
| Jump to next fillable | Ctrl+Tab |
| Jump to previous fillable | Ctrl+Shift+Tab |
Navigation visits fields in document order, cycling back to the top when you reach the end. Fields that have already been filled are skipped — only empty and placeholder fields are visited.
Gutter markers
The gold dots you see in the left gutter indicate lines with fillable fields. They appear as soon as you open a document, giving you an immediate visual map of what needs attention.
As you fill in fields, the markers update in real time. Once every field on a line is filled, its marker disappears.
Field states
Each detected field is in one of these states:
| State | What it means | Ctrl+Tab visits? |
|---|---|---|
| Empty | No content yet (e.g., \title{}) | Yes |
| Placeholder | Contains template text like [YOUR NAME] | Yes |
| Filling | You've started typing real content | No |
| Filled | Complete content detected | No |
Confidence scoring
Not every empty brace pair is meant for user input — \vspace{1em} isn't something you'd normally change. Flow uses confidence scoring to rank how likely each field is to need filling.
The score combines two signals:
- Structural confidence — Known fillable commands like
\titleor\authorscore high (1.0). Inferred signatures score lower (0.7). Freeform text starts at 0.4. - Pattern matching — Placeholder patterns boost the score.
[YOUR NAME]adds +0.95,TODO:adds +0.90,Lorem ipsumadds +0.95, and so on.
Fields below a 0.3 confidence threshold are filtered out, so you won't be asked to "fill in" things like spacing commands or package configuration.
Works with any template
This system isn't limited to Flow's built-in templates. It works with any .tex file — templates downloaded from CTAN, files from your university, or documents you've written from scratch. If there are fillable fields, Flow will find them.
For multi-argument commands like \cventry (which takes six arguments: years, title, employer, city, grade, and description), each argument is detected and navigated individually.