首页 > Emacs: 用 eval-after-load 配置 auto-complete 的问题

Emacs: 用 eval-after-load 配置 auto-complete 的问题

我用 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 (string-equal 
     (number-to-string 21) 
     (substring (emacs-version) 10 12)) 
    (message "This is version 21 Emacs") 
  (message "This is not version 21 Emacs")) 
【热门文章】
【热门文章】