2

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

(set-buffer (get-buffer-create "test"))  ; create new buffer

(let ((value (eval-buffer)) .... ; how to put this inside the new buffer?
4

2 回答 2

4

这将评估缓冲区的内容evaluate-me并将每个顶级表单的值打印到缓冲区output

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

请务必C-h f eval-buffer查看解释其工作原理的文档。的第二个参数eval-buffer是 named PRINTFLAG,其中文档字符串说:

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"))
于 2013-05-18T01:31:24.787 回答
1

您的value计算似乎错误:因为set-buffer将切换到新缓冲区,eval-buffer将评估新空缓冲区的内容。我的理解是你想评估前一个缓冲区的内容并在新缓冲区中打印它的值:

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

如果您希望新缓冲区对用户可见,请替换set-bufferswitch-to-buffer.

于 2013-05-18T07:35:01.353 回答