Skip to content

Commit

Permalink
Close joaotavora/eglot#50: Support snippet completions
Browse files Browse the repository at this point in the history
* eglot.el (eglot-client-capabilities): Declare support for
snippet-based completions.
(eglot-completion-at-point): Expand snippet completions with
YASnippet if that is found.
(eglot-note, eglot-warning, eglot-error): Diagnostic
overlay priorities have to be slightly lower than yasnippet's,
which must be reasonably high.
  • Loading branch information
joaotavora committed Aug 17, 2018
1 parent 16f24d9 commit 365adb8
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions lisp/progmodes/eglot.el
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,8 @@ let the buffer grow forever."
:synchronization (list
:dynamicRegistration :json-false
:willSave t :willSaveWaitUntil t :didSave t)
:completion `(:dynamicRegistration :json-false)
:completion (list :dynamicRegistration :json-false
:completionItem `(:snippetSupport t))
:hover `(:dynamicRegistration :json-false)
:signatureHelp `(:dynamicRegistration :json-false)
:references `(:dynamicRegistration :json-false)
Expand Down Expand Up @@ -956,13 +957,15 @@ Uses THING, FACE, DEFS and PREPEND."
(defalias 'eglot--make-diag 'flymake-make-diagnostic)
(defalias 'eglot--diag-data 'flymake-diagnostic-data)

(dolist (type '(eglot-error eglot-warning eglot-note))
(put type 'flymake-overlay-control
`((mouse-face . highlight)
(keymap . ,(let ((map (make-sparse-keymap)))
(define-key map [mouse-1]
(eglot--mouse-call 'eglot-code-actions))
map)))))
(cl-loop for i from 1
for type in '(eglot-note eglot-warning eglot-error )
do (put type 'flymake-overlay-control
`((mouse-face . highlight)
(priority . ,(+ 50 i))
(keymap . ,(let ((map (make-sparse-keymap)))
(define-key map [mouse-1]
(eglot--mouse-call 'eglot-code-actions))
map)))))


;;; Protocol implementation (Requests, notifications, etc)
Expand Down Expand Up @@ -1384,7 +1387,7 @@ is not active."
(items (if (vectorp resp) resp (plist-get resp :items))))
(mapcar
(jsonrpc-lambda (&rest all &key label insertText &allow-other-keys)
(let ((insert (or insertText label)))
(let ((insert (or insertText (string-trim-left label))))
(add-text-properties 0 1 all insert)
(put-text-property 0 1 'eglot--lsp-completion all insert)
insert))
Expand Down Expand Up @@ -1425,9 +1428,17 @@ is not active."
(erase-buffer)
(insert (eglot--format-markup documentation))
(current-buffer)))))
:exit-function (lambda (_string _status)
(eglot--signal-textDocument/didChange)
(eglot-eldoc-function))))))
:exit-function (lambda (obj _status)
(cl-destructuring-bind (&key insertTextFormat
insertText
&allow-other-keys)
(text-properties-at 0 obj)
(when (and (eql insertTextFormat 2)
(fboundp 'yas-expand-snippet))
(delete-region (- (point) (length obj)) (point))
(funcall 'yas-expand-snippet insertText))
(eglot--signal-textDocument/didChange)
(eglot-eldoc-function)))))))

(defvar eglot--highlights nil "Overlays for textDocument/documentHighlight.")

Expand Down

0 comments on commit 365adb8

Please sign in to comment.