Jak zapisać kopię bufora w pliku?


9

Chciałbym móc zapisać kopię (lub migawkę) bufora w pliku. Zachowanie byłoby podobne write-file, z wyjątkiem tego, że nie ustawiłby bufora na odwiedzanie tego pliku.

Na przykład wyobraź sobie, że masz sesję powłoki i chcesz szybko zapisać wszystko w pliku dziennika. Nie należy zmieniać nazwy bufora (aby funkcje zależne od nazwy bufora nadal działały) i nie powinien odwiedzać pliku (aby plik nie został przypadkowo nadpisany i nie było ostrzeżenia przy wychodzeniu z emacsa).

Mogę sobie wyobrazić kilka nieprzyzwoitych sposobów zrobienia tego, podam jeden jako odpowiedź na pytanie, ale czytając instrukcję, cały system „odwiedzanych plików” jest bardziej skomplikowany niż się wydaje i wydaje mi się, że łatwo jest napisać złe rozwiązanie. Czy istnieje ukryty, wbudowany sposób na osiągnięcie tego?

Odpowiedzi:


18

Po prostu wybierz cały bufor ( C-x h) i użyj write-region.


3
Nie musisz wybierać tekstu bufora, jeśli używasz write-regionz Lisp (np. We własnym poleceniu). Wystarczy przekazać go (point-min)i (point-max)wraz z nazwą pliku.
Drew

2
C-x h M-x write-region
Jakub Narębski

Dziękujemy za wybranie bufora i faktyczne M-x write-regionpolecenie.
Grant Bowman,

0

Brudne elisprobienie tego, co chcę robić:

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

Wygląda na to, że jest o wiele więcej kłopotów, niż powinno być potrzebne, ponieważ musimy zadbać zarówno o odwiedzany plik, jak i nazwę bufora, i nie możemy być pewni, że nie zapomnieliśmy nic więcej.

Inne rozwiązania polegające na skopiowaniu tekstu bufora do nowego bufora, a następnie zapisaniu i zabiciu tego bufora prawdopodobnie działałyby lepiej, ale martwiłbym się problemami z wydajnością dużych buforów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.