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>
whereView on GitHub (pinned to 079a789e8c)
Solutions
- 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.
- If the target is a static keymap command, remove the ':' prefix; if it is a recorded key sequence, use the '@' macro form instead.
- 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
- Discover exact typable names via Tab-completion in the ':' prompt before writing them into config.
- After helix upgrades, load config and watch the statusline; a bad ':name' entry is reported at parse time.
- Keep keymaps for ':commands' grouped so a failed entry is easy to locate.
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
- No command named '{}'
- Command not provided
- Incorrect transport {}
- Language server '{name}' not defined
- Failed to load config: {}
AI-assisted analysis of helix-editor/helix@079a789e8c (2026-08-16).
Data as JSON: /api/errors/3caf635db8c4ccbf.
Report an issue: GitHub.