我想在特定软件包安装正确的情况下自定义环境。如何检查某些软件包是否安装在elisp中? 这样的事情?:如何确定软件包是否安装在elisp中?
(if (require 'ecb)
(progn (setq ....))
(message "ECB not installed!"))
我想在特定软件包安装正确的情况下自定义环境。如何检查某些软件包是否安装在elisp中? 这样的事情?:如何确定软件包是否安装在elisp中?
(if (require 'ecb)
(progn (setq ....))
(message "ECB not installed!"))
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开始和结束时的正常消息被抑制。
的(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-error
从progn
里面,所以你要确保你不做任何内其他文件操作。最终你可能希望把刚刚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"))
为什么不使用“featurep”?
(featurep FEATURE &optional SUBFEATURE)
如果FEATURE存在于此Emacs中,则返回t。
(if (featurep 'ecb)
(message "ECB is there!"))
这只适用于已经加载的特征(因此与这个特定问题关系不大)。 – phils
最简单的答案就是使用require
和eval-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))))
这个问题迟了四年,但是......这是一个简单的宏,它会为你做这件事。
(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))
对于人们想知道如何检查是否安装了package.el包,使用package-installed-p
。
对于它的价值,该检查仅用于查看是否定义了“noerror”,因此任何非零值都可以工作。我一直在使用't'。 – clintm
:noerror是common-lisp风格。哪个更好:-)。 – user239558
这不适用于'AUCTeX',因为不需要'AUCTeX'。你需要为'AUCTeX'使用'package-installed-p' –