From 7307481d726efc948f569ef3a6cdfda3ae492526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Krzywkowski?= Date: Wed, 31 Oct 2018 20:59:30 +0100 Subject: [PATCH] Add support for TextEdits in completion * eglot.el (eglot-completion-at-point): Apply the CompletionItem's :textEdit and :additionalTextEdits when they're present. --- lisp/progmodes/eglot.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 24f8c971f9..d4a8b6f8a3 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -1584,12 +1584,23 @@ is not active." (cl-find comp strings :test #'string=)))) (cl-destructuring-bind (&key insertTextFormat insertText + textEdit + additionalTextEdits &allow-other-keys) (text-properties-at 0 comp) - (when-let ((fn (and (eql insertTextFormat 2) - (eglot--snippet-expansion-fn)))) - (delete-region (- (point) (length comp)) (point)) - (funcall fn insertText)) + (let ((fn (and (eql insertTextFormat 2) + (eglot--snippet-expansion-fn)))) + (when (or fn textEdit) + ;; Undo the completion + (delete-region (- (point) (length comp)) (point))) + (cond (textEdit + (cl-destructuring-bind (&key range newText) textEdit + (pcase-let ((`(,beg . ,end) (eglot--range-region range))) + (delete-region beg end) + (goto-char beg) + (funcall (or fn #'insert) newText))) + (eglot--apply-text-edits additionalTextEdits)) + (fn (funcall fn insertText)))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function))))))))