gnu emacs 27.1每次启动都提示 Symbol’s value as variable is void: ispell-menu-map-needed

gnu emacs 27.1每次启动都提示 Symbol’s value as variable is void: ispell-menu-map-needed,不知道要怎么设置。关于ispell我从未设置过。

从终端以 emacs --debug-init 命令启动,会有详细的诊断信息,顺着线索就可以找到原因以及解决办法。(印象中这个提示里,有附带这个命令的说明)

如果实在解决不了,不妨放一放,只是启动时多了一句抱怨,无伤大雅。

好的,谢谢。

emacs -Q 也会出现吗?

emacs -Q居然就不会出现这个错误了,怎么回事?

我的init.el配置文件如下,/lisp/下2个二级配置文件已经注释掉了,仍然出现这个错误。

(package-initialize)

(add-to-list 'load-path "~/.emacs.d/lisp/")

(defun open-my-init-file()
  (interactive)
  (find-file "~/.emacs.d/init.el"))

;; Package Management
;; -----------------------------------------------------------------
;(require 'init-packages)

;; Python init
;; -----------------------------------------------------------------
;(require 'init-python)

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won’t work right.
 '(package-selected-packages '(use-package ## lsp-mode youdao-dictionary)))

(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won’t work right.
 )

;; 显示时间
(display-time)

 ;; 设置和系统互相粘贴
 (setq x-select-enable-clipboard t)

 ;; 有道词典Enable Cache
 (setq url-automatic-caching t)
 (global-set-key (kbd "C-q") 'youdao-dictionary-search-at-point+)

 ;; 禁用\e\e和\C-x\C-u
 (global-unset-key "\e\e")
 (global-unset-key "\C-x\C-u")

你这个配置去掉注释注释几乎是空白了。

如果还出错,原因可能有:

  1. 配置并没有按你期望的方式加载。如果不使用 -Q 参数启动 Emacs,则仍然会搜索 site-lisp 目录。

    通过加载一个空文件的 empty-init.el,比较有无 -Q 参数的 load-path 区别,显然加 -Q 之后 load-path 就不再包含 site-lisp

    $ diff -u <(emacs    -nw -l ~/.emacs.d/empty-init.el --batch --eval "(mapcar #'message load-path)" 2>&1) \
              <(emacs -Q -nw -l ~/.emacs.d/empty-init.el --batch --eval "(mapcar #'message load-path)" 2>&1)
    --- /dev/fd/63  2021-08-19 20:46:30.000000000 +0800
    +++ /dev/fd/62  2021-08-19 20:46:30.000000000 +0800
    @@ -1,10 +1,3 @@
    -/usr/local/share/emacs/site-lisp
    -/usr/local/share/emacs/site-lisp/autoconf
    -/usr/local/share/emacs/site-lisp/cask
    -/usr/local/share/emacs/site-lisp/cmake
    -/usr/local/share/emacs/site-lisp/gettext
    -/usr/local/share/emacs/site-lisp/git
    -/usr/local/share/emacs/site-lisp/libidn
    /usr/local/Cellar/emacs/27.1/share/emacs/27.1/lisp
    /usr/local/Cellar/emacs/27.1/share/emacs/27.1/lisp/vc
    /usr/local/Cellar/emacs/27.1/share/emacs/27.1/lisp/url
    
  2. 错误可能来你的系统发行版,例如 Debian 就放了一个名为 dictionaries-common 包在 site-lisp 并导致了跟你遇到的一样的错误:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=968955

  3. 错误可能来自你安装的某个包,因为 (package-initialize) 会加载包的 -autoload.el,你可以 rg ‘ispell-menu-map-needed’ ~/.emacs.d/elpa -g '*.el' 搜索一下变量出现的位置。

之所以 emacs -Q 不会出错,是因为 -Q 阻止了非必要的加载,而 Emacs 本身从三年前就不在使用这个变量:https://emba.gnu.org/emacs/emacs/-/commit/97b78542f60d1079a8407da5e1974d064951fb3d

想要别人帮你诊断错误,请不要忽略关键信息:

  • 你的详细步骤&命令
  • 你的环境&系统&版本等等
4 个赞

有时候也经常出现一些类似错误,不过一般来说清理下.emacs.d下的插件,重新下下就好了,感觉是部分插件有些老版本冲突,因为人懒。。懒得查

我的系统是debian10,emacs是27.1版本。搜索我的所有配置,都没有这个变量。在emacs26版本上没有这个问题,升级后有这个问题。

按我在 7# 楼说的检查一遍。

谢谢你。错误应该是来自你说的第2点,发行版本带来的错误。我干脆等下次升级吧

Yes, I observed this too. You can remove /etc/emacs/site-start.d/50dictionaries-common.el to fix the problem.

现在系统升级到debian11之后,emacs27.1就没什么错误了。

我的是debian 9.13,我是看启动emacs时载入的文件,然后发现那个载入有点问题才删除那个文件的。