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

  1. Save the buffer first with the proper file extension so extension-based resolution works.
  2. Set an explicit parser in settings: \"prettier\": { \"parser\": \"babel\" } (e.g. babel/typescript/json/css/html/markdown/yaml).
  3. Switch to a language prettier supports (check the buffer's language selector on an unsaved file).
  4. 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

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


AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20). Data as JSON: /api/errors/56917c1f76136c06. Report an issue: GitHub.