aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/commands.rs33
1 files changed, 28 insertions, 5 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 1a851413..5ced5ad0 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -864,11 +864,34 @@ pub fn completion(cx: &mut Context) {
// TODO: use item.filter_text for filtering
},
|editor: &mut Editor, item| {
- // if item.text_edit is Some we use that, else
- // let insert_text = &item.insert_text.unwrap_or(item.label);
- // and we insert at position.
- //
- // merge this with additional_text_edits
+ use helix_lsp::{lsp, util};
+ // determine what to insert: text_edit | insert_text | label
+ let edit = if let Some(edit) = &item.text_edit {
+ match edit {
+ lsp::CompletionTextEdit::Edit(edit) => edit.clone(),
+ lsp::CompletionTextEdit::InsertAndReplace(item) => {
+ unimplemented!("completion: insert_and_replace {:?}", item)
+ }
+ }
+ } else {
+ item.insert_text.as_ref().unwrap_or(&item.label);
+ unimplemented!();
+ // lsp::TextEdit::new(); TODO: calculate a TextEdit from insert_text
+ // and we insert at position.
+ };
+
+ // TODO: merge edit with additional_text_edits
+ if let Some(additional_edits) = &item.additional_text_edits {
+ if !additional_edits.is_empty() {
+ unimplemented!("completion: additional_text_edits: {:?}", additional_edits);
+ }
+ }
+
+ let view = editor.view_mut().unwrap();
+ let transaction =
+ util::generate_transaction_from_edits(&view.doc.state, vec![edit]);
+ view.doc.apply(&transaction);
+ // TODO: append_changes_to_history(cx); if not in insert mode?
},
);