branch: externals/eglot commit 764347d24c9894b0de3a7aca2a7ea5b2d691c4e2 Author: João Távora <joaotav...@gmail.com> Commit: João Távora <joaotav...@gmail.com>
New command eglot-help-at-point and a README update * README.md (Commands and keybindings): New section. * eglot.el (eglot-eldoc-function): Use eglot--hover-info. Don't care about kind in highlightSymbol (eglot--hover-info): New helper. (eglot-help-at-point): New command. --- README.md | 25 +++++++++++++++++++++++++ eglot.el | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8a94466..a3789a4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,31 @@ Let me know how well it works and I'll add it to the list, or submit a PR. You can also enter a `server:port` pattern to connect to an LSP server. To skip the guess and always be prompted use `C-u M-x eglot`. +# Commands and keybindings + +Here's a summary of available commands: + +- `M-x eglot-reconnect` reconnects to the server + +- `M-x eglot-rename` asks the server to rename the symbol at point + +- `M-x eglot-help-at-point` asks the server for help for symbol at + point. Currently this is what `eldoc-mode` displays in the echo + area. + +- `M-x eglot-events-buffer` jumps to the events buffer for debugging + communication with the server. + +There are *no keybindings* specific to Eglot, but you can bind stuff +in `eglot-mode-map`, which is active as long as Eglot is managing a +file in your project. The commands don't need to be eglot-specific, +either: + +``` +(define-key eglot-mode-map (kbd "C-c h") 'eglot-help-at-point) +(define-key eglot-mode-map (kbd "<f6>") 'xref-find-definitions) +``` + # Supported Protocol features ## General diff --git a/eglot.el b/eglot.el index c8612cf..13f6f61 100644 --- a/eglot.el +++ b/eglot.el @@ -1314,6 +1314,28 @@ DUMMY is ignored" (defvar eglot--highlights nil "Overlays for textDocument/documentHighlight.") +(defun eglot--hover-info (contents &optional range) + (concat (and range + (eglot--with-lsp-range (beg end) range + (concat (buffer-substring beg end) ": "))) + (mapconcat #'eglot--format-markup + (append + (cond ((vectorp contents) + contents) + (contents + (list contents)))) "\n"))) + +(defun eglot-help-at-point () + "Request \"hover\" information for the thing at point." + (interactive) + (cl-destructuring-bind (&key contents range) + (eglot--request (eglot--current-process-or-lose) :textDocument/hover + (eglot--TextDocumentPositionParams)) + (when (seq-empty-p contents) (eglot--error "No hover info here")) + (with-help-window "*eglot help*" + (with-current-buffer standard-output + (insert (eglot--hover-info contents range)))))) + (defun eglot-eldoc-function () "EGLOT's `eldoc-documentation-function' function." (let ((buffer (current-buffer)) @@ -1325,17 +1347,7 @@ DUMMY is ignored" :success-fn (eglot--lambda (&key contents range) (when (get-buffer-window buffer) (with-current-buffer buffer - (eldoc-message - (concat - (and range - (eglot--with-lsp-range (beg end) range - (concat (buffer-substring beg end) ": "))) - (mapconcat #'eglot--format-markup - (append - (cond ((vectorp contents) - contents) - (contents - (list contents)))) "\n")))))) + (eldoc-message (eglot--hover-info contents range))))) :deferred :textDocument/hover)) (when (eglot--server-capable :documentHighlightProvider) (eglot--async-request @@ -1346,12 +1358,11 @@ DUMMY is ignored" (when (get-buffer-window buffer) (with-current-buffer buffer (eglot--mapply - (eglot--lambda (&key range kind) + (eglot--lambda (&key range _kind) (eglot--with-lsp-range (beg end) range (let ((ov (make-overlay beg end))) (overlay-put ov 'face 'highlight) (overlay-put ov 'evaporate t) - (overlay-put ov :kind kind) ov))) highlights))))) :deferred :textDocument/documentHighlight))) @@ -1482,3 +1493,7 @@ Proceed? " (provide 'eglot) ;;; eglot.el ends here + +;; Local Variables: +;; checkdoc-force-docstrings-flag: nil +;; End: