2011-10-17 51 views

回答

32

tripleee的答案是错误的一个方便的例子处理,但在这种情况下是不必要的。

(when (require 'some-library nil 'noerror) 
    do-things) 

'noerror可以是任何非空值,但当然这是更具描述性的这种方式。我经常会看到使用:noerror,但我不知道在关键字上使用关键字参数有什么特别的优势(评论,任何人?我很有兴趣知道)。

要求是C source code中的内置函数。

(需要FEATURE &可选FILENAME NOERROR)

如果没有装载特征FEATURE,从FILENAME加载它。
如果FEATURE不是列表features的成员,则不加载功能
;所以加载文件FILENAME。
如果省略FILENAME,特征的printname被用作文件名,
load将尝试加载该名称与后缀.elc
.el所附,以该顺序。不带附加后缀的名称将不被使用。
有关后缀的完整列表,请参见get-load-suffixes
如果可选的第三个参数NOERROR非零,则
然后返回nil,如果找不到文件而不是发出错误信号。
通常返回值是FEATURE。
加载FILENAME开始和结束时的正常消息被抑制。

+1

对于它的价值,该检查仅用于查看是否定义了“noerror”,因此任何非零值都可以工作。我一直在使用't'。 – clintm

+4

:noerror是common-lisp风格。哪个更好:-)。 – user239558

+0

这不适用于'AUCTeX',因为不需要'AUCTeX'。你需要为'AUCTeX'使用'package-installed-p' –

6

(require)如果失败将抛出一个错误。这应该是你所需要的。

如果您只想在可用时配置ECB行为,请主要考虑将内容添加到ecb-hook--这是有条件配置Emacs包的常规方式。

如果没有勾可用,或者你想用手把它卷出于某种原因,你可以试试

(eval-after-load 'ecb '(setq ecb-be-more-like-better-yes-p t)) 

如果你真的想用手滚动这一点,你可以捕获从一个错误失败require这样的:

(condition-case nil 
    (progn 
     (require 'ecb) 
     (setq ecb-be-more-like-better-yes-p t)) 
    (file-error (message "ECB not available; not configuring"))) 

注意,condition-case将捕捉任何file-errorprogn里面,所以你要确保你不做任何内其他文件操作。最终你可能希望把刚刚require一个condition-case内并使用它作为您的原始if形式的条件,但这种情况已经失控...

(if (condition-case nil (require 'ecb) (error nil)) 
    (setq ecb-be-more-like-better-yes-p t) 
(message "ECB not available; not configuring")) 
+0

'eval-after-load'似乎不加载包。所以我改变了下面的答案:(when(...)) – Vivodo

+0

是的,'加载后eval'的目的是指定一个延迟动作来执行,如果当你加载指定的包时。当您为不涉及加载'ecb'的任务启动Emacs时,避免不必要的设置很有用(批处理字节编译是一个常见示例)。 – tripleee

3

为什么不使用“featurep”?

(featurep FEATURE &optional SUBFEATURE) 

如果FEATURE存在于此Emacs中,则返回t。

(if (featurep 'ecb) 
    (message "ECB is there!")) 
+1

这只适用于已经加载的特征(因此与这个特定问题关系不大)。 – phils

1

最简单的答案就是使用requireeval-after-load在其他的答案说。

但是这并不总是很方便,比如在一个模式钩子调用的函数中,该函数想要激活另一个次要模式,但只有在安装了它的软件包时。在这种情况下,featurep是相关的。

Emacs软件包越来越多地使用自动加载来提高启动时间。如果使用require来测试包是否存在,那么您将承担加载文件的成本。如果使用ELPA/MELPA/Marmalade软件包(从版本24开始默认可用),那么许多软件包可能仍处于卸载状态,但包含自动加载的foo软件包将提供foo-autoloads功能。我编写了一个函数,可用于测试程序包是否可用于已加载或设置为自动加载的情况。

 
(defun autofeaturep (feature) 
    "For a feature symbol 'foo, return a result equivalent to: 
(or (featurep 'foo-autoloads) (featurep 'foo)) 
Does not support subfeatures." 
    (catch 'result 
    (let ((feature-name (symbol-name feature))) 
     (unless (string-match "-autoloads$" feature-name) 
     (let ((feature-autoloads (intern-soft (concat feature-name "-autoloads")))) 
      (when (and feature-autoloads (featurep feature-autoloads)) 
      (throw 'result t)))) 
     (featurep feature)))) 
0

这个问题迟了四年,但是......这是一个简单的宏,它会为你做这件事。

(defmacro when-feature-loaded (feature &rest body) 
    "Executes BODY if and only if FEATURE is loaded." 
    (declare (indent defun)) 
    `(when (featurep ,module) 
    @,body)) 

例如:

(when-feature-loaded 'foo 
    (message "foo is loaded!")) 

下面是另一个版本与“其他”的情况下,如果你需要处理的这一点。

(defmacro if-feature-loaded (module then-form else-form) 
    "Executes THEN-FORM if and only if MODULE is already loaded, otherwise executes ELSE-FORM." 
    (declare (indent 2)) 
    `(if (featurep ,module) 
     ,then-form 
    ,else-form)) 
1

对于人们想知道如何检查是否安装了package.el包,使用package-installed-p

相关问题