如何只在linux中加载模块?

时间:2012-01-19 09:21:47

标签: emacs elisp

这是我的尝试:

(if (eq system-type 'gnu/linux)
    (load "/usr/share/emacs/site-lisp/site-gentoo")
    (require 'site-gentoo))

但无论如何我在Windows上收到错误:

/.emacs':

File error: Cannot open load file, site-gentoo

3 个答案:

答案 0 :(得分:9)

你的问题与你使用if的方式有关:它的文档说它是

(if COND THEN ELSE...)

即。只有在 GNU / Linux系统时才会执行(require 'site-gentoo)

使用when代替,应该按照您的意图行事。

此外,实际上不需要同时使用loadrequire,它们的用法应该具有相同的结果。差异主要是require将搜索load-path并且不会再次加载之前已加载过的内容。

答案 1 :(得分:4)

应该是:

(if (eq system-type 'gnu/linux)
    (progn
      (load "/usr/share/emacs/site-lisp/site-gentoo")
      (require 'site-gentoo)))

(when (eq system-type 'gnu/linux)
    (load "/usr/share/emacs/site-lisp/site-gentoo")
    (require 'site-gentoo))

而不是(load "/usr/share/emacs/site-lisp/site-gentoo")您应该将包含加载文件的文件夹添加到load-path

(add-to-list 'load-path "/usr/share/emacs/site-lisp/")

这应该可以解决问题。 require仅适用于load-path上的文件,load只是评估作为参数给出的lisp文件。

答案 2 :(得分:1)

Rörd和Bozhidar Batsov已经提供了如何解决它的答案,但只是为了补充原始代码失败的原因。

(if COND THEN ELSE...)只接受一个THEN命令。为了能够在返回true时评估多个命令,您必须将命令包装在(progn BODY...)中。

您的代码说明:
如果在linux上:(load "/usr/share/emacs/site-lisp/site-gentoo")
如果没有在linux上:(require 'site-gentoo)

使用(when ...)或包裹(progn ...)都会提供所需的解决方案。