@@ -217,6 +217,7 @@ fn write_impl(cx: &mut compositor::Context, path: Option<&Cow<str>>) -> anyhow::
218 if path.is_some() {
218 if path.is_some() {
219 let id = doc.id();
219 let id = doc.id();
220+ doc.detect_language(cx.editor.syn_loader.clone());
220 let _ = cx.editor.refresh_language_server(id);
221 let _ = cx.editor.refresh_language_server(id);
@@ -931,6 +932,24 @@ fn setting(
935+/// Change the language of the current buffer at runtime.
937+ cx: &mut compositor::Context,
939+ _event: PromptEvent,
940+) -> anyhow::Result<()> {
941+ if args.len() != 1 {
942+ anyhow::bail!("Bad arguments. Usage: `:set-language language`");
945+ let doc = doc_mut!(cx.editor);
946+ doc.set_language_by_language_id(&args[0], cx.editor.syn_loader.clone());
949+ cx.editor.refresh_language_server(id);
935 cx: &mut compositor::Context,
954 cx: &mut compositor::Context,
936 args: &[Cow<str>],
955 args: &[Cow<str>],
@@ -1408,6 +1427,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
1408 fun: goto_line_number,
1427 fun: goto_line_number,
1409 completer: None,
1428 completer: None,
1431+ name: "set-language",
1432+ aliases: &["lang"],
1433+ doc: "Set the language of current buffer.",
1435+ completer: Some(completers::language),
1411 TypableCommand {
1437 TypableCommand {
1412 name: "set-option",
1438 name: "set-option",
1413 aliases: &["set"],
1439 aliases: &["set"],