zed-industries/zed · error · anyhow::Error
Cannot determine prettier parser for unsaved file
Error message
Cannot determine prettier parser for unsaved file
What it means
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.
Source
Thrown at crates/prettier/src/prettier.rs:604
}
}
}
fn prettier_parser_name(
buffer_path: Option<&Path>,
buffer_language: Option<&Language>,
prettier_settings: &PrettierSettings,
) -> anyhow::Result<Option<String>> {
let parser = if buffer_path.is_none() {
let parser = prettier_settings
.parser
.as_deref()
.or_else(|| buffer_language.and_then(|language| language.prettier_parser_name()));
if parser.is_none() {
log::error!(
"Formatting unsaved file with prettier failed. No prettier parser configured for language {buffer_language:?}"
);
anyhow::bail!("Cannot determine prettier parser for unsaved file");
}
parser
} else if let (Some(buffer_language), Some(buffer_path)) = (buffer_language, buffer_path)
&& buffer_path.extension().is_some_and(|extension| {
!buffer_language
.config()
.matcher
.path_suffixes
.contains(&extension.to_string_lossy().into_owned())
})
{
buffer_language.prettier_parser_name()
} else {
prettier_settings.parser.as_deref()
};
Ok(parser.map(ToOwned::to_owned))
}View on GitHub (pinned to f4178619ac)
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.
Example fix
// before
{"prettier": {"enabled": true}}
// formatting an unsaved TypeScript tab fails:
// Cannot determine prettier parser for unsaved file
// after (either save the file as app.ts, or configure)
{"prettier": {"enabled": true, "parser": "typescript"}} Defensive patterns
Strategy: validation
Validate before calling
// Rust caller before formatting an unsaved buffer
let has_parser = prettier_settings.parser.is_some()
|| buffer_language.and_then(|l| l.prettier_parser_name()).is_some();
anyhow::ensure!(
buffer_path.is_some() || has_parser,
"cannot prettier-format this unsaved buffer yet"
); Type guard
fn can_format_unsaved(settings_parser: Option<&str>, language: Option<&Language>) -> bool {
settings_parser.is_some() || language.and_then(|l| l.prettier_parser_name()).is_some()
} Try / catch
// n/a: guard by pre-checking; on Err, surface 'save the file or set prettier.parser' to the user
Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Expected exactly one context server configuration
- copilot is disabled
- When using the `stdio` transport, the path to a debug adapte
- Cannot have two different hosts in debug configuration
- Cannot have two different ports in debug configuration
AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20).
Data as JSON: /api/errors/56917c1f76136c06.
Report an issue: GitHub.