From: Michal Krzywkowski Date: Wed, 31 Oct 2018 19:59:30 +0000 (+0100) Subject: Add support for textedits in completion X-Git-Tag: emacs-29.0.90~1616^2~524^2~4^2~400 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5c97238692a5dcecbefeeaf21b8a4344caca3275;p=emacs.git Add support for textedits in completion * eglot.el (eglot-completion-at-point): Apply the CompletionItem's :textEdit and :additionalTextEdits when they're present. --- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 24f8c971f91..d4a8b6f8a33 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))))))))