{"record":{"id":"01a111603538da47","repo":"helix-editor/helix","slug":"language-server-name-not-defined","errorCode":null,"errorMessage":"Language server '{name}' not defined","messagePattern":"Language server '(.+?)' not defined","errorType":"validation","errorClass":"StartupError","httpStatus":null,"severity":"error","filePath":"helix-lsp/src/lib.rs","lineNumber":632,"sourceCode":"        instances.retain(|ls| id != ls.id());\n        if instances.is_empty() {\n            self.inner_by_name.remove(client.name());\n        }\n    }\n\n    fn start_client(\n        &mut self,\n        name: String,\n        ls_config: &LanguageConfiguration,\n        doc_path: Option<&std::path::Path>,\n        root_dirs: &[PathBuf],\n        enable_snippets: bool,\n    ) -> Result<Arc<Client>, StartupError> {\n        let syn_loader = self.syn_loader.load();\n        let config = syn_loader\n            .language_server_configs()\n            .get(&name)\n            .ok_or_else(|| anyhow::anyhow!(\"Language server '{name}' not defined\"))?;\n        let id = self.inner.try_insert_with_key(|id| {\n            start_client(\n                id,\n                name,\n                ls_config,\n                config,\n                doc_path,\n                root_dirs,\n                enable_snippets,\n            )\n            .map(|client| {\n                self.incoming.push(UnboundedReceiverStream::new(client.1));\n                client.0\n            })\n        })?;\n        Ok(self.inner[id].clone())\n    }\n","sourceCodeStart":614,"sourceCodeEnd":650,"githubUrl":"https://github.com/helix-editor/helix/blob/079a789e8cb08ead67f19e1971a1b7438b37354b/helix-lsp/src/lib.rs#L614-L650","documentation":"During language-server startup, Registry::start_client looks up the requested server name in the syntax loader's language_server_configs (the [language-server.<name>] tables merged from languages.toml and user config). If no table with that exact name exists, this error is returned and the server never starts.","triggerScenarios":"A language's language-server = [{ name = \"foo\" }] (or the legacy language-server = [\"foo\"] list) references a name that has no [language-server.foo] section anywhere - typo, wrong case, or a server defined only in another config layer that got shadowed/removed by user languages.toml merging.","commonSituations":"User adds a language override in ~/.config/helix/languages.toml that replaces the default language table (array of tables semantics) and forgets to carry over the [language-server.x] definition; renaming a server block but not its reference; disabling a built-in definition while still referencing it; name casing ('vscode-html-language-server' vs 'vscode-html-language-server-removed').","solutions":["Check 'hx --health <lang>' - it shows which language servers are configured/available and surfaces this mismatch","Add the missing definition block: [language-server.foo] with command = \"...\" in languages.toml (user or workspace), or fix the name to match an existing block exactly (case-sensitive)","If you overrode the language's table in user config, re-add the [language-server.<name>] blocks the default languages.toml shipped for it"],"exampleFix":"# before - reference without definition\n[language-server.myls]\n# (missing)\n[[language]]\nname = \"mylang\"\nlanguage-server = [{ name = \"myls\" }]\n\n# after\n[language-server.myls]\ncommand = \"mylang-server\"\nargs = [\"--stdio\"]\n\n[[language]]\nname = \"mylang\"\nlanguage-server = [{ name = \"myls\" }]","handlingStrategy":"validation","validationCode":"// Validate language-server references against definitions before startup:\nfn ls_refs_defined(lang: &LanguageConfiguration, defs: &HashSet<String>) -> Result<(), String> {\n    for ls in &lang.language_server {\n        if !defs.contains(&ls.name) {\n            return Err(format!(\"language server '{}' not defined\", ls.name));\n        }\n    }\n    Ok(())\n}","typeGuard":"fn is_defined_ls(name: &str, syn_loader: &helix_core::syntax::Loader) -> bool {\n    syn_loader.language_server_configs().contains_key(name)\n}","tryCatchPattern":null,"preventionTips":["Run 'hx --health <lang>' after changing languages.toml - it flags undefined servers","When overriding a language table, copy the matching [language-server.*] blocks too","Keep names case-sensitive and identical between reference and definition","Prefer adding new [language-server.x] blocks over editing built-in ones"],"tags":["rust","helix","lsp","config","languages-toml"],"backgroundTag":null,"analyzedSha":"079a789e8cb08ead67f19e1971a1b7438b37354b","analyzedAt":"2026-08-16T09:09:59.668Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}