{"record":{"id":"6e8d9c514374e806","repo":"helix-editor/helix","slug":"invalid-language-id","errorCode":null,"errorMessage":"invalid language id: {}","messagePattern":"invalid language id: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"helix-view/src/document.rs","lineNumber":1389,"sourceCode":"                    // been logged by `LanguageData::syntax_config`.\n                    if err != syntax::HighlighterError::NoRootConfig {\n                        log::warn!(\"Error building syntax for '{}': {err}\", self.display_name());\n                    }\n                })\n                .ok()\n        });\n    }\n\n    /// Set the programming language for the file if you know the language but don't have the\n    /// [`syntax::config::LanguageConfiguration`] for it.\n    pub fn set_language_by_language_id(\n        &mut self,\n        language_id: &str,\n        loader: &syntax::Loader,\n    ) -> anyhow::Result<()> {\n        let language = loader\n            .language_for_name(language_id)\n            .ok_or_else(|| anyhow!(\"invalid language id: {}\", language_id))?;\n        let config = loader.language(language).config().clone();\n        self.set_language(Some(config), loader);\n        Ok(())\n    }\n\n    /// Select text within the [`Document`].\n    pub fn set_selection(&mut self, view_id: ViewId, selection: Selection) {\n        // TODO: use a transaction?\n        self.selections\n            .insert(view_id, selection.ensure_invariants(self.text().slice(..)));\n        helix_event::dispatch(SelectionDidChange {\n            doc: self,\n            view: view_id,\n        })\n    }\n\n    /// Find the origin selection of the text in a document, i.e. where\n    /// a single cursor would go if it were on the first grapheme. If","sourceCodeStart":1371,"sourceCodeEnd":1407,"githubUrl":"https://github.com/helix-editor/helix/blob/079a789e8cb08ead67f19e1971a1b7438b37354b/helix-view/src/document.rs#L1371-L1407","documentation":"Document::set_language_by_language_id looks the name up via Loader::language_for_name, which searches the languages loaded from languages.toml (and user overrides). An id that matches no configured language returns None and the method fails with \"invalid language id: {id}\". Note this resolves by language name, not file extension or scope.","triggerScenarios":"Calling :set-language-id with a name absent from languages.toml; an LSP integration passing a languageId string that does not match a configured language name; a custom language defined in user config that failed to load due to a TOML error, so the name never registered.","commonSituations":"Typos or wrong casing when switching languages manually; upstream languages.toml renames in newer Helix versions; expecting a file-type extension (\"rs\", \"ts\") to work where the language name (\"rust\", \"typescript\") is required; user-languages.toml syntax errors silently removing custom entries.","solutions":["Use the exact language name from languages.toml, e.g. :set-language-id typescript rather than \"ts\" or \"TSX\".","If it is a custom language, verify the languages.toml/user-languages.toml entry parses (run :config-reload or check :log-open for TOML errors).","For API callers, check loader.language_for_name(id).is_some() before calling set_language_by_language_id and surface the list of valid names."],"exampleFix":"// before\n doc.set_language_by_language_id(\"ts\", loader)?; // Err: invalid language id: ts\n\n// after\n doc.set_language_by_language_id(\"typescript\", loader)?;","handlingStrategy":"validation","validationCode":"let known = loader.language_for_name(language_id).is_some();\nif !known {\n    return Err(anyhow!(\n        \"language '{language_id}' not in languages.toml; known: e.g. rust, typescript, python\"\n    ));\n}\ndoc.set_language_by_language_id(language_id, loader)?;","typeGuard":"fn known_language<'a>(loader: &'a syntax::Loader, id: &str) -> Option<&'a helix_core::syntax::Language> {\n    loader.language_for_name(id)\n}","tryCatchPattern":"match doc.set_language_by_language_id(id, loader) {\n    Ok(()) => {}\n    Err(err) if err.to_string().starts_with(\"invalid language id\") => {\n        // fall back to leaving the current language, tell the user which names exist\n        editor.set_error(format!(\"{err}; check names in languages.toml\"));\n    }\n    Err(err) => return Err(err),\n}","preventionTips":["Check loader.language_for_name(id) before setting.","Source language ids from the same languages.toml that the loader was built from, never hardcode.","After config edits, reload and confirm custom languages actually registered."],"tags":["language","syntax","helix","rust","config"],"backgroundTag":null,"analyzedSha":"079a789e8cb08ead67f19e1971a1b7438b37354b","analyzedAt":"2026-08-16T09:09:59.668Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}