emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/eglot ee7f9c6 43/45: Fix #167: correctly insert TextEdi


From: João Távora
Subject: [elpa] externals/eglot ee7f9c6 43/45: Fix #167: correctly insert TextEdit-less snippets
Date: Thu, 22 Nov 2018 19:15:34 -0500 (EST)

branch: externals/eglot
commit ee7f9c657f1b9f4ecdb5212cc4c50e30be83560a
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    Fix #167: correctly insert TextEdit-less snippets
    
    Fixes a slight regression from #160.
    
    * eglot.el (eglot-completion-at-point): When there is plain
    `insertText' snippet, delete the full completion text.
---
 eglot.el | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/eglot.el b/eglot.el
index f4a02ac..9ff9cdf 100644
--- a/eglot.el
+++ b/eglot.el
@@ -1612,24 +1612,31 @@ is not active."
                                         bounds
                                         &allow-other-keys)
                (text-properties-at 0 comp)
-             (let ((fn (and (eql insertTextFormat 2)
-                            (eglot--snippet-expansion-fn))))
-               (when (or fn textEdit)
-                 ;; Undo the completion.  If before completion the buffer was
-                 ;; "foo.b" and now is "foo.bar", `comp' will be "bar".  We
-                 ;; want to delete only "ar" (`comp' minus the symbol whose
-                 ;; bounds we've calculated before) (github#160).
-                 (delete-region (+ (- (point) (length comp))
-                                   (if bounds (- (cdr bounds) (car bounds)) 0))
-                                (point)))
+             (let ((snippet-fn (and (eql insertTextFormat 2)
+                                    (eglot--snippet-expansion-fn))))
                (cond (textEdit
+                      ;; Undo the just the completed bit.  If before
+                      ;; completion the buffer was "foo.b" and now is
+                      ;; "foo.bar", `comp' will be "bar".  We want to
+                      ;; delete only "ar" (`comp' minus the symbol
+                      ;; whose bounds we've calculated before)
+                      ;; (github#160).
+                      (delete-region (+ (- (point) (length comp))
+                                        (if bounds (- (cdr bounds) (car 
bounds)) 0))
+                                     (point))
                       (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)))
+                          (funcall (or snippet-fn #'insert) newText)))
                       (eglot--apply-text-edits additionalTextEdits))
-                     (fn (funcall fn insertText))))
+                     (snippet-fn
+                      ;; A snippet should be inserted, but using plain
+                      ;; `insertText'.  This requires us to delete the
+                      ;; whole completion, since `insertText' is the full
+                      ;; completion's text.
+                      (delete-region (- (point) (length comp)) (point))
+                      (funcall snippet-fn insertText))))
              (eglot--signal-textDocument/didChange)
              (eglot-eldoc-function))))))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]