use-package with config: 函数在运行时可能不可用

use-package with config: function might not be available at runtime

我喜欢将 use-package 用于 Emacs。除其他事项外,我的配置文件中包含以下内容:

(use-package proced
  :ensure t
  :config
  (proced-toggle-auto-update 1)
  (general-define-key
    :keymaps 'proced-mode-map
    "j"   'next-line
    "k"   'previous-line))

Flycheck 警告函数 proced-toggle-auto-update 可能在 运行 时不可用。但是,use-package 的文档指出 config: 之后的所有表单都会在 之后 加载包。那么这个 flycheck 警告是误报吗?

如果您知道该函数将在运行时可用,例如。包将被加载(因为该函数不是自动加载的),然后您可以通过声明该函数让编译器知道,例如。

(declare-function proced-toggle-auto-update "proced")

我不使用 use-package,但根据您引用的文档,大概已经加载了包,所以是的,这将是误报。

在其他情况下,您也可以显式自动加载函数并让编译器知道,

(autoload 'proced-toggle-auto-update "proced")

这些操作假定库 "proced" 在您的加载路径上,例如。 (featurep 'proced) 非零。

flycheck emacs-lisp-checker 正在使用字节编译器找出代码可能存在的问题,它需要一点帮助来找出 use-package 的问题。对于 use-package 的初始化文件,我做了两件事:

首先,我为我的初始化文件定义了一个目录局部变量(在 .dir-locals.el 中):

((emacs-lisp-mode ((flycheck-emacs-lisp-load-path . inherit))))

设置inherit后,flycheck使用的load-path取自当前的load-path,所以它可以找到各种lisp包中的所有文件。

其次,我的 init.d 中的每个单独文件中都有 (require 'use-package)。这似乎是多余的,但它让 flycheck 单独检查文件,因为它可以扩展 use-package 宏以便更好地分析。

此设置似乎避免了来自 use-package 的大部分警告,除了那些真正重要的警告。但是,它并未针对您的特定配置进行测试。