@@ -217,6 +217,7 @@ fn write_impl(cx: &mut compositor::Context, path: Option<&Cow<str>>) -> anyhow::
217217
218218 if path.is_some() {
219219 let id = doc.id();
220+ doc.detect_language(cx.editor.syn_loader.clone());
220221 let _ = cx.editor.refresh_language_server(id);
221222 }
222223 Ok(())
@@ -931,6 +932,24 @@ fn setting(
931932 Ok(())
932933}
933934
935+/// Change the language of the current buffer at runtime.
936+fn language(
937+ cx: &mut compositor::Context,
938+ args: &[Cow<str>],
939+ _event: PromptEvent,
940+) -> anyhow::Result<()> {
941+ if args.len() != 1 {
942+ anyhow::bail!("Bad arguments. Usage: `:set-language language`");
943+ }
944+
945+ let doc = doc_mut!(cx.editor);
946+ doc.set_language_by_language_id(&args[0], cx.editor.syn_loader.clone());
947+
948+ let id = doc.id();
949+ cx.editor.refresh_language_server(id);
950+ Ok(())
951+}
952+
934953fn sort(
935954 cx: &mut compositor::Context,
936955 args: &[Cow<str>],
@@ -1408,6 +1427,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
14081427 fun: goto_line_number,
14091428 completer: None,
14101429 },
1430+ TypableCommand {
1431+ name: "set-language",
1432+ aliases: &["lang"],
1433+ doc: "Set the language of current buffer.",
1434+ fun: language,
1435+ completer: Some(completers::language),
1436+ },
14111437 TypableCommand {
14121438 name: "set-option",
14131439 aliases: &["set"],