Rust voice dictation

Rust voice dictation for snake_case functions and UpperCamelCase types

Rust’s naming is unusually regular: RFC 430 fixes the case of every kind of item, from crates to lifetimes. That regularity helps dictation, because each spoken phrase maps to one spelling in a given project. This guide shows what the conventions sound like, what IraVoice types from a Cargo workspace, where module files and crate names collide with type names, how to teach crate names such as tokio, and which voice tools suit Rust work on a Mac, Windows and Linux.

Source-reviewed

1. What speech recognition writes for parse_config and main.rs

Speech-to-text has no idea a Cargo workspace exists. Ask an agent to “make send with retry respect the backoff in http client dot rs” and the transcript is a sentence of ordinary words: no underscores, no extension, and the rs may come out as two separate letters. Crate names fare worse, because many are also English words or close to them, so tokio can arrive as Tokyo and serde as “sir day”.

The compiler is strict about names, and so is a reviewer. An agent can usually recover from loose words, but each guess costs a search through the workspace, and a commit message that says “parse config” instead of parse_config is harder to find with grep later.

2. RFC 430 and the API Guidelines, read aloud

RFC 430 sets the conventions most Rust code follows. Crates, modules, functions, methods and local variables are snake_case; types, traits and enum variants are UpperCamelCase; static and constant variables are SCREAMING_SNAKE_CASE; type parameters are a concise UpperCamelCase name, usually a single letter like T; lifetimes are short and lowercase, like 'a. General constructors are new or with_more_details, and conversion constructors are from_some_other_type. The Rust API Guidelines repeat the table, list macros as snake_case!, and ask that crate names not use -rs or -rust as a suffix or prefix.

Acronyms get their own rule. In UpperCamelCase an acronym counts as one word, so it is Uuid rather than UUID; in snake_case it is lowercased, as in is_xid_start. A single letter should not be a word of its own unless it is the last one, which is why the standard library has btree_map rather than b_tree_map, but PI_2 rather than PI2.

  • HttpClient is said “HTTP client”; under RFC 430 the acronym is one word, and the project’s spelling sets the capitals.
  • MAX_IN_FLIGHT is said “max in flight”; the screaming case is silent.
  • btree_map_len can be said “B tree map len” or “btree map len”, since only letters are compared.
  • T, 'a and the ? operator are syntax, not names, and stay out of dictation.

3. Spoken to typed in a Cargo workspace

Applied to a small rate-limiting crate with src/lib.rs, src/http_client.rs, src/token_bucket.rs, a build.rs, an integration test and a workspace member in crates/invoice-core, IraVoice’s matching rules give these results in a recognized app on a Mac or Windows PC:

  • “send with retry ignores the backoff” → send_with_retry ignores the backoff
  • “rate limiter” → RateLimiter; “parse error” → ParseError
  • “max in flight” → MAX_IN_FLIGHT; “default timeout MS” → DEFAULT_TIMEOUT_MS
  • “is xid start” → is_xid_start; “B tree map len” → btree_map_len
  • “try acquire” → try_acquire, a method declared with fn inside an impl block
  • “cargo dot toml” → Cargo.toml; “cargo dot lock” → Cargo.lock
  • “main dot R S” → main.rs; “lib dot rs” → lib.rs; “build dot rs” → build.rs
  • “integration test rs” → integration_test.rs

4. Modules, crates and the hyphen-to-underscore switch

Methods are declared with fn inside impl blocks, so they are collected like free functions, and let bindings with longer names, such as retry_budget, count too. Struct fields written as refill_rate: u32 are not declarations IraVoice reads, and names defined with macro_rules! stayed as words in the sample project.

Rust projects often name a module after the type it holds: TokenBucket in token_bucket.rs, HttpClient in http_client.rs. Spoken, the pair is the same words, and IraVoice can type only one name for one phrase; in this layout it types the module, so “token bucket” arrives as token_bucket. That is usually enough for an agent to find the type. In a review comment where the type matters, fix the capitals by hand.

Crates add a second split. Cargo’s documentation says a library target’s name defaults to the package name with any dashes replaced with underscores, while the default binary in src/main.rs keeps the package name as it is. A workspace member in crates/invoice-core is therefore invoice-core in Cargo.toml and in cargo -p, and invoice_core in a use path. IraVoice sees the folder, so “invoice core” types invoice-core: right for Cargo commands, and worth changing to the underscore form when you write about a use path.

File names that mix separators behave as in other languages. “integration test rs” gives integration_test.rs, while “integration test dot rs” mixes two spellings and leaves “dot rs” as words. Cargo’s package layout puts kebab-case files in src/bin, benches and tests, such as named-executable.rs; say those as “named executable rs”.

5. tokio, serde and other crates the model mishears

Dependencies are not part of your repository’s own files, and IraVoice skips the target folder, so crate names from crates.io are not in its list unless your code declares something with the same name. Teach the ones you use. Dictate, press ⌃⌥⇧F on a Mac or Ctrl+Alt+Shift+F on Windows and Linux, correct “Tokyo” to tokio or “sir day” to serde, and press Enter. The corrected text is copied to paste back, and only the word pair is kept.

Choose lessons with care. A learned fix applies in every app, so teaching Tokyo → tokio changes the city in your email as well; review or forget lessons under Advanced → Learn from my fixes. For fixed text, use a Replacement: a phrase that types your crate’s repository URL, or “clippy note” for a review comment you paste often.

6. RustRover, Zed, terminals and Linux

On a Mac, names are spelled in RustRover and the other JetBrains IDEs, Zed, VS Code, Cursor, Windsurf and Sublime Text, in Terminal, iTerm2, Ghostty, Warp, kitty, Alacritty, WezTerm and Hyper, and in the Claude and Codex desktop apps. On Windows the recognized apps include VS Code, Cursor, Windsurf, Zed, Windows Terminal, PowerShell, cmd, WezTerm, Alacritty and four JetBrains IDEs (IntelliJ IDEA, PyCharm, WebStorm and Rider); RustRover is not among them, so it gets plain dictation there.

Plenty of Rust work happens on Linux. IraVoice’s Linux beta (an AppImage for any 64-bit distribution from 2022 on, or a .deb or .rpm) dictates into your terminal or editor, but it cannot detect the focused app there, so code names are not spelled. Over SSH, names come only from a Git project on the local computer.

It is not a way to write Rust by voice: no ::, ->, &mut, generics, lifetimes or semicolons. For that, Talon’s community commands include formatters such as snake, hammer, constant and packed, the last of which joins words with double colons, as in one::two::three. Claude Code’s /voice suits short prompts if you sign in with Claude.ai and accept transcription on Anthropic’s servers. macOS Dictation and Win+H are free for prose.

IraVoice recognizes speech on the computer with NVIDIA Parakeet, after a one-time model download of about 700 MB. Hold Right Command on a Mac or Right Ctrl on Windows (Ctrl+Space on Linux) to dictate. It costs $79 once for one computer, $109 for two, or $149 for three, after a 3-day free trial.

Decision guide

Which voice setup fits your Rust work?

Pick by operating system and by whether you are writing prose about code or the code itself.

If you needChooseWhy
Agent prompts and reviews naming functions, traits and constants on a Mac or Windows PCIraVoice in Zed, VS Code, Cursor or a terminalIt types the workspace’s own spelling of declared names and Cargo file names, on the computer.
RustRover on WindowsPlain dictation there, or a recognized editor or terminal for namesRustRover is not on IraVoice’s Windows list; on a Mac every JetBrains IDE is.
Rust development on LinuxIraVoice beta for dictation onlyThe Linux build types your words but cannot spell code names because it cannot see the focused app.
tokio, serde or another crate name the model mishearsQuick Fix onceCrate names are outside your repository; a learned word pair fixes them everywhere.
Writing paths, generics and match arms by voiceTalonFormatters such as packed and snake, plus symbol commands, exist for entering code.

Primary sources

Use the current documentation.

This guide was reviewed October 3, 2026. Product versions, settings, policies, and availability can change.

  1. Rust RFC 430: Finalizing naming conventions ↗

    Case for each item type, acronyms as one word (Uuid), lowercase acronyms in snake_case (is_xid_start), btree_map and PI_2.

  2. Rust API Guidelines: Naming ↗

    C-CASE table including snake_case! macros, and no -rs or -rust in crate names.

  3. The Cargo Book: Package Layout ↗

    Cargo.toml and Cargo.lock at the root, src/lib.rs, src/main.rs, src/bin, benches, examples and tests.

  4. The Cargo Book: Cargo Targets ↗

    Library target name defaults to the package name with dashes replaced by underscores; the default binary keeps the package name.

  5. Talon Community Wiki: Formatters ↗

    snake, hammer, constant and packed (double-colon) formatters.

  6. Claude Code Docs: Voice dictation ↗

    /voice requirements and cloud transcription.

Questions

What readers usually ask next.

Does IraVoice spell Rust names on Linux?

No. The Linux beta dictates into terminals and editors, but it cannot detect the focused app, so code-name spelling is available only on a Mac or Windows PC.

Why does “token bucket” come out as token_bucket instead of TokenBucket?

Your project has a token_bucket.rs module and a TokenBucket type, which reduce to the same letters. One phrase can produce only one name, and in that layout it is the module. An agent finds the type from its module.

Should I say invoice-core or invoice_core?

Both are correct in different places: Cargo uses the package name with a hyphen, and Rust code refers to the library crate with an underscore. IraVoice types the folder’s spelling, invoice-core, so change it when you mean a use path.

Can I dictate Rust code, including lifetimes and macros?

No. IraVoice types words and spells project names inside them; it does not produce double colons, arrows, references, generics or lifetimes. Talon is built for that kind of voice coding.

Does IraVoice read my target folder or my dependencies?

No. It skips build and dependency folders such as target and files that may hold secrets, keeps names rather than source text, and nothing leaves the computer.

Mac, Windows, and Linux

Try private, on-device dictation for yourself.

Hold one key, speak, and the words are typed where your cursor is. The 3-day free trial starts with your first dictation.