Как сохранить копию буфера в файл?

9

Я хотел бы иметь возможность сохранить копию (или снимок) буфера в файл. Поведение будет аналогичным write-file, за исключением того, что он не будет устанавливать буфер для посещения этого файла.

Для примера использования представьте, что у вас есть сеанс оболочки, и вы хотите быстро сохранить все это в файл журнала. Буфер не следует переименовывать (чтобы функции, зависящие от имени буфера, все еще работали), и он не должен посещать файл (чтобы файл не был случайно перезаписан и при выходе из emacs не было предупреждений).

Я могу представить несколько грязных способов сделать это, я опубликую один в качестве самоответа, но, читая из руководства, вся система «посещенных файлов» сложнее, чем кажется, и я предполагаю, что легко составить неправильное решение Есть ли скрытый, встроенный способ достижения этого?

Т. Веррон
источник

Ответы:

18

Просто выберите весь буфер ( C-x h) и используйте write-region.

Шон
источник
3
Вам не нужно выбирать текст буфера, если вы используете write-regionиз Lisp (например, в вашей собственной команде). Просто передайте его (point-min)и (point-max)вместе с именем файла.
Дрю
2
C-x h M-x write-region
Якуб Наребски
Спасибо за выбранный буфер и актуальную M-x write-regionкоманду.
Грант Боуман
0

Грязно elispделать то, что я хочу сделать:

(defun tv/copy-buffer-to-file (filename)
  (interactive "sFile to write? ")
  (let ((bufname (buffer-name)))
    (set-visited-file-name filename)
    (save-buffer)
    (set-visited-file-name nil)
    (rename-buffer bufname)))

Это выглядит намного сложнее, чем нужно, так как мы должны позаботиться как о посещаемом файле, так и об имени буфера, и мы не можем быть уверены, что ничего не забыли.

Другие решения, включающие копирование текста буфера в новый буфер, а затем сохранение и уничтожение этого буфера, вероятно, будут работать лучше, но тогда я буду беспокоиться о проблемах производительности с большими буферами.

Т. Веррон
источник