如何在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。
答
看来你并不需要一个关联列表,设计用于存储配对值,但一个简单的列表:
获取当前用户目录(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)))))
它的工作原理。
谢谢
你也可以使用quasiquote,看起来更好的IMO。 (setq backup-directory-alist'((“”,backups-save-folder))) – jpkotta 2012-07-31 01:46:41
根据你的建议,我添加了以下代码,它的工作原理是:(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