我想计算一个缓冲区并将结果发送到一个新的缓冲区。我如何"发送"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