如何在Emacs Lisp中连接模式?

问题描述:

我认为标题不能清楚地描述问题。但我会尝试更详细地描述单词。如何在Emacs Lisp中连接模式?

这里是我的Emacs Lisp代码来设置备份文件夹:

(setq backup-directory-alist '(("" . "/hom/test/.backups"))) 

但是,如果我想在一个动态的方式,它基于用户的路径上的路径生成的备份路径做这个工作。

这里是我想要做的事:

(setq temp-file-folder "/home/test") 
(setq backups-save-folder (concat temp-file-folder "/.backups")) 
(setq backup-directory-alist '(("" . backups-save-folder))) 

但它不工作。以上代码的最终输出是:

(("" . backups-save-folder)) 

我想什么,我试图让应该是:

(("" . "/home/test/.backups")) 

那么,什么是生成路径动态正确的代码?什么意思。在代码中?

谢谢

首先,一点。您可以使用format函数代替concat来执行此操作(与printf类似)。下面是一个例子

(let ((home_dir "/home/noufal") 
     (posts_dir "posts")) 
    (format "%s/%s" home_dir posts_dir)) 

评估为"/home/noufal/posts"

这不是地道的口齿不清到setq临时变量。您应该在let构造的范围内工作,该构造可以将值绑定到几个临时符号,然后完成您的工作。

在你最后一种情况下,你在第二个参数前使用了'。这将阻止它被评估(这是“直接引用”的代名词),因此,backups-save-folder将不会被替换为值。如果你想这样做,请做这样的事情。

(setq backup-directory-alist (list (cons "" backups-save-folder))) 

.是代表名单,其cdr不是一个列表的方式。有关更多详细信息,请参阅elisp documentation

+1

你也可以使用quasiquote,看起来更好的IMO。 (setq backup-directory-alist'((“”,backups-save-folder))) – jpkotta 2012-07-31 01:46:41

+0

根据你的建议,我添加了以下代码,它的工作原理是:(setq backup-directory-alist(list(cons“ ((backups_dir“/.backups”) (temp_folder desktop-temp-file-folder)) (格式为“%s /%s”temp_folder backups_dir))))) – 2012-07-31 04:17:48

看来你并不需要一个关联列表,设计用于存储配对值,但一个简单的列表:

获取当前用户目录(getenv的“HOME”)

可能与另一个任意字符串组合“-BACKSTAGE-AREA”

(setq我-DIR(名单(CONCAT(getenv的 “HOME”) “ - BACKSTAGE-AREA”)))

得到的目录名称以那种方式存储与

(车我-DIR)

根据Noufal Ibrahim的答案,这是我最后的代码:

(setq backup-directory-alist (list (cons "" 
            (let ((backups_dir "/.backups") 
              (temp_folder desktop-temp-file-folder)) 
             (format "%s/%s" temp_folder backups_dir))))) 

它的工作原理。

谢谢