伙计们,讨论eldoc-mouse到这里。

实不相瞒,在做这个package 之前,我对elisp 几乎一点不懂。而且还有那么一点天然的畏惧感,现在依然知道得不多,但是畏惧感消失了。

1 个赞

@huangfeiyu 我将emacs 30.2自带的eglot与eldoc升级到最新版之后,安装eldoc-mouse总是会报recursive load错误。而用原本自带的eglot与eldoc可以正常安装,这是bug吗?

最新版的eglot 是1. 21吗?1.21没有问题。你是怎么安装的呢?

eglot是1.21,eldoc是1.16,eldoc-mouse配置如下

(use-package eldoc-mouse
  :ensure t
  :bind (:map eldoc-mouse-mode-map
              ("<f1> <f1>" . eldoc-mouse-pop-doc-at-cursor)) ;; optional
  :hook eldoc-mode
  :config
  (diminish 'eldoc-mouse-mode)
  )

错误信息如下

File mode specification error: (error Recursive load /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln /home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln /home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln /home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln /home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln /home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln /home/xiangsheng/.emacs.d/.emacs.desktop)
run-hooks: Recursive load: "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln", "/home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln", "/home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln", "/home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln", "/home/xiangsheng/.emacs.d/elpa-30.2/eldoc-1.16.0/eldoc.elc", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eglot-195fe3f2-1f21bd1b.eln", "/home/xiangsheng/.emacs.d/eln-cache/30.2-6a8b22b2/eldoc-mouse-613c0abd-a00bb23f.eln", "/home/xiangsheng/.emacs.d/.emacs.desktop"

经测试去掉配置中:hook eldoc-mode可以正常安装,原因不明。

能复现你说的错误,现在还不知道原因。 把:hook eldoc-mode换成:hook (eglot-managed-mode emacs-lisp-mode)能工作。

应该跟包加载顺序有关系,如果不用自带的eglot, eldoc,就请使用

:hook (eglot-managed-mode emacs-lisp-mode)

不要用

:hook eldoc-mode

很多mode都用到eldoc,比如python-mode,现在只能是用到一个添加一个了吗?

你用python的时候用不用eglot嘛?如果你也用eglot, 下面的配置几乎够用了

:hook (eglot-managed-mode emacs-lisp-mode)

我就是打个比方 :laughing:,eglot还需要开server确实是不怎么用。最好还是能解决eldoc的加载顺序问题。说来eglot本身也依赖于eldoc,加载也是正常的啊。

说来eglot本身也依赖于eldoc,加载也是正常的啊。

:hook eldoc-mode 这一句可能会导致emacs 加载eldoc时去加载eldoc-mouse, 而eldoc-mouse 依赖于eglot 和eldoc, 于是去加载eglot, 而eglot 依赖于eldoc, 又去加载eldoc 就出问题了。

如果用emacs 内置的eldoc, eldoc 加载得应该比较早,就没有循环加载的问题,这些是我的猜测。

我就是打个比方 :laughing:,eglot还需要开server确实是不怎么用。

通常在不用eglot 的情况下,除了elisp mode, eldoc 的文档就是个签名,没有多大价值用eldoc-mouse去popup 吧。所以在除了elisp 以外的buffer 使用eldoc-mouse, 通常也是结合eglot 的。

把下面这两句放在前面也能解决这个问题

(use-package eldoc :ensure t)
(use-package eglot :ensure t)

加上你的配置也就是

(use-package eldoc :ensure t)
(use-package eglot :ensure t)
(use-package eldoc-mouse
  :ensure t
  :bind (:map eldoc-mouse-mode-map
              ("<f1> <f1>" . eldoc-mouse-pop-doc-at-cursor)) ;; optional
  :hook eldoc-mode
  :config
  (diminish 'eldoc-mouse-mode)
  )

在我看来这个包加载顺序的问题应该在用户端用配置解决,@seagle0128 你对这个问题有什么见解呢?

应该是跟使用内置还是elpa的eldoc包有关系。

eldoc使用builtlin包不会有问题,因为它启动时自动就加载启用了。

(use-package eldoc-mouse
  :after eldoc
  :diminish
  :ensure t
  :bind (:map eldoc-mouse-mode-map
         ("<f1> <f1>" . eldoc-mouse-pop-doc-at-cursor))
  :hook eldoc-mode)

如果要使用elpa最新的包1.16,就必须先按照和加载。

(use-package eldoc :ensure t)
(use-package eglot :ensure t)
(use-package eldoc-mouse
  :diminish
  :ensure t
  :bind (:map eldoc-mouse-mode-map
         ("<f1> <f1>" . eldoc-mouse-pop-doc-at-cursor))
  :hook eldoc-mode)
1 个赞

可以了,谢谢!

谢谢释疑!我得把这加入FAQ 里。

这几天把我之前通过扩展eldoc-mouse 支持在用nov阅读epub 文件时预览链接而做的包eldoc-mouse-nov提交到NonGNU, 很快被收录了,Elpa 做事效率真高。 上链接 项目地址:

NonGNU包地址:

1 个赞