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, or enumerate blocks

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:

  1. Parsing — Flow parses your LaTeX into a syntax tree, identifying every command, environment, and argument with their exact positions.
  2. 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.
  3. 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.
  4. Content analysis — Each field gets checked against 15+ placeholder patterns. Flow recognizes things like [YOUR NAME], TODO: markers, Lorem ipsum filler, and ALL_CAPS template 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 \title or \author score 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 ipsum adds +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.