aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs41
-rw-r--r--helix-term/src/keymap.rs1
2 files changed, 42 insertions, 0 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index c5c2ecf1..898981ae 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -888,6 +888,47 @@ pub fn unindent(cx: &mut Context) {
doc.append_changes_to_history();
}
+pub fn format_selections(cx: &mut Context) {
+ use helix_lsp::lsp;
+ let doc = cx.doc();
+
+ // via lsp if available
+ // else via tree-sitter indentation calculations
+
+ // TODO: blocking here is not ideal
+
+ let ranges: Vec<lsp::Range> = doc
+ .selection()
+ .ranges()
+ .iter()
+ .map(|range| {
+ helix_lsp::util::range_to_lsp_range(doc.text().slice(..), doc.selection().primary())
+ })
+ .collect();
+
+ for range in ranges {
+ let language_server = match doc.language_server.as_ref() {
+ Some(language_server) => language_server,
+ None => return,
+ };
+
+ // TODO: handle fails
+ // TODO: concurrent map
+ let edits = smol::block_on(language_server.text_document_range_formatting(
+ doc.identifier(),
+ range,
+ lsp::FormattingOptions::default(),
+ ))
+ .unwrap_or_default();
+
+ let transaction = helix_lsp::util::generate_transaction_from_edits(&doc.state, edits);
+
+ doc.apply(&transaction);
+ }
+
+ doc.append_changes_to_history();
+}
+
//
pub fn save(cx: &mut Context) {
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index ac4a2bf2..589740fc 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -178,6 +178,7 @@ pub fn default() -> Keymaps {
vec![key!('p')] => commands::paste,
vec![key!('>')] => commands::indent,
vec![key!('<')] => commands::unindent,
+ vec![key!('=')] => commands::format_selections,
vec![key!(':')] => commands::command_mode,
vec![Key {
code: KeyCode::Esc,