我想评估一个缓冲区并将结果发送到一个新的缓冲区。如何将 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-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"))
您的value
计算似乎错误:因为set-buffer
将切换到新缓冲区,eval-buffer
将评估新空缓冲区的内容。我的理解是你想评估前一个缓冲区的内容并在新缓冲区中打印它的值:
(let ((value (eval-buffer)))
(set-buffer (get-buffer-create "test"))
(print value))
如果您希望新缓冲区对用户可见,请替换set-buffer
为switch-to-buffer
.