Есть ли функция типа fopen в elisp - PullRequest
0 голосов
/ 14 октября 2018

Мне известна идиома insert-file-contents:

(defun read-lines (filePath)
  (with-temp-buffer
    (insert-file-contents filePath)
    (split-string (buffer-string) "\n" t)))

Но есть ли более естественный способ читать файл построчно, не читая весь файл сразу?Я ищу fopen / fread -подобную функциональность.

1 Ответ

0 голосов
/ 15 ноября 2018

Я думаю, что естественным способом работы с файлами в emacs является загрузка файла в буфер, после чего вы можете обрабатывать его построчно.посмотрите также этот ответ в emacs stackexchange и этот пост от ergoemacs

, например, например:

ELISP> (find-file "foo.txt")
#<buffer foo.txt>
ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
  (print (current-line-contents))
  (forward-line 1))

Sample emacs interaction

Чтобы не получить свойства, вы можете использовать функцию вещь в точке:

ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
         (print (thing-at-point 'line t))
         (forward-line 1))

"line 1
"

"line 2
"

"line 3
"

"line 4
"

nil

, если вам нужно работать с временными буферами для из соображений скорости попробуйте это:

 (with-temp-buffer
         (insert-file-contents "./foo.txt")
         (while (not (eobp))
           (print (thing-at-point 'line t))
           (forward-line 1)))
...