如何在Emacs Lisp中连接模式?

时间:2012-07-30 10:40:41

标签: emacs

我认为标题无法清楚地描述问题。但我会尝试更详细地描述一下。

以下是我设置备份文件夹的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"))

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

由于

3 个答案:

答案 0 :(得分:4)

首先,一点。您可以使用format函数而不是concat来执行此操作(它类似于printf)。这是一个例子

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

评估为"/home/noufal/posts"

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

在您的上一个案例中,您在第二个参数之前使用了'。这将阻止它被评估(它与“引用字面”同义),因此backups-save-folder不会被值替换。如果你想这样做,做这样的事情。

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

.是表示cdr不是列表的列表的一种方式。有关详细信息,请参阅elisp documentation

答案 1 :(得分:0)

似乎您不需要用于存储配对值的关联列表,而是一个简单的列表:

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

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

(setq my-dir(list(concat(getenv“HOME”)“ - BACKSTAGE-AREA”)))

使用

获取以此方式存储的目录名称

(car my-dir)

答案 2 :(得分:0)

根据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)))))

有效。

由于