使用ox-publish导出,无法将变量分配给关键字

时间:2016-05-27 17:25:17

标签: emacs lisp elisp org-mode

我有一个使用ox-publish的工作设置,现在我正在尝试组织它。我的问题是我无法将变量分配给关键字符号,如下面的代码段所示。

(setq my-org-base-dir "~/documents/todo")
(setq my-org-exp-dir "~/documents/todo_html")
(require 'ox-publish)
(setq org-publish-project-alist
  '(
    ("org-notes"
     :base-directory my-org-base-dir
     :base-extension "org"
      ; ....
     )
    ("org-static"
     :base-directory my-org-base-dir
      ; ....
     )
    ("org" :components ("org-notes" "org-static"))
    ))

使用:base-directory "~/documents/todo"工作正常,但如果我尝试使用变量(:base-directory my-org-base-dir)中的值,当我尝试导出时,emacs会给我Wrong type argument: stringp, org-base-dir

如何为关键字分配值?

2 个答案:

答案 0 :(得分:1)

当你这样做时

(setq org-publish-project-alist '( ... ))

您将 org-publish-project-alist 的值设置为文字列表。并不是说您不能为关键字[参数]"分配值,而是列表的引用会阻止对其中的变量进行评估。例如,

(let ((a 1) (b 2) (c 3))
  (setq foo '(a b c)))
;=> (a b c)               
; *not* (1 2 3)

获取变量"插值"您需要使用 list 来构建列表,或者使用反引号以便您可以拼接值。例如,

(setq org-publish-project-alist
  `(                                    ;; backquote (`), not quote (')
    ("org-notes"
     :base-directory ,my-org-base-dir   ;; comma (,) to splice value in
     :base-extension "org"
      ; ....
     )
    ("org-static"
     :base-directory ,my-org-base-dir   ;; comma (,)
      ; ....
     )
    ("org" :components ("org-notes" "org-static"))
    ))

答案 1 :(得分:0)

  

编辑:我想我可能误解了这个问题。这回答了标题中的问题,但看起来并不是OP遇到的问题。

您无法为关键字指定值。从Emacs Lisp手册(重点补充):

  

11.2 Variables that Never Change

     

在Emacs Lisp中,某些符号通常会对自己进行评估。这些   包括nil和t,以及名称以':'开头的任何符号   (这些被称为关键字)这些符号不能反弹,也不能反弹   它们的值会被改变。任何设置或绑定nil或t的尝试都会发出信号   设定常数误差。关键字(一个符号的关键字)也是如此   名称以':'开头),如果它是在标准obarray中实现的,   除了将这样的符号设置为自身不是错误。