{"record":{"id":"56917c1f76136c06","repo":"zed-industries/zed","slug":"cannot-determine-prettier-parser-for-unsaved-file","errorCode":null,"errorMessage":"Cannot determine prettier parser for unsaved file","messagePattern":"Cannot determine prettier parser for unsaved file","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/prettier/src/prettier.rs","lineNumber":604,"sourceCode":"        }\n    }\n}\n\nfn prettier_parser_name(\n    buffer_path: Option<&Path>,\n    buffer_language: Option<&Language>,\n    prettier_settings: &PrettierSettings,\n) -> anyhow::Result<Option<String>> {\n    let parser = if buffer_path.is_none() {\n        let parser = prettier_settings\n            .parser\n            .as_deref()\n            .or_else(|| buffer_language.and_then(|language| language.prettier_parser_name()));\n        if parser.is_none() {\n            log::error!(\n                \"Formatting unsaved file with prettier failed. No prettier parser configured for language {buffer_language:?}\"\n            );\n            anyhow::bail!(\"Cannot determine prettier parser for unsaved file\");\n        }\n        parser\n    } else if let (Some(buffer_language), Some(buffer_path)) = (buffer_language, buffer_path)\n        && buffer_path.extension().is_some_and(|extension| {\n            !buffer_language\n                .config()\n                .matcher\n                .path_suffixes\n                .contains(&extension.to_string_lossy().into_owned())\n        })\n    {\n        buffer_language.prettier_parser_name()\n    } else {\n        prettier_settings.parser.as_deref()\n    };\n\n    Ok(parser.map(ToOwned::to_owned))\n}","sourceCodeStart":586,"sourceCodeEnd":622,"githubUrl":"https://github.com/zed-industries/zed/blob/f4178619acd0d47ea1f76a2025c42962c6d6638c/crates/prettier/src/prettier.rs#L586-L622","documentation":"Raised while resolving a prettier parser for a buffer that has no file path (untitled/never-saved buffer). For saved files the extension drives resolution; for unsaved ones the code falls back to the prettier.parser setting, then to the language's prettier_parser_name(). When both are absent it logs 'Formatting unsaved file with prettier failed...' and bails with this message. It means prettier has no way to know which syntax it is formatting.","triggerScenarios":"Running prettier format (format-again / prettier: format) on an untitled buffer whose language is plain text or None, or a language prettier has no parser for (e.g. Rust), while no explicit 'prettier.parser' is set in settings.","commonSituations":"Pasting JSON/TS into a new untitled tab and formatting before saving; setting up prettier defaults without a parser; editing a language Zed recognizes but prettier does not support.","solutions":["Save the buffer first with the proper file extension so extension-based resolution works.","Set an explicit parser in settings: \\\"prettier\\\": { \\\"parser\\\": \\\"babel\\\" } (e.g. babel/typescript/json/css/html/markdown/yaml).","Switch to a language prettier supports (check the buffer's language selector on an unsaved file).","For languages without prettier support, use the built-in formatter or disable prettier for that language instead."],"exampleFix":"// before\n{\"prettier\": {\"enabled\": true}}\n// formatting an unsaved TypeScript tab fails:\n// Cannot determine prettier parser for unsaved file\n\n// after (either save the file as app.ts, or configure)\n{\"prettier\": {\"enabled\": true, \"parser\": \"typescript\"}}","handlingStrategy":"validation","validationCode":"// Rust caller before formatting an unsaved buffer\nlet has_parser = prettier_settings.parser.is_some()\n    || buffer_language.and_then(|l| l.prettier_parser_name()).is_some();\nanyhow::ensure!(\n    buffer_path.is_some() || has_parser,\n    \"cannot prettier-format this unsaved buffer yet\"\n);","typeGuard":"fn can_format_unsaved(settings_parser: Option<&str>, language: Option<&Language>) -> bool {\n    settings_parser.is_some() || language.and_then(|l| l.prettier_parser_name()).is_some()\n}","tryCatchPattern":"// n/a: guard by pre-checking; on Err, surface 'save the file or set prettier.parser' to the user","preventionTips":["Save new buffers with a real extension before formatting","Set an explicit prettier.parser if you routinely format scratch files","Map unknown languages to a supported one or disable prettier for them"],"tags":["prettier","formatter","parser","unsaved-buffer","configuration"],"backgroundTag":"formatter-parser-missing","analyzedSha":"f4178619acd0d47ea1f76a2025c42962c6d6638c","analyzedAt":"2026-08-20T19:29:52.058Z","contentChangedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}