VoiceGem

How to dictate an underscore, and when to use snake case instead

Say “underscore” to produce _ bound on both sides, so “underscore internal” assembles as _internal. One underscore binds to one following word, which is why a multi-word name needs the casing command instead: “underscore snake case private counter” returns _private_counter.

An eight-word private field declaration is about 9.2 seconds of typing against about 2.9 seconds of speech. (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
private_cached_results = null

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

Step by step

  1. 1

    Say “underscore” before a single word

    Speak the phrase then one word. The underscore attaches on both sides, so it binds tight to the word that follows and to whatever precedes it.

  2. 2

    Reach for “snake case” for multi-word names

    Say the casing command instead of repeating the symbol. A VoiceGem casing command consumes the following run of plain words into one identifier, which is the only way to join three words with underscores in one phrase.

  3. 3

    Combine the two for a private field

    Say “underscore snake case private counter” to get a leading underscore and an underscored name together. The symbol lands first, then the casing command builds the rest.

  4. 4

    By hand

    Press Shift-hyphen. Python developers reach for this constantly, and for a single character the keyboard is faster.

One underscore binds one word, and the casing command binds a whole name

Two mechanisms produce underscores in VoiceGem and they operate at different scales. The symbol entry joins the token immediately either side of it; the snake casing command takes every plain word that follows and joins the whole run with underscores.

Reaching for the wrong one is the common mistake. Saying “underscore private underscore counter” works but is slower than “snake case private counter”, and the Deterministic Pass will happily do either — the table has no preference and no opinion about which produces a better name.

Where the manual path breaks

Shift-hyphen is one chord and typing a single underscore is not a burden worth solving. The keyboard wins on the character.

Python dunder methods are the case worth speaking. An init definition holds four underscores, a keyword, a parameter and a colon, and getting the underscore count wrong produces a method that silently never gets called. Dictating it in VoiceGem emits exactly the number of underscores you said, and no formatter will quietly change that count later.

Doing this somewhere else? the casing converter on this site, the backtick specifically, how the double quote works, or the same thing for the single quote.

Common questions

Say “snake case” then the words. The casing command joins the whole run with underscores, which one underscore symbol cannot do.

Yes. Say “underscore underscore init underscore underscore”. Each phrase is an independent lookup, so you get exactly four underscores.

No. It attaches on both sides, which is one of only ten entries in VoiceGem's table that bind in both directions.

Compare snake case against the other four styles before you choose.

Open the tool