Display childframe alongside company popup
This commit is contained in:
		
							parent
							
								
									5dbd37009e
								
							
						
					
					
						commit
						f292d28712
					
				
							
								
								
									
										55
									
								
								eldoc-box.el
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								eldoc-box.el
									
									
									
									
									
								
							| @ -219,9 +219,8 @@ WINDOW nil means use selected window." | ||||
| 	(cons (+ (nth 0 edges) (nth 0 pos-in-window)) | ||||
| 	      (+ (nth 1 edges) (nth 1 pos-in-window))))))) | ||||
| 
 | ||||
| (defun eldoc-box--default-at-point-position-function (width height) | ||||
|   "Set `eldoc-box-position-function' to this function to have childframe appear under point. | ||||
| Position is calculated base on WIDTH and HEIGHT of childframe text window" | ||||
| (defun eldoc-box--default-at-point-position-function-1 (width height) | ||||
|   "See `eldoc-box--default-at-point-position-function'." | ||||
|   (let* ((point-pos (eldoc-box--point-position-relative-to-native-frame)) | ||||
|          ;; calculate point coordinate relative to native frame | ||||
|          ;; because childframe coordinate is relative to native frame | ||||
| @ -243,6 +242,15 @@ Position is calculated base on WIDTH and HEIGHT of childframe text window" | ||||
|             ;; normal, just return y + em | ||||
|             (+ y em))))) | ||||
| 
 | ||||
| (defun eldoc-box--default-at-point-position-function (width height) | ||||
|   "Set `eldoc-box-position-function' to this function to have childframe appear under point. | ||||
| Position is calculated base on WIDTH and HEIGHT of childframe text window." | ||||
|   (let* ((pos (eldoc-box--default-at-point-position-function-1 width height)) | ||||
|          (x (car pos)) | ||||
|          (y (cdr pos))) | ||||
|     (cons (or (eldoc-box--at-point-x-by-company) x) | ||||
|           y))) | ||||
| 
 | ||||
| (defun eldoc-box--get-frame (buffer) | ||||
|   "Return a childframe displaying BUFFER. | ||||
| Checkout `lsp-ui-doc--make-frame', `lsp-ui-doc--move-frame'." | ||||
| @ -370,41 +378,28 @@ If (point) != last point, cleanup frame.") | ||||
|     (let ((eldoc-box-position-function #'eldoc-box--default-at-point-position-function)) | ||||
|       (eldoc-box--display | ||||
|        (eglot--dbind ((Hover) contents range) | ||||
|            (jsonrpc-request (eglot--current-server-or-lose) :textDocument/hover | ||||
|                             (eglot--TextDocumentPositionParams)) | ||||
|          (when (seq-empty-p contents) (eglot--error "No hover info here")) | ||||
|          (eglot--hover-info contents range)))) | ||||
|                      (jsonrpc-request (eglot--current-server-or-lose) :textDocument/hover | ||||
|                                       (eglot--TextDocumentPositionParams)) | ||||
|                      (when (seq-empty-p contents) (eglot--error "No hover info here")) | ||||
|                      (eglot--hover-info contents range)))) | ||||
|     (setq eldoc-box-eglot-help-at-point-last-point (point)) | ||||
|     (run-with-timer 0.1 nil #'eldoc-box--eglot-help-at-point-cleanup))) | ||||
| 
 | ||||
| ;;;; Comany compatibility | ||||
| ;; | ||||
| ;; Hide childframe when company pops up | ||||
| 
 | ||||
| (defvar eldoc-box--chilframe-visible-before-company-popup nil | ||||
|   "Set to t if company kills childframe for its popup.") | ||||
| ;; see also `eldoc-box--default-at-point-position-function' | ||||
| 
 | ||||
| (defun eldoc-box--company-on-hook (&rest _) | ||||
|   "Hide at-point doc when company popup show up." | ||||
|   (eldoc-box-hover-mode -1) | ||||
|   (when eldoc-box-hover-at-point-mode | ||||
|     (eldoc-box-quit-frame))) | ||||
| ;; please compiler | ||||
| (defvar company-pseudo-tooltip-overlay) | ||||
| 
 | ||||
| (defun eldoc-box--company-cancel-hook (&rest _) | ||||
|   "Show doc when company canceled completion." | ||||
|   (eldoc-box-hover-mode) | ||||
|   (when (and eldoc-box-hover-at-point-mode | ||||
|              eldoc-box--chilframe-visible-before-company-popup) | ||||
|     (eldoc-box-show-frame))) | ||||
| 
 | ||||
| (defun eldoc-box--company-finish-hook (&rest _) | ||||
|   "Show doc when company finished completion." | ||||
|   (eldoc-box--company-cancel-hook)) | ||||
| 
 | ||||
| (with-eval-after-load 'company | ||||
|   (add-hook 'company-completion-started-hook #'eldoc-box--company-on-hook t) | ||||
|   (add-hook 'company-completion-cancelled-hook #'eldoc-box--company-cancel-hook t) | ||||
|   (add-hook 'company-completion-finished-hook #'eldoc-box--company-finish-hook t)) | ||||
| (defun eldoc-box--at-point-x-by-company () | ||||
|   "Return the x position that accommodates company's popup." | ||||
|   (if (and (featurep 'company) company-pseudo-tooltip-overlay) | ||||
|       (* (frame-char-width) | ||||
|          (+ (overlay-get company-pseudo-tooltip-overlay 'company-width) | ||||
|             (overlay-get company-pseudo-tooltip-overlay 'company-column))) | ||||
|     nil)) | ||||
| 
 | ||||
| (provide 'eldoc-box) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Yuan Fu
						Yuan Fu