helix-editor/helix · error

No TypableCommand named '{}'

Error message

No TypableCommand named '{}'

What it means

MappableCommand::from_str (commands.rs) parses keymap/command strings. A string starting with ':' is treated as a typed (Ex-style) command and looked up by exact name in the typable-command registry (entries like :w, :theme, :debug-start). If no registered TypableCommand has that name, this anyhow error is returned; when it happens while loading config.toml the keymap entry (or the whole config load) fails.

Source

Thrown at helix-term/src/commands.rs:669

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        if let Some(suffix) = s.strip_prefix(':') {
            let (name, args, _) = command_line::split(suffix);
            ensure!(!name.is_empty(), "Expected typable command name");
            typed::TYPABLE_COMMAND_MAP
                .get(name)
                .map(|cmd| {
                    let doc = if args.is_empty() {
                        cmd.doc.to_string()
                    } else {
                        format!(":{} {:?}", cmd.name, args)
                    };
                    MappableCommand::Typable {
                        name: cmd.name.to_owned(),
                        doc,
                        args: args.to_string(),
                    }
                })
                .ok_or_else(|| anyhow!("No TypableCommand named '{}'", s))
        } else if let Some(suffix) = s.strip_prefix('@') {
            helix_view::input::parse_macro(suffix).map(|keys| Self::Macro {
                name: s.to_string(),
                keys,
            })
        } else {
            MappableCommand::STATIC_COMMAND_LIST
                .iter()
                .find(|cmd| cmd.name() == s)
                .cloned()
                .ok_or_else(|| anyhow!("No command named '{}'", s))
        }
    }
}

impl<'de> Deserialize<'de> for MappableCommand {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where

View on GitHub (pinned to 079a789e8c)

Solutions

  1. Fix the name: open the ':' prompt and Tab-complete to discover the exact registered name, or check the typable-commands list in the helix docs for your version.
  2. If the target is a static keymap command, remove the ':' prefix; if it is a recorded key sequence, use the '@' macro form instead.
  3. After editing config, apply `:config-reload` (or restart) and re-test the binding; check the statusline/log for remaining parse errors.

Example fix

# before (config.toml)
[keys.normal]
C-s = ":save"
# after
[keys.normal]
C-s = ":write"
Defensive patterns

Strategy: validation

Validate before calling

// validate keymap strings before inserting them
fn is_valid_binding(s: &str) -> bool {
    s.parse::<helix_term::commands::MappableCommand>().is_ok()
}

Type guard

fn is_mappable_command(s: &str) -> bool {
    s.parse::<helix_term::commands::MappableCommand>().is_ok() // FromStr never panics
}

Try / catch

match entry.parse::<MappableCommand>() {
    Ok(cmd) => { map.insert(key, cmd); }
    Err(err) => log::warn!("ignoring bad keymap {entry:?}: {err}"),
}

Prevention

When it happens

Trigger: A keymaps entry like `{ C-s = ":save" }` — the registry name is 'write', so ':save' misses; ':qw' vs ':wq'; referencing a typable command renamed or removed between helix versions.

Common situations: Keymaps copied from blog posts or other users' dotfiles targeting a different helix version; simple typos in :command names; referencing commands that only exist with a plugin installed.

Related errors


AI-assisted analysis of helix-editor/helix@079a789e8c (2026-08-16). Data as JSON: /api/errors/3caf635db8c4ccbf. Report an issue: GitHub.