Bagaimana cara menyimpan salinan buffer ke file?

9

Saya ingin dapat menyimpan salinan (atau foto) buffer ke dalam file. Perilaku akan serupa write-file, kecuali bahwa itu tidak akan mengatur buffer untuk mengunjungi file ini.

Untuk usecase, bayangkan Anda memiliki sesi shell, dan Anda ingin menyimpannya dengan cepat ke file log. Buffer tidak boleh diganti namanya (sehingga fungsi yang mengandalkan nama buffer masih berfungsi), dan tidak boleh mengunjungi file (sehingga file tidak sengaja ditimpa, dan tidak ada peringatan saat keluar dari emacs).

Saya bisa membayangkan beberapa cara kotor melakukan ini, saya akan memposting satu sebagai jawaban sendiri, tetapi membaca dari manual, keseluruhan "file yang dikunjungi" sistem lebih rumit daripada yang terlihat, dan saya kira mudah untuk membuat konsep solusi yang salah. Apakah ada cara yang tersembunyi dan terintegrasi untuk mencapai ini?

T. Verron
sumber

Jawaban:

18

Cukup pilih seluruh buffer ( C-x h) dan gunakan write-region.

Sean
sumber
3
Anda tidak perlu memilih teks buffer, jika Anda menggunakan write-regiondari Lisp (mis. Dalam perintah Anda sendiri). Cukup kirimkan (point-min)dan (point-max), bersama dengan nama file.
Drew
2
C-x h M-x write-region
Jakub Narębski
Terima kasih untuk buffer pilih dan M-x write-regionperintah yang sebenarnya .
Grant Bowman
0

Kotor elispmelakukan apa yang ingin saya lakukan:

(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)))

Sepertinya ini lebih merepotkan daripada yang seharusnya, karena kita harus menjaga baik file yang dikunjungi dan nama buffer, dan kita tidak bisa memastikan bahwa kita tidak melupakan hal lain.

Solusi lain yang melibatkan menyalin teks buffer dalam buffer baru, kemudian menyimpan dan membunuh buffer itu mungkin akan bekerja lebih baik, tetapi saya kemudian akan khawatir dengan masalah kinerja dengan buffer besar.

T. Verron
sumber