解决 Missing `lexical-binding' cookie

今天更新最新版本emacs,发现会提示:

Warning (files): Missing lexical-binding' cookie in "~/gccemacs_260201/share/emacs/site-lisp/site-start.el". You can add one with M-x elisp-enable-lexical-binding RET’. See (elisp)Selecting Lisp Dialect' and (elisp)Converting to Lexical Binding’ for more information.

搜索了下貌似没发现解决办法,于是去找源码,发现是这个commit (Fload, Feval_buffer): Emit a warning when lexbind is unset (bug#74145) · emacs-mirror/emacs@9f25d46 (github.com)

解决办法1:上advice,在early-init里添加:

(require 'cl-macs) (define-advice internal–get-default-lexical-binding (:around (orig-fn &rest args)) (cl-letf (((symbol-function #'display-warning) (lambda (&rest _) )))))

代码意思就是让display-warning执行为空,其它逻辑都没变。 再手动修改share\emacs\site-lisp\site-start.el,行首添加;; -*- lexical-binding: t; -*-,或者m-x elisp-enable-lexical-binding,我用的网上编译的windows版本,不清楚为何安装自带的el文件也有这个问题?

解决方法2:(setq internal--get-default-lexical-binding-function nil)也行,这个设置就不知道有没有什么副作用了。

使用这个也可以,放在 early-init.el 里面

;; Avoid raising the *Messages* buffer if anything is still without
;; lexical bindings
(setq warning-minimum-level :error)
(setq warning-suppress-types '((lexical-binding)))

不过最好还是所有配置文件都加上吧

;;; -*- lexical-binding: t; -*-
4 个赞

谢谢,你这个就不用改site-start.el文件了

(add-to-list 'warning-suppress-log-types '(files missing-lexbind-cookie))