我正在尝试打开文件并阅读sexps。如果表单在第一个位置有setq,那么遍历表单的其余部分,将setq表单中的一个添加到alist中。
;;; File passwords.el.gpg
(setq twitter-password "Secret"
github-password "Sauce")
我的目标是能够在teh文件中的setq表单中构建一对alist。我怎么开始?
答案 0 :(得分:1)
您可以使用流来读取文件(read-from-string),然后执行常见的elisp黑客攻击。以下不是很强大,但你明白了。在包含文件的文件pwd.el上,它返回alist((github-password。" Sauce")(twitter-password。" Secret"))
(defun readit (file)
"Read file. If it has the form (sexp [VAR VALUE]+), return
an alist of the form ((VAR . VALUE) ...)"
(let* (alist
(sexp-len
(with-temp-buffer
(insert-file-contents file)
(read-from-string (buffer-substring 1 (buffer-size)))))
(sexp (car sexp-len)))
(when (equal (car sexp) 'setq)
(setq sexp (cdr sexp))
(while sexp
(let* ((l (car sexp))
(r (cadr sexp)))
(setq alist (cons (cons l r) alist)
sexp (cddr sexp)))))
alist))
(readit "pwd.el")
答案 1 :(得分:1)
首先,我建议您将密码存储在实际的alist中,如有必要,根据需要设置所需的变量。
除此之外,这是另一个试图解决问题的解决方案。 -partition
函数来自dash.el库,我强烈推荐。
您不需要“走”代码,只需read
,然后检查其car
是否为setq
。然后,表单的其余部分应该是交替的符号和字符串,因此您只需将它们分区为2,然后就可以使用alist。 (请注意,“对”将是正确的列表,而不是Sean解决方案中的虚线对)。
(defun setq-form-p (form)
(eq (car form) 'setq))
(defun read-file (filename)
(with-temp-buffer
(insert-file-literally filename)
(read (buffer-substring-no-properties 1 (point-max)))))
(defun credential-pairs (form)
(-partition 2 (cdr form)))
(defun read-credentials-alist (filename)
(let ((form (read-file filename)))
(credential-pairs form)))
;; usage:
(read-credentials-alist "passwords.el")
或者,如果你已经在一个alist中使用了密码,那么它是如何工作的,如此
(defvar *passwords*
'((twitter-password "Secret")
(github-password "Sauce")))
然后想要将变量twitter-password
设置为"Sauce"
,依此类推。你只需映射它:
(mapcar #'(lambda (pair)
(let ((name (car pair))
(value (cadr pair)))
(set name value)))
*passwords*)