Skip to content

Commit a94bcec

Browse files
authored
Fixes for lsp-ui-doc-glance (#711)
Fix lsp-ui-doc-glance
1 parent 0a6368d commit a94bcec

File tree

1 file changed

+41
-39
lines changed

1 file changed

+41
-39
lines changed

lsp-ui-doc.el

+41-39
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,10 @@ Because some variables are buffer local.")
242242
(defvar-local lsp-ui-doc--from-mouse nil
243243
"Non nil when the doc was triggered by a mouse event.")
244244
(defvar-local lsp-ui-doc--from-mouse-current nil
245-
"Non nil when the current call is triggered by a mouse event")
245+
"Non nil when the current call is triggered by a mouse event.")
246+
(defvar-local lsp-ui-doc--hide-on-next-command nil
247+
"Non-nil when the current document should ask to hide after next command.")
248+
246249

247250
(defconst lsp-ui-doc--buffer-prefix " *lsp-ui-doc-")
248251

@@ -292,6 +295,10 @@ Because some variables are buffer local.")
292295
;; Markdown 2.3.
293296
(defvar markdown-fontify-code-block-default-mode)
294297

298+
(defsubst lsp-ui-doc--inline-visible-p ()
299+
"Return inline documentation visibility."
300+
(and (overlayp lsp-ui-doc--inline-ov) (overlay-buffer lsp-ui-doc--inline-ov)))
301+
295302
(defun lsp-ui-doc--inline-wrapped-line (string)
296303
"Wraps a line of text (STRING) for inline display."
297304
(cond ((string-empty-p string) "")
@@ -418,18 +425,23 @@ We don't extract the string that `lps-line' is already displaying."
418425
(-when-let* ((xw (lsp-ui-doc--webkit-get-xwidget)))
419426
(xwidget-webkit-execute-script-rv xw script)))
420427

428+
(defvar-local lsp-ui-doc--unfocus-frame-timer nil)
429+
421430
(defun lsp-ui-doc--hide-frame (&optional _win)
422-
"Hide the frame."
431+
"Hide any documentation frame or overlay."
423432
(setq lsp-ui-doc--bounds nil
424433
lsp-ui-doc--from-mouse nil)
425434
(lsp-ui-util-safe-delete-overlay lsp-ui-doc--inline-ov)
426435
(lsp-ui-util-safe-delete-overlay lsp-ui-doc--highlight-ov)
436+
(remove-hook 'post-command-hook 'lsp-ui-doc--hide-frame)
427437
(when-let ((frame (lsp-ui-doc--get-frame)))
428438
(when (frame-visible-p frame)
429-
(make-frame-invisible frame))))
439+
(make-frame-invisible frame)))
440+
(setq lsp-ui-doc--unfocus-frame-timer
441+
(run-at-time 0 nil #'lsp-ui-doc-unfocus-frame)))
430442

431443
(defun lsp-ui-doc--buffer-width ()
432-
"Calcul the max width of the buffer."
444+
"Calculate the max width of the buffer."
433445
(lsp-ui-doc--with-buffer
434446
(save-excursion
435447
(let ((max 0))
@@ -817,16 +829,18 @@ HEIGHT is the documentation number of lines."
817829
(-let* ((height (lsp-ui-doc--inline-height))
818830
((start . end) (lsp-ui-doc--inline-pos height))
819831
(buffer-string (buffer-substring start end))
820-
(ov (if (overlayp lsp-ui-doc--inline-ov) lsp-ui-doc--inline-ov
832+
(ov (if (overlayp lsp-ui-doc--inline-ov)
833+
(progn
834+
(move-overlay lsp-ui-doc--inline-ov start end)
835+
lsp-ui-doc--inline-ov)
821836
(setq lsp-ui-doc--inline-ov (make-overlay start end)))))
822-
(move-overlay ov start end)
823837
(overlay-put ov 'face 'default)
824838
(overlay-put ov 'display (lsp-ui-doc--inline-merge buffer-string))
825839
(overlay-put ov 'lsp-ui-doc-inline t)
826840
(overlay-put ov 'window (selected-window))))
827841

828842
(defun lsp-ui-doc--inline-p ()
829-
"Return non-nil when the documentation should be display without a child frame."
843+
"Return non-nil when the documentation should be displayed without a child frame."
830844
(or (not lsp-ui-doc-use-childframe)
831845
(not (display-graphic-p))
832846
(not (fboundp 'display-buffer-in-child-frame))))
@@ -918,21 +932,22 @@ HEIGHT is the documentation number of lines."
918932
(lsp--capability "hoverProvider"))
919933
(-if-let (bounds (or (and (symbol-at-point) (bounds-of-thing-at-point 'symbol))
920934
(and (looking-at "[[:graph:]]") (cons (point) (1+ (point))))))
921-
(unless (equal lsp-ui-doc--bounds bounds)
935+
(unless (and (equal lsp-ui-doc--bounds bounds) (not lsp-ui-doc--hide-on-next-command))
922936
(lsp-ui-doc--hide-frame)
923937
(lsp-ui-util-safe-kill-timer lsp-ui-doc--timer)
924938
(setq lsp-ui-doc--timer
925939
(run-with-idle-timer
926940
lsp-ui-doc-delay nil
927-
(let ((buf (current-buffer)))
941+
(let ((buf (current-buffer))
942+
(hide lsp-ui-doc--hide-on-next-command))
928943
(lambda nil
929944
(when (equal buf (current-buffer))
930945
(lsp-request-async
931946
"textDocument/hover"
932947
(lsp--text-document-position-params)
933948
(lambda (hover)
934949
(when (equal buf (current-buffer))
935-
(lsp-ui-doc--callback hover bounds (current-buffer))))
950+
(lsp-ui-doc--callback hover bounds (current-buffer) hide)))
936951
:mode 'tick
937952
:cancel-token :lsp-ui-doc-hover)))))))
938953
(lsp-ui-doc--hide-frame))))
@@ -944,17 +959,21 @@ HEIGHT is the documentation number of lines."
944959
(end (-some-> (lsp:range-end data) lsp--position-to-point)))
945960
(cons start end)))
946961

947-
(lsp-defun lsp-ui-doc--callback ((hover &as &Hover? :contents) bounds buffer)
962+
(lsp-defun lsp-ui-doc--callback ((hover &as &Hover? :contents) bounds buffer hide)
948963
"Process the received documentation.
949964
HOVER is the doc returned by the LS.
950965
BOUNDS are points of the symbol that have been requested.
951-
BUFFER is the buffer where the request has been made."
966+
BUFFER is the buffer where the request has been made.
967+
When HIDE is non-nil, hide the doc on next command."
952968
(let ((bounds (or (lsp-ui-doc--extract-bounds hover) bounds)))
953969
(if (and hover
954970
(>= (point) (car bounds))
955971
(<= (point) (cdr bounds))
956972
(eq buffer (current-buffer)))
957973
(progn
974+
(lsp-ui-util-safe-kill-timer lsp-ui-doc--unfocus-frame-timer)
975+
(when hide
976+
(add-hook 'post-command-hook 'lsp-ui-doc--hide-frame))
958977
(setq lsp-ui-doc--bounds bounds)
959978
(lsp-ui-doc--display
960979
(thing-at-point 'symbol t)
@@ -972,9 +991,8 @@ BUFFER is the buffer where the request has been made."
972991

973992
(defun lsp-ui-doc--visible-p ()
974993
"Return whether the LSP UI doc is visible"
975-
(or (overlayp lsp-ui-doc--inline-ov)
976-
(and (lsp-ui-doc--get-frame)
977-
(frame-visible-p (lsp-ui-doc--get-frame)))))
994+
(or (lsp-ui-doc--inline-visible-p)
995+
(lsp-ui-doc--frame-visible-p)))
978996

979997
(defun lsp-ui-doc-hide-frame-on-window-change (fun window &optional no-record)
980998
"Delete the child frame if currently selected window changes.
@@ -1006,8 +1024,7 @@ before, or if the new window is the minibuffer."
10061024
(or (not (eq (selected-window) (frame-parameter frame 'lsp-ui-doc--window-origin)))
10071025
(not (eq (window-buffer) (frame-parameter frame 'lsp-ui-doc--buffer-origin))))
10081026
(if on-idle (lsp-ui-doc--hide-frame)
1009-
(and (timerp lsp-ui-doc--timer-on-changes)
1010-
(cancel-timer lsp-ui-doc--timer-on-changes))
1027+
(lsp-ui-util-safe-kill-timer lsp-ui-doc--timer-on-changes)
10111028
(setq lsp-ui-doc--timer-on-changes
10121029
(run-with-idle-timer 0 nil (lambda nil (lsp-ui-doc--on-state-changed frame t))))))))
10131030

@@ -1064,16 +1081,15 @@ Argument WIN is current applying window."
10641081
(goto-char lsp-ui-doc--last-event)
10651082
(let ((lsp-ui-doc-position 'at-point)
10661083
(lsp-ui-doc--from-mouse-current t))
1067-
(lsp-ui-doc--callback hover bounds (current-buffer)))))
1084+
(lsp-ui-doc--callback hover bounds (current-buffer) nil))))
10681085
:mode 'tick
10691086
:cancel-token :lsp-ui-doc-hover))))))
10701087

10711088
(defun lsp-ui-doc--handle-mouse-movement (event)
10721089
"Show the documentation corresponding to the text under EVENT."
10731090
(interactive "e")
10741091
(when lsp-ui-doc-show-with-mouse
1075-
(and (timerp lsp-ui-doc--timer-mouse-movement)
1076-
(cancel-timer lsp-ui-doc--timer-mouse-movement))
1092+
(lsp-ui-util-safe-kill-timer lsp-ui-doc--timer-mouse-movement)
10771093
(let* ((e (cadr event))
10781094
(point (posn-point e))
10791095
(same-win (eq (selected-window) (posn-window e))))
@@ -1155,34 +1171,20 @@ It is supposed to be called from `lsp-ui--toggle'"
11551171
(defun lsp-ui-doc-show ()
11561172
"Trigger display hover information popup."
11571173
(interactive)
1158-
(lsp-ui-doc--callback (lsp-request "textDocument/hover" (lsp--text-document-position-params))
1159-
(or (bounds-of-thing-at-point 'symbol) (cons (point) (1+ (point))))
1160-
(current-buffer)))
1174+
(let ((lsp-ui-doc-show-with-cursor t)
1175+
(lsp-ui-doc-delay 0))
1176+
(lsp-ui-doc--make-request)))
11611177

11621178
(defun lsp-ui-doc-hide ()
11631179
"Hide hover information popup."
11641180
(interactive)
11651181
(lsp-ui-doc--hide-frame))
11661182

1167-
(defvar-local lsp-ui-doc--unfocus-frame-timer nil)
1168-
(defun lsp-ui-doc--glance-hide-frame ()
1169-
"Hook to hide hover information popup for `lsp-ui-doc-glance'."
1170-
(when (or (overlayp lsp-ui-doc--inline-ov)
1171-
(lsp-ui-doc--frame-visible-p))
1172-
(lsp-ui-doc--hide-frame)
1173-
(remove-hook 'post-command-hook 'lsp-ui-doc--glance-hide-frame)
1174-
;; make sure child frame is unfocused
1175-
(setq lsp-ui-doc--unfocus-frame-timer
1176-
(run-at-time 1 nil #'lsp-ui-doc-unfocus-frame))))
1177-
11781183
(defun lsp-ui-doc-glance ()
11791184
"Trigger display hover information popup and hide it on next typing."
11801185
(interactive)
1181-
(let ((lsp-ui-doc-show-with-cursor t))
1182-
(lsp-ui-doc--make-request))
1183-
(when lsp-ui-doc--unfocus-frame-timer
1184-
(cancel-timer lsp-ui-doc--unfocus-frame-timer))
1185-
(add-hook 'post-command-hook 'lsp-ui-doc--glance-hide-frame))
1186+
(let ((lsp-ui-doc--hide-on-next-command t))
1187+
(lsp-ui-doc-show)))
11861188

11871189
(define-minor-mode lsp-ui-doc-frame-mode
11881190
"Marker mode to add additional key bind for lsp-ui-doc-frame."

0 commit comments

Comments
 (0)