如何在Emacs Lisp中指定变量的属性值

3

我在 .emacs 文件中使用以下代码来设置默认的发布行为。我将 org 基础目录放置在不同的计算机位置:

;; define machine specific directories storing my org files
(cond ((system-name-is-home) (setq org-dir "/data/org"))
      ((system-name-is-work) (setq org-dir "~/org")))

因此,我想使用一个变量来指定:base-directoryorg-dir,而不是硬编码为"~/org"。我该怎么做呢?

(require 'org-publish)
(setq org-publish-project-alist
      '(
        ("org-notes"
         :base-directory "~/org"
         :base-extension "org"
         :publishing-directory "~/tmp/"
         :recursive t
         :publishing-function org-publish-org-to-html
         :headline-levels 4
         :auto-preamble t

         :auto-sitemap t          ; Generate sitemap.org automagically ...
         :sitemap-filename "sitemap.org" ; ... call it sitemap.org (the default) ...
         :sitemap-title "Sitemap" ; ... with title 'Sitemap'.
         )
        ("org-static"
         :base-directory "~/org"
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "~/tmp/"
         :recursive t
         :publishing-function org-publish-attachment
         )
        ("org" :components ("org-notes" "org-static"))
        ))
1个回答

5
一种方法是使用 `(反引号)和 ,(逗号)。来自GNU Emacs Lisp参考手册

反引号构造允许您引用列表,但有选择地评估该列表的元素。在最简单的情况下,它与特殊形式quote相同。 (...) 在反引号参数内部的特殊标记','表示不是常量的值。Emacs Lisp评估器评估','的参数,并将该值放入列表结构中。

因此,您可以按以下方式编写程序:
(require 'org-publish)
(setq org-publish-project-alist
      `(                              ; XXX: backquote
        ("org-notes"
         :base-directory ,org-dir     ; XXX: comma
         :base-extension "org"
         :publishing-directory "~/tmp/"
         :recursive t
         :publishing-function org-publish-org-to-html
         :headline-levels 4
         :auto-preamble t

         :auto-sitemap t          
         :sitemap-filename "sitemap.org" 
         :sitemap-title "Sitemap"
         )
        ("org-static"
         :base-directory ,org-dir     ; XXX: comma
         :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
         :publishing-directory "~/tmp/"
         :recursive t
         :publishing-function org-publish-attachment
         )
        ("org" :components ("org-notes" "org-static"))
        ))

无法工作:org-publish-get-base-files: Wrong type argument: stringp, (\, org-dir)org-publish-get-base-files: Wrong type argument: stringp, (\\ org-dir)`。 - RNA
@RNAer,你有评估过在执行代码之前会setq org-dir的(cond...)代码吗? 我已经检查过当设置了org-dir时该代码可以正常工作。 - dkim
是的,当然。我在其他代码行中使用org-dir没有任何问题。 - RNA
抱歉我错过了第一次修改。现在它可以工作了!非常感谢! - RNA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接