mirror of https://github.com/lapce/lapce.git
Format the document before auto-saving. (#3527)
* Format the document before auto-saving. * check format_on_save * 1. Verify rev-matching
This commit is contained in:
parent
ea9b7a9c9c
commit
a99ce3e626
|
@ -67,7 +67,7 @@
|
||||||
};
|
};
|
||||||
use lsp_types::{
|
use lsp_types::{
|
||||||
CodeActionOrCommand, CodeLens, Diagnostic, DiagnosticSeverity,
|
CodeActionOrCommand, CodeLens, Diagnostic, DiagnosticSeverity,
|
||||||
DocumentSymbolResponse, InlayHint, InlayHintLabel,
|
DocumentSymbolResponse, InlayHint, InlayHintLabel, TextEdit,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
@ -678,14 +678,36 @@ fn do_bracket_colorization(&self) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn do_text_edit(&self, edits: &[TextEdit]) {
|
||||||
|
let edits = self.buffer.with_untracked(|buffer| {
|
||||||
|
let edits = edits
|
||||||
|
.iter()
|
||||||
|
.map(|edit| {
|
||||||
|
let selection = lapce_core::selection::Selection::region(
|
||||||
|
buffer.offset_of_position(&edit.range.start),
|
||||||
|
buffer.offset_of_position(&edit.range.end),
|
||||||
|
);
|
||||||
|
(selection, edit.new_text.as_str())
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
edits
|
||||||
|
});
|
||||||
|
self.do_raw_edit(&edits, EditType::Completion);
|
||||||
|
}
|
||||||
|
|
||||||
fn check_auto_save(&self) {
|
fn check_auto_save(&self) {
|
||||||
let config = self.common.config.get_untracked();
|
let config = self.common.config.get_untracked();
|
||||||
if config.editor.autosave_interval > 0 {
|
if config.editor.autosave_interval > 0 {
|
||||||
if !self.content.with_untracked(|c| c.is_file()) {
|
let Some(path) =
|
||||||
|
self.content.with_untracked(|c| c.path().map(|x| x.clone()))
|
||||||
|
else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let rev = self.rev();
|
let rev = self.rev();
|
||||||
let doc = self.clone();
|
let doc = self.clone();
|
||||||
|
let scope = self.scope;
|
||||||
|
let proxy = self.common.proxy.clone();
|
||||||
|
let format = config.editor.format_on_save;
|
||||||
exec_after(
|
exec_after(
|
||||||
Duration::from_millis(config.editor.autosave_interval),
|
Duration::from_millis(config.editor.autosave_interval),
|
||||||
move |_| {
|
move |_| {
|
||||||
|
@ -701,7 +723,26 @@ fn check_auto_save(&self) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if format {
|
||||||
|
let send = create_ext_action(scope, move |result| {
|
||||||
|
let current_rev = doc.rev();
|
||||||
|
if current_rev != rev {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if let Ok(ProxyResponse::GetDocumentFormatting {
|
||||||
|
edits,
|
||||||
|
}) = result
|
||||||
|
{
|
||||||
|
doc.do_text_edit(&edits);
|
||||||
|
}
|
||||||
doc.save(|| {});
|
doc.save(|| {});
|
||||||
|
});
|
||||||
|
proxy.get_document_formatting(path, move |result| {
|
||||||
|
send(result);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
doc.save(|| {});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue