如何在emacs lisp中指定变量的属性值

RNA*_*RNA 3 lisp emacs elisp org-mode

我在.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")))
Run Code Online (Sandbox Code Playgroud)

因此,我想用一个变量来指定:base-directory,以org-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"))
        ))
Run Code Online (Sandbox Code Playgroud)

dki*_*kim 5

一种方法是使用`(反引号)和,(逗号).从GNU Emacs Lisp参考手册,

Backquote构造允许您引用列表,但有选择地评估该列表的元素.在最简单的情况下,它与特殊形式相同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"))
        ))
Run Code Online (Sandbox Code Playgroud)