我想评估缓冲区并将结果发送到新缓冲区。如何将eval-buffer函数的结果“发送”到新缓冲区的内容?在这里我的尝试:
(set-buffer (get-buffer-create "test")) ; create new buffer
(let ((value (eval-buffer)) .... ; how to put this inside the new buffer?
答案 0 :(得分:3)
这将评估缓冲区evaluate-me
的内容,并将每个顶层表单的值打印到缓冲区output
:
(eval-buffer "evaluate-me" (get-buffer-create "output"))
执行 C-h f eval-buffer
以查看说明其工作原理的文档。 eval-buffer
的第二个参数名为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"))
答案 1 :(得分:1)
您的value
计算显示错误:由于set-buffer
将切换到新缓冲区,eval-buffer
将评估新空缓冲区的内容。我的理解是你想要评估前一个缓冲区的内容并在新缓冲区中打印它的值:
(let ((value (eval-buffer)))
(set-buffer (get-buffer-create "test"))
(print value))
如果您希望新缓冲区对用户可见,请将set-buffer
替换为switch-to-buffer
。