看到 Peek definition with Emacs frame 中介绍的代码 peek 功能。
自己最近在探索使用 lsp-bridge。
就自己改造了一下:
;; @See: https://tuhdo.github.io/emacs-frame-peek.html
(defun make-peek-frame (func filename filehost position)
"Make a new frame for peeking definition"
(let (summary
doc-frame
x y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1. Find the absolute position of the current beginning of the symbol at point, ;;
;; in pixels. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(abs-pixel-pos (save-excursion
(beginning-of-thing 'symbol)
(window-absolute-pixel-position))))
(setq x (car abs-pixel-pos))
;; (setq y (cdr abs-pixel-pos))
(setq y (+ (cdr abs-pixel-pos) (frame-char-height)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 2. Create a new invisible frame, with the current buffer in it. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq doc-frame (make-frame '((minibuffer . nil)
(name . "*RTags Peek*")
(width . 80)
(visibility . nil)
(height . 15))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 3. Position the new frame right under the beginning of the symbol at point. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-frame-position doc-frame x y)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 4. Jump to the symbol at point. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(with-selected-frame doc-frame
(funcall func filename filehost position)
;; (read-only-mode)
(when semantic-stickyfunc-mode (semantic-stickyfunc-mode -1))
(recenter-top-bottom 0))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 5. Make frame visible again ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(make-frame-visible doc-frame)
(select-frame-set-input-focus doc-frame)))
(advice-add #'lsp-bridge-define--jump :around #'make-peek-frame)
(add-hook 'prog-mode-hook #'(lambda () (local-set-key (kbd "<f3>") #'lsp-bridge-find-def)))
上面的代码在 Emacs 28.3 下一直在正常使用。
今天升级 Emacs 为 29.3,后就出现情况。
具体是按下 F3 调用 lsp-bridge-find-def,peek frame 一直没有弹出(在 28.3 是会弹出),需要我让 Emacs 失去焦点(比如鼠标移动到其他程序),再切换回 Emacs,peek frame 才会弹出。
不知道为啥?如何解决?
补充: 现在我发现:要是在程序窗口另外开一个窗口,就可以正常弹出。
主 frame 里开一个窗口和多个窗口,有什么区别吗?会导致这种行为差异?