diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 674f6d23..69e335dc 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -890,12 +890,12 @@ mod cmd { } fn write(editor: &mut Editor, args: &[&str], event: PromptEvent) { - let id = editor.view().doc; - let doc = &mut editor.documents[id]; + let (view, doc) = editor.current(); if doc.path().is_none() { editor.set_error("cannot write a buffer without a filename".to_string()); return; } + doc.format(view.id); // TODO: merge into save tokio::spawn(doc.save()); } @@ -906,25 +906,7 @@ mod cmd { fn format(editor: &mut Editor, args: &[&str], event: PromptEvent) { let (view, doc) = editor.current(); - if let Some(language_server) = doc.language_server() { - // TODO: await, no blocking - let transaction = helix_lsp::block_on( - language_server - .text_document_formatting(doc.identifier(), lsp::FormattingOptions::default()), - ) - .map(|edits| { - helix_lsp::util::generate_transaction_from_edits( - doc.text(), - edits, - language_server.offset_encoding(), - ) - }); - - if let Ok(transaction) = transaction { - doc.apply(&transaction, view.id); - doc.append_changes_to_history(view.id); - } - } + doc.format(view.id) } pub const COMMAND_LIST: &[Command] = &[ @@ -2277,7 +2259,8 @@ pub fn space_mode(cx: &mut Context) { 'v' => vsplit(cx), 'w' => { // save current buffer - let doc = cx.doc(); + let (view, doc) = cx.current(); + doc.format(view.id); // TODO: merge into save tokio::spawn(doc.save()); } 'c' => { diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 814777f8..7d912ec0 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -116,6 +116,29 @@ impl Document { Ok(doc) } + // TODO: remove view_id dependency here + pub fn format(&mut self, view_id: ViewId) { + if let Some(language_server) = self.language_server() { + // TODO: await, no blocking + let transaction = helix_lsp::block_on( + language_server + .text_document_formatting(self.identifier(), lsp::FormattingOptions::default()), + ) + .map(|edits| { + helix_lsp::util::generate_transaction_from_edits( + self.text(), + edits, + language_server.offset_encoding(), + ) + }); + + if let Ok(transaction) = transaction { + self.apply(&transaction, view_id); + self.append_changes_to_history(view_id); + } + } + } + // TODO: do we need some way of ensuring two save operations on the same doc can't run at once? // or is that handled by the OS/async layer pub fn save(&mut self) -> impl Future> {