这是我的尝试:
(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
答案 0 :(得分:9)
你的问题与你使用if
的方式有关:它的文档说它是
(if COND THEN ELSE...)
即。只有在不 GNU / Linux系统时才会执行(require 'site-gentoo)
。
使用when
代替,应该按照您的意图行事。
此外,实际上不需要同时使用load
和require
,它们的用法应该具有相同的结果。差异主要是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 ...)
都会提供所需的解决方案。