Obter conteúdo de um buffer

15

Então, buffer-stringobtém o conteúdo do buffer atual. Mas não permite especificar outros buffers.

Como posso contornar isso? Preciso de algo save-window-excursionpara fazê-lo funcionar?

Maciej Goszczycki
fonte
Se você não se importa que eu pergunte, o que você está tentando fazer?
Lucas
@King Estou criando um processo assíncrono e quero enviar o conteúdo do buffer como entrada padrão. Achei que podia usar process-send-stringe fiquei preso.
Maciej Goszczycki

Respostas:

25

Muitas coisas no Emacs operam no buffer atual. Você precisa alterar o buffer atual e restaurá-lo quando terminar. Use with-current-bufferpara casos simples em que você só precisa fazer algo em outro buffer e save-current-bufferpara casos mais complexos em que você precisa navegar entre vários buffers.

(defun buffer-string* (buffer)
  (with-current-buffer buffer
    (buffer-string)))

Se você deseja que o conteúdo do texto do buffer sem propriedades, chame buffer-substring-no-properties.

buffer-stringretorna apenas a parte reduzida do buffer. Se você precisar de todo o conteúdo, amplie-o após salvar o estreitamento.

(defun buffer-whole-string (buffer)
  (with-current-buffer buffer
    (save-restriction
      (widen)
      (buffer-substring-no-properties (point-min) (point-max)))))

Se você também precisar salvar o ponto, ligue save-excursiontambém. Observe que save-excursionrestaura o ponto apenas no buffer atual; portanto, se você precisar alternar para outro buffer e se mover por aí, ligue para save-excursiondentro save-current-bufferou with-current-buffer.

Gilles 'SO- parar de ser mau'
fonte