从文件读取到Emacs lisp列表

时间:2013-12-23 16:15:41

标签: emacs elisp

我有以下文件data.txt

A
B
C
D

我想将此文件的内容读入Lisp list,如

(defun read-list-from-file (fn)
  (interactive)
  (list "A" "B" "C" "D"))

(defun my-read ()
  (interactive)
  (let (( mylist (read-list-from-file "data.txt")))
    (print mylist t)))

如何修改read-list-from-file以使其返回相同的列表,而是从作为输入参数fn给出的文件中读取。文件中的每一行应该是列表中的单独项目..

2 个答案:

答案 0 :(得分:9)

此代码:

(with-current-buffer
    (find-file-noselect "~/data.txt")
  (split-string
   (save-restriction
     (widen)
     (buffer-substring-no-properties
      (point-min)
      (point-max)))
   "\n" t))

UPD:

以下是insert-file-contents的版本:

(defun slurp (f)
  (with-temp-buffer
    (insert-file-contents f)
    (buffer-substring-no-properties
       (point-min)
       (point-max))))

(split-string
 (slurp "~/data.txt") "\n" t)

答案 1 :(得分:6)

比创建临时缓冲区要容易得多的是使用f文件操作库的f-read函数来返回文件的文本内容(默认编码为UTF-8)。 f是您需要从MELPA安装的第三方,阅读有关如何使用Emacs包管理系统的Xah Lee's教程。然后你可以使用split-strings字符串操作库&{39} {s-split(这是前一个函数的简单包装):

(s-split "\n" (f-read "~/data.txt") t) ; ("A" "B" "C" "D")

注意:设置为s-split的{​​{1}}的第三个参数省略了空字符串。您可以使用s-lines,但由于* nix系统上的文本文件通常包含尾随换行符,因此返回的列表将为t。您可以使用dash列表操作库的butlast函数删除最后一个元素,但这适用于O(n),因此可能会坚持("A" "B" "C" "D" ""),除非您想要空行保留在列表中。

相关问题