实不相瞒,在做这个package 之前,我对elisp 几乎一点不懂。而且还有那么一点天然的畏惧感,现在依然知道得不多,但是畏惧感消失了。
@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)
我就是打个比方
,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 加载得应该比较早,就没有循环加载的问题,这些是我的猜测。
我就是打个比方
,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)
可以了,谢谢!
谢谢释疑!我得把这加入FAQ 里。
这几天把我之前通过扩展eldoc-mouse 支持在用nov阅读epub 文件时预览链接而做的包eldoc-mouse-nov提交到NonGNU, 很快被收录了,Elpa 做事效率真高。 上链接 项目地址:
NonGNU包地址: