关于use-package和flycheck的warning

最近想把自己的Emacs配置实现 0 warning, 结果发现下面这段代码,flycheck会抛出 the function 'mailcap-parse-mailcaps' might not be defined at runtime警告,

(use-package mailcap
  :config
  (cond
   ((eq system-type 'gnu/linux) (mailcap-parse-mailcaps))))

在这段代码之前加上 (require 'mailcap),警告会消失。

相关问题:

flycheck 对 elisp 就像一个外行一样, 不要自己折腾自己, 我对所有模式都启用 flycheck , 唯独不在 elisp 模式下启用 flycheck

1 个赞

(require 'mailcap) 写在 (use-package mailcap ...) 之前是不对的。你目前这么写有效,是因为先前已经安装了 mailcap,require 在 ~/.emacs.d/elpa 中能找到它。全新环境必然出错。

你应该处理 flycheck 跟 mailcap 的依赖顺序,use-package 那么多关键字,好好研究一下。

use-package 情况下处理依赖是这样的:

(with-eval-after-load 'foo
  (init-bar))
1 个赞

你理解错了吧,op是说这段elisp代码在开启flycheck之后会出warning说没有requiremailcap就用了mailcap-parse-mailcaps这个函数。。。

试试:commands有没有用

(use-package mailcap
   :commands mailcap-parse-mailcaps
  :config
  (cond
   ((eq system-type 'gnu/linux) (mailcap-parse-mailcaps)))

:commands的文档

这是 Emacs Byte Compiler 给出的,提醒你找不到 mailcap-parse-mailcaps 的定义,所以修复的方法是确确实实地加载 mailcap 或者专门用 declare-function 指令告诉 Byte Compiler 消除这个警告。

;; 方法一
(require 'mailcap)
;; 方法二
(declare-function mailcap-parse-mailcaps "mailcap")

对应方法二,use-package:functions 就是这个。


另外,use-package 虽然很好用,但难以理解,知道怎么用不等于知道怎么一回事。

1 个赞

已经解决了,同意你对use-package的看法… 已陆续用 :commands, :defines, :functions 消除了其他大部分警告。

谢谢各位的回复,很有收获!

请问有没有道友遇到过 :defines :functions 没有效果的情况?

我读了官方的几个 issue,比如 defines and functions seem to have no effect at all · Issue #792 · jwiegley/use-package,但是不管我怎么设置 use-package-expand-minimallybyte-compile-current-file 的值,实际编译的时候还是会有 warning。