如何配置 emacs-lsp 的变量提示使用 posframe 显示?

在使用 lsp-mode 时,可以将鼠标悬浮到变量上面,然后在屏幕左下角的 minibuffer 里面会出现关于当前变量的类型/注释的提示。但是在屏幕很长,或者当前代码处在屏幕最上方的时候,这样查看就很不方便。请教各位大佬,能不能将这个提示配置成类似 atom 或者 vscode 那样的直接悬浮显示在当前变量上方的样式?

相信我,悬浮更不方便,会挡住很多内容,还不敢打字和移动光标,因为一打字/移动悬浮框就没了。

建议绑定一个快捷键,把光标当前所在的文档等提示在新buffer中打开。这样可以边看边写,多年下来的最佳体验,悬浮框和minibuffer仅仅适合非常短小的看一眼就能记住的信息,比如参数类型。

5 个赞

可以,这个方法还是挺方便的

这是我的配置,可参考

      (defvar eldoc-posframe-buffer "*eldoc-posframe-buffer*"
        "The posframe buffer name use by eldoc-posframe.")

      (defvar eldoc-posframe-hide-posframe-hooks
        '(pre-command-hook post-command-hook focus-out-hook)
        "The hooks which should trigger automatic removal of the posframe.")

      (defvar eldoc-posframe-delay 0.2
        "Delay seconds to display `eldoc'.")

      (defvar-local eldoc-posframe--timer nil)

      (defun eldoc-posframe-hide-posframe ()
        "Hide messages currently being shown if any."
        (when eldoc-posframe--timer
          (cancel-timer eldoc-posframe--timer))

        (posframe-hide eldoc-posframe-buffer)
        (dolist (hook eldoc-posframe-hide-posframe-hooks)
          (remove-hook hook #'eldoc-posframe-hide-posframe t)))

      (defun eldoc-posframe-show-posframe (str &rest args)
        "Display STR with ARGS."
        (when eldoc-posframe--timer
          (cancel-timer eldoc-posframe--timer))

        (posframe-hide eldoc-posframe-buffer)
        (dolist (hook eldoc-posframe-hide-posframe-hooks)
          (add-hook hook #'eldoc-posframe-hide-posframe nil t))

        (setq eldoc-posframe--timer
              (run-with-idle-timer
               eldoc-posframe-delay nil
               (lambda ()
                 (when str
                   (posframe-show
                    eldoc-posframe-buffer
                    :string (apply #'format str args)
                    :postion (point)
                    :poshandler #'posframe-poshandler-point-bottom-left-corner-upward
                    :left-fringe 8
                    :right-fringe 8
                    :internal-border-width 1
                    :internal-border-color (face-attribute 'font-lock-comment-face :foreground)
                    :background-color (face-background 'tooltip)))))))

     (setq eldoc-message-function #'eldoc-posframe-show-posframe)
3 个赞

嗯,这样的话对于读代码还是很方便 :smile: 感谢分享配置

:grinning: 这个配置真好,拿走了,谢谢

@nujabse @vinurs 不客气。更多配置请参考:Centaur Emacs。init-lsp.el 还有关于lsp-ui的配置。

1 个赞

这个方法好👍🏻

打扰, 对你说的这种功能很感兴趣, 问一下有没有已有的package或配置可以参考(baipiao) :stuck_out_tongue_closed_eyes:

eldoc 为什么每移动一次,都要重新调用一下 eldoc-message-function ?