autoload failed to define function

我在激活 evil-matchit的时候会出现如下错误。Google上都说是load-path冲突,但是我没发现什么load-path冲突啊。

而且我手动

(load "/Users/yuan/.emacs.d/.local/package/elpa/evil-matchit-20180131.502/evil-matchit.el)

没有任何问题:

Loading /Users/yuan/.emacs.d/.local/package/elpa/evil-matchit-20180131.502/evil-matchit.el (source)...done
t

最神奇的是,虽然报错,但是包是在运行的。

这啥情况啊😭

错误信息:

command-execute: Autoloading file /Users/yuan/.emacs.d/.local/package/elpa/evil-matchit-20180131.502/evil-matchit.el failed to define function evil-matchit

load-path

("/Users/yuan/.emacs.d/.local/package/elpa/avy-20171230.220" 
"/Users/yuan/.emacs.d/.local/package/elpa/counsel-20180205.837" 
"/Users/yuan/.emacs.d/.local/package/elpa/esup-20170923.1328"
 "/Users/yuan/.emacs.d/.local/package/elpa/evil-escape-20170913.618" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-matchit-20180131.502" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-mc-20170716.1806" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-nerd-commenter-20171206.441" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-search-highlight-persist-20170522.2034" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-surround-20180102.601" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-terminal-cursor-changer-20170401.142" 
"/Users/yuan/.emacs.d/.local/package/elpa/evil-20180126.1159" "/Users/yuan/.emacs.d/.local/package/elpa/expand-region-20171217.2125" 
"/Users/yuan/.emacs.d/.local/package/elpa/general-20180130.2055" 
"/Users/yuan/.emacs.d/.local/package/elpa/goto-chg-20180105.1033" 
"/Users/yuan/.emacs.d/.local/package/elpa/highlight-20180131.1216" 
"/Users/yuan/.emacs.d/.local/package/elpa/highlight-parentheses-20170809.1151" 
"/Users/yuan/.emacs.d/.local/package/elpa/hlinum-20170507.2227" "/Users/yuan/.emacs.d/.local/package/elpa/key-chord-20160227.438" "/Users/yuan/.emacs.d/.local/package/elpa/nyan-mode-20170423.40" "/Users/yuan/.emacs.d/.local/package/elpa/rainbow-delimiters-20170929.432" "/Users/yuan/.emacs.d/.local/package/elpa/smex-20151212.1409" 
"/Users/yuan/.emacs.d/.local/package/elpa/spaceline-20171111.334" 
"/Users/yuan/.emacs.d/.local/package/elpa/s-20171102.227" "/Users/yuan/.emacs.d/.local/package/elpa/powerline-20180115.1942" 
"/Users/yuan/.emacs.d/.local/package/elpa/spacemacs-theme-20180117.1333" 
"/Users/yuan/.emacs.d/.local/package/elpa/swiper-20180124.1142" 
"/Users/yuan/.emacs.d/.local/package/elpa/ivy-20180131.1134"
 "/Users/yuan/.emacs.d/.local/package/elpa/undo-tree-20170706.246" 
"/Users/yuan/.emacs.d/.local/package/elpa/use-package-20180127.1413" "/Users/yuan/.emacs.d/.local/package/elpa/bind-key-20171210.2125" 
"/Users/yuan/.emacs.d/.local/package/elpa/vi-tilde-fringe-20141027.1942" 
"/Users/yuan/.emacs.d/.local/package/elpa/which-key-20180131.606" 
"/Users/yuan/.emacs.d/.local/package/elpa/winum-20171028.702" 
"/Users/yuan/.emacs.d/.local/package/elpa/dash-20180118.743" "/usr/local/share/emacs/site-lisp" 
"/usr/local/share/emacs/site-lisp/autoconf" "/usr/local/share/emacs/site-lisp/cmake" "/usr/local/share/emacs/site-lisp/git" "/usr/local/share/emacs/site-lisp/ruby" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/vc" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/url" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/textmodes" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/progmodes" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/play" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/org" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/nxml" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/net" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/mh-e" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/mail" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/leim" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/language" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/international" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/image" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/gnus" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/eshell" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/erc" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/emulation" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/emacs-lisp" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/cedet" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/calendar" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/calc" "/usr/local/Cellar/emacs-plus/26.0.91/share/emacs/26.0.91/lisp/obsolete")

冲突不一定是 load-path 存在相同的条目,有可能是 load-path 这些路径下存在重复的 evil-matchit.el{c} 文件。

可以 list-load-path-shadows 看看有什么问题,或者直接 find ~/.emacs.d/ -name "evil-matchit.el*"

出错信息在说「evil-matchit.el 没有定义 evil-matchit 这个函数,而你在试图通过 Autoload 加载它」,所以你确定你的操作没问题吗?你只提了出错本身,却没提怎么来的?


执行

(autoload 'foo "simple" nil t)

然后 M-x foo 会得到:

Debugger entered--Lisp error: (error "Autoloading file /Users/xcy/src/emacs/nextstep/Emacs.app/Contents/Resources/lisp/simple.elc failed to define function foo")
  autoload-do-load((autoload "simple" nil t nil) foo)
  command-execute(foo record)
  helm-M-x(nil "foo")
  funcall-interactively(helm-M-x nil "foo")
  call-interactively(helm-M-x nil nil)
  command-execute(helm-M-x)

我明白了,是我在用use-package的时候用了:hook但是没有注明具体函数,结果use-package默认把包的名字当作函数添加到hook里。

(use-package evil-matchit
 :hook prog-mode
)

应该是

(use-package evil-matchit
 :hook (prog-mode . evil-matchit-mode)
)

可是正如 @xuchunyang 所说 evil-matchit.el 并没有提供 evil-matchit 这个函数… 所以报错是正常的呢。

谢谢大家:smile::kissing_heart: