VoiceGem

How to say a minus sign, and why “dash” will not build kebab-case

Say “minus” or “dash” to produce a hyphen spaced on both sides, so “length minus one” assembles as length - one. Spacing is why “max dash retry” returns max - retry rather than max-retry: to build a hyphenated identifier, say “kebab case” and then the words.

A ten-word bounds calculation takes about 12 seconds to type and about 3.7 seconds to say. (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
lastIndex = rows.length - 1

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

Step by step

  1. 1

    Say “minus” for arithmetic

    Speak both operands with the phrase between them. The hyphen attaches on neither side, so subtraction comes out spaced the way a formatter leaves it.

  2. 2

    Say “kebab case” for a hyphenated name

    Use the casing command rather than the symbol. A VoiceGem casing command greedily consumes the following run of plain words into one identifier, which is the only way to get max-retry-count with no spaces.

  3. 3

    Say “dash” for flags, then expect spaces

    Speak “dash i” for a command-line flag and accept that the result is spaced. Shell lines dictated this way need the whitespace tidied before they run.

  4. 4

    By hand

    Press the hyphen key, which is unmodified everywhere. For flags and hyphenated names the keyboard is genuinely the better tool.

Hyphenated identifiers come from the casing command, not the symbol

Two different mechanisms in VoiceGem can produce a hyphen and only one of them produces a hyphenated name. The symbol entry emits a spaced hyphen suitable for subtraction; the kebab casing command joins a run of spoken words with hyphens and no spaces at all.

Separating the two is what lets one character serve arithmetic and naming without a language setting. The Deterministic Pass tries a casing command first at each position, then symbol phrases, then whitespace commands — so “kebab case max retry count” is consumed as a naming instruction before the word max is ever treated as a plain token.

Where the manual way breaks

A hyphen is one unmodified keystroke and typing one is trivial. Nothing here suggests dictating a single character is worthwhile.

CSS class names and command-line invocations are where the hyphen count climbs. A long kebab-case class name is four or five hyphens interleaved with words, and every one is a chance to typo a name that then silently fails to match a selector. Saying “kebab case” once and then the words gives VoiceGem the whole identifier in a single utterance.

Doing this somewhere else? casing converter, with nothing to install, the asterisk, step by step, the same thing for the caret, or the same thing for the forward slash.

Common questions

The hyphen symbol attaches on neither side, so it keeps the gaps around it. Say “kebab case max retry” instead and VoiceGem joins the words into one hyphenated identifier.

No. Both phrases reach the same table entry and produce an identical spaced hyphen.

Say “minus” then the digit. The result is spaced, so a negative literal usually needs the space removed before it compiles.

Compare the casing styles side by side before you pick a phrase.

Open the tool