我用 elpa (package.el) 管理我的Emacs扩展.
我用下面的代码配置我的 auto-complete :
(eval-after-load 'auto-complete-mode
(progn
(message "Jolly said: auto complete is loaded.")
(require 'auto-complete-config)
(ac-config-default)
(setq ac-delay 0.5)
))
我认为这样配置之后,如果我没有安装 auto-complete, eval-after-load
内部的代码就不会被执行。但是,如果我真的没有安装 auto-complete, Emacs启动时会报错:File error: Cannot open load file, auto-complete-config
.
为什么,既然我没有安装auto-complete, auto-complete-mode的feature就不能被载入,为什么后面的代码还是被evaluate呢?
为了测试 eval-after-load
是否象我想得那样工作,我把auto-complete-mode
改成abcd-mode
,也就是:
(eval-after-load 'abcd-mode
(progn
(message "Jolly said: auto complete is loaded.")
(require 'auto-complete-config)
(ac-config-default)
(setq ac-delay 0.5)
))
因为 abcd-mode 根本不存在,所以我肯定它不会被载入。
重启Emacs,Emacs仍然抱怨:File error: Cannot open load file, auto-complete-config
.
看来,尽管abcd-mode没有被载入,但后面的代码仍然被执行了。
为什么?我对 eval-after-load 理解错了吗?
我想要的是:不管我有没有安装auto-complete,Emacs都不会报错;但是如果我安装了auto-complete,它要能接受我上面的配置。
我该用什么方法。
我现在是这么解决的,加了个条件判断。
(eval-after-load "auto-complete"
(progn
;; If auto-complete-config not found, require return nil
(if (require 'auto-complete-config "auto-complete-config" t)
(progn
(message "jolly said: auto complete loaded.")
(ac-config-default)
(setq ac-delay 0.5)
)
(message "jolly said: auto complete plugin not found."))
))
应该是用条件判断式,如果发现Auto-Complete,则执行....,如果没有发现Auto-Complete,则执行....但是要做到你想要的效果,就不能使用Auto-Complete内的函数来判断Auto-Complete是否启用,因为一旦使用Auto-Complete内的函数来判断,Emacs都会自动去尝试加载Auto-Complete,则会无法加载Auto-Complete的错误.Emacs里面肯定有地方有会列出当前所加载的全部扩展包的列表,以此为判断依据估计就可以.但是我没做过相关的事,所以我也不知道.
- If
对第一个参数求值,如果返回的为True,则对第二个参数求值.否则如果第三个参数存在,则对第三个参数求值.
(if (string-equal
(number-to-string 21)
(substring (emacs-version) 10 12))
(message "This is version 21 Emacs")
(message "This is not version 21 Emacs"))