如何正确解析elisp中的缓冲区?

yPh*_*hil 4 emacs elisp

解析缓冲区以存储其内容并重用它的正确方法是什么?

说我有这个缓冲区:

always|five|words|by|line
not|always|the|same|words
sometimes|no|lines|at|all
but|only|five|no|more/less
Run Code Online (Sandbox Code Playgroud)

从行中找到的符号构造列表的最佳方法是什么(如果没有找到,则错误很好)?

缓冲区在那里,我可以访问它,得到它的内容

(message "Buffer content : %s" (buffer-substring (point-min) (point-max)))
Run Code Online (Sandbox Code Playgroud)

在我干净地杀死它之后,但不知怎的,我在构造对象(列表"行"的列表"行")中失败了,这将允许我这样做:

(list-length lines)
    ==> 4

(car (nthcdr 3 lines))
    ==> sometimes
Run Code Online (Sandbox Code Playgroud)

一个有同情心的灵魂可以指向我的光明吗?谢谢你的耐心,Lisp长老.

Jon*_* O. 7

您也可以使用内置split-string函数,类似于splitPerl和其他语言:

(defun buffer-to-list-of-lists (buf)
  (with-current-buffer buf
    (save-excursion
      (goto-char (point-min))
      (let ((lines '()))
        (while (not (eobp))
          (push (split-string
                 (buffer-substring (point) (point-at-eol)) "|")
                lines)
          (beginning-of-line 2))
        (nreverse lines)))))
Run Code Online (Sandbox Code Playgroud)

然后在名为的缓冲区中使用示例文本temp,(buffer-to-list-of-lists "temp")返回值

(("always" "five" "words" "by" "line") 
 ("not" "always" "the" "same" "words")
 ("sometimes" "no" "lines" "at" "all")
 ("but" "only" "five" "no" "more/less"))
Run Code Online (Sandbox Code Playgroud)

这将适用于具有任意数量的|单词的行,这些单词可能会或可能不会更好地适用于您的应用程序.如果您不希望列表列表中的字符串包含它们在原始缓冲区中的字体信息和其他属性,请更改buffer-substringbuffer-substring-no-properties.

一旦你按照自己的意愿工作,你还需要将你的示例用法(list-length '(lines))改为(list-length lines).在当前形式中,您要求的是仅包含符号的常量单元素列表的长度lines.