VoiceGem

How to say a double colon for Rust paths and C++ scope

Say “double colon” or “scope” to produce :: bound on both sides, so “std double colon vector” assembles as std::vector with no spaces. Saying “colon colon” instead produces a different result, because VoiceGem matches the longest phrase first and two separate colons are two separate lookups.

A ten-word qualified path costs about 12 seconds to type and about 3.7 seconds to speak. (sources: Dhakal, Feit, Kristensson & Oulasvirta, “Observations on Typing from 136 Million Keystrokes”, CHI 2018, 168,000 participants, 136 million keystrokes; Yuan, Liberman & Cieri, “Towards an Integrated Understanding of Speaking Rate in Conversation”, Interspeech 2006, 2,438 American English telephone conversations (Switchboard corpus). The speech figure is conversational rate, not a measured dictation rate — no such measurement exists.)

What lands in your editor
std::collections::#map

This tool runs entirely in your browser. Nothing you type is sent anywhere, stored, or logged.

Step by step

  1. 1

    Say the crate or namespace first

    Speak the leading identifier, then “double colon”. The separator binds on both sides, so std::vector comes out closed up the way a path is written.

  2. 2

    Repeat for each level

    Say “double colon” between every segment. Rust paths three or four levels deep are one continuous sentence, and each separator is an independent lookup in VoiceGem's table.

  3. 3

    Prefer the phrase over two colons

    Say “double colon”, not “colon colon”. The table is matched longest-first at three words, then two, then one, so the two-word phrase wins and produces a single :: entry rather than two colons with their own spacing.

  4. 4

    The keyboard route

    Press Shift-semicolon twice. Rust developers do this thousands of times a day, which is why the double colon is one of the characters where the spoken form is genuinely competitive.

Longest-first matching is why “double colon” beats “colon colon”

The Deterministic Pass walks the transcript once and, at each position, tries a three-word phrase, then a two-word phrase, then a single word. “Double colon” is a two-word entry, so it is found before either word is considered alone, and it emits one table entry with its own attach flags.

Precedence is what makes multi-word phrases possible at all. Without longest-first matching, VoiceGem could not offer “open parenthesis” alongside “open paren”, and “double colon” would collide with the single colon entry. The rule is fixed and the same for every phrase in the table.

Where the manual way breaks

Two shifted keystrokes is not a hardship, and a single path separator is faster typed. Rust developers have the chord in muscle memory already.

Depth is what changes the calculation. A fully qualified path with a turbofish is a dense run of shifted characters and angle brackets, and dictating it means saying the names you were going to say anyway. One caveat is worth stating: angle brackets attach on neither side in VoiceGem's table, so a turbofish comes back spaced as :: < i32 > and needs a formatter pass afterwards.

Doing this somewhere else? speech-to-code converter, with nothing to install, the backslash in an escape sequence, the colon in a type annotation specifically, or the comma in an argument list specifically.

Common questions

You get two separate colon characters with their own spacing, not the :: entry. Longest-first matching means the two-word phrase “double colon” is what reaches the path separator.

Yes. VoiceGem emits the same two characters regardless of language, so a PHP static call and a C++ scope resolution are dictated identically.

Say “double colon open angle”, the type, then “close angle”. Angle brackets keep spaces around them, so run the result through your formatter afterwards.

Dictate a qualified Rust path and see the separators land closed up.

Open the tool