Como salvar uma cópia de um buffer em um arquivo?

9

Gostaria de poder salvar uma cópia (ou um instantâneo) de um buffer em um arquivo. O comportamento seria semelhante a write-file, exceto que ele não configuraria o buffer para visitar este arquivo.

Para um caso de uso, imagine que você tenha uma sessão de shell e deseje salvar tudo rapidamente em um arquivo de log. O buffer não deve ser renomeado (para que as funções que dependem do nome do buffer ainda funcionem) e não deve estar visitando um arquivo (para que o arquivo não seja substituído acidentalmente e não haja aviso ao sair do emacs).

Posso imaginar algumas maneiras sujas de fazer isso, postarei uma como resposta automática, mas, lendo o manual, todo o sistema "arquivo visitado" é mais complicado do que parece, e acho que é fácil redigir uma solução errada. Existe uma maneira oculta e integrada de conseguir isso?

T. Verron
fonte

Respostas:

18

Basta selecionar o buffer inteiro ( C-x h) e usar write-region.

Sean
fonte
3
Você não precisa selecionar o texto do buffer, se estiver usando o write-regionLisp (por exemplo, em seu próprio comando). Apenas passe (point-min)e (point-max), junto com o nome do arquivo.
Drew
2
C-x h M-x write-region
Jakub Narębski
Obrigado pelo buffer de seleção e pelo M-x write-regioncomando real .
Grant Bowman
0

Sujo elispfazendo o que eu quero fazer:

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

Isso parece muito mais complicado do que seria necessário, pois precisamos cuidar do arquivo visitado e do nome do buffer, e não podemos ter certeza de que não esquecemos mais nada.

Outras soluções que envolvem copiar o texto do buffer em um novo buffer e salvá-lo e eliminá-lo provavelmente funcionariam melhor, mas eu ficaria preocupado com problemas de desempenho com buffers grandes.

T. Verron
fonte