как да укажете стойност на свойство на променлива в emacs lisp

Използвам следния код във файла .emacs, за да задам поведение за публикуване по подразбиране. Поставям основната директория на организацията в различни местоположения за различни компютри:

;; 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-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"))
        ))

person RNA    schedule 09.08.2012    source източник


Отговори (1)


Един от начините да го направите ще бъде използването на ` (обратен кавир) и , (запетая). От Справочно ръководство за 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"))
        ))
person dkim    schedule 09.08.2012
comment
Нито един не работи: org-publish-get-base-files: Wrong type argument: stringp, (\, org-dir) и org-publish-get-base-files: Wrong type argument: stringp, (\` org-dir) - person RNA; 09.08.2012
comment
@RNAer Оценихте ли своя (cond ...) код, който setqs org-dir преди да изпълните кода? Вече проверих дали кодът работи, когато е зададено org-dir. - person dkim; 09.08.2012
comment
Да, определено. Използвам org-dir в други кодови редове без никакъв проблем. - person RNA; 09.08.2012
comment
Съжалявам, че пропуснах първата модификация. Сега работи! Благодаря много! - person RNA; 09.08.2012