多个 Emacs Lisp 配置文件导致“自由变量”和“函数未知定义”警告

Multiple Emacs Lisp config files lead to "free variable" and "function not known to be defined" warnings

提问人:cidra 提问时间:6/15/2022 最后编辑:cidra 更新时间:6/15/2022 访问量:306

问:

我一直在寻找 emacs 配置文件,以便学习如何以最佳方式构建我的 Emacs 配置。现在我正在查看 purcell 的配置文件,它们看起来非常整洁且易于阅读。

但是,对于我发现的每个配置文件,总是存在相同的问题:“自由变量” 以及所有包含的文件上的“未知定义功能”警告。每次都看到 flymake 的所有红色下划线是相当令人沮丧的,这也让我怀疑这是否真的是编写配置文件的最佳方式。

下面是上面提到的存储库中的文件:

;;; init-python.el --- Python editing -*- lexical-binding: t -*-

(setq auto-mode-alist
      (append '(("SConstruct\\'" . python-mode)
                ("SConscript\\'" . python-mode))
              auto-mode-alist))

;;WARNING: assignment to free variable ‘python-shell-interpreter’
(setq python-shell-interpreter "python3") 

(require-package 'pip-requirements)

(when (maybe-require-package 'toml-mode)
  (add-to-list 'auto-mode-alist '("poetry\\.lock\\'" . toml-mode)))

;;WARNING: reference to free variable ‘black’
(when (maybe-require-package 'reformatter)
  (reformatter-define black :program "black" :args '("-")))

(provide 'init-python)
;;WARNING: the following functions are not known to be defined: require-package, maybe-require-package, reformatter-define
;;; init-python.el ends here

是从包中定义的变量。 和 在名为 'd 的自定义本地文件中定义,因此该文件无法直接识别它们。 变量警告是最“复杂”的:我想这是由于包不包括在内,因为也不包括在内。python-shell-interpreterpython-moderequire-packagemaybe-require-packageinit-elpa.elrequiresinit.elblackreformattermaybe-require-package

这让我头疼。如果我没看错的话,根本问题是包含的文件(等)依赖于包含文件()中的内容,而没有明确说明。init-python.elinit.el

有没有更好的方法可以在多个文件之间构建 Emacs Lisp 配置?

emacs 编译器警告

评论


答:

2赞 phils 6/15/2022 #1

python-shell-interpreter 是从包中定义的变量。python-mode

添加到文件的顶部(或只是在依赖于该文件的代码上方)。(require 'python-mode)

require-package 和 maybe-require-package 在名为init-elpa.el

添加到文件中(我假设它是功能)。(require 'init-elpa)provideinit-elpa

这是 init.el 文件所必需的

这很好 -- 如果已经加载了相关库,则不执行任何操作。即使有一个总体的 init 文件加载其他文件,每个文件对它需要的东西也是明智的(除非有循环依赖关系)。requirerequire

黑色变量警告是最“复杂”的:我想这是由于包不包括在内,因为也不包括在内。reformattermaybe-require-package

这是一个宏,该符号实际上并没有用作变量。当只需要宏时,通常会从它的预期名称来看,它可能根本无法加载。如果这一切都是准确的,您可以使用此包装器来处理误报:reformatter-defineblack(eval-when-compile (require 'reformatter))maybe-require-packagereformatter

(with-suppressed-warnings ((free-vars black))
  ...)

有关处理字节编译警告和错误的更多信息,请参阅。C-hig(elisp)Compiler Errors