从文件读取到Emacs lisp列表

Håk*_*and 7 emacs elisp

我有以下文件 data.txt

A
B
C
D
Run Code Online (Sandbox Code Playgroud)

我想把这个文件的内容读成一个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)))
Run Code Online (Sandbox Code Playgroud)

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

abo*_*abo 9

这段代码:

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您有一个访问`data.txt`的打开缓冲区,并且该缓冲区变窄,则此函数可能无法返回它应该返回的所有内容.你应该在`(save-restriction(widen)...)`中将该调用包装成`split-string`. (3认同)
  • 使用`with-temp-buffer`和`insert-file-contents`代替`with-current-buffer`和`find-file-noselect`以避免留下缓冲区. (3认同)

Mir*_*lov 6

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

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

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