Emacs:将eval的输出发送到一个新的缓冲区



我想计算一个缓冲区并将结果发送到一个新的缓冲区。我如何"发送"eval-buffer函数的结果到新缓冲区的内容?这是我的尝试:

(set-buffer (get-buffer-create "test"))  ; create new buffer
(let ((value (eval-buffer)) .... ; how to put this inside the new buffer?

计算缓冲区evaluate-me的内容,并将每个顶层表单的值打印到缓冲区output:

(eval-buffer "evaluate-me" (get-buffer-create "output"))

执行C-hf eval-buffer以查看解释此工作原理的文档。eval-buffer的第二个参数命名为PRINTFLAG,其中docstring表示:

PRINTFLAG controls printing of output:
 A value of nil means discard it; anything else is stream for print.

有点令人困惑的是Emacs对"输出流"的不同寻常的概念。缓冲区、标记(缓冲区中的位置)和回声区域都可以被视为"流",任何接受字符参数的函数都可以。查看print函数或standard-output变量的文档字符串以获取更多信息。

让事情发生在另一个缓冲区内的更通用的方法是宏with-current-buffer。与set-buffer不同,即使在包装的代码中发生错误,它也会干净地恢复原始上下文。
(with-current-buffer (get-buffer-create "output")
  (insert "some text"))

您的value计算出现错误:由于set-buffer将切换到新的缓冲区,eval-buffer将计算新的空缓冲区的内容。我的理解是,您想要计算前一个缓冲区的内容,并在新缓冲区中打印其值:

(let ((value (eval-buffer)))
  (set-buffer (get-buffer-create "test"))
  (print value))

如果你想让新的缓冲区对用户可见,用switch-to-buffer代替set-buffer

相关内容

最新更新