我想评估一个缓冲区并将结果发送到一个新的缓冲区。如何将eval-buffer函数的结果“发送”到新缓冲区的内容?在这里我尝试:Emacs:发送eval的输出到一个新的缓冲区
(set-buffer (get-buffer-create "test")) ; create new buffer
(let ((value (eval-buffer)) .... ; how to put this inside the new buffer?
我想评估一个缓冲区并将结果发送到一个新的缓冲区。如何将eval-buffer函数的结果“发送”到新缓冲区的内容?在这里我尝试:Emacs:发送eval的输出到一个新的缓冲区
(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"))
做章˚Feval-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"))
你value
出现计算错误:因为set-buffer
将切换到新的缓冲区,eval-buffer
将评估新的空缓冲区的内容。我的理解是,你要评估之前的缓冲区的内容,并在新的缓冲区打印它的价值:如果你想在新的缓冲区是对用户可见
(let ((value (eval-buffer)))
(set-buffer (get-buffer-create "test"))
(print value))
,与switch-to-buffer
更换set-buffer
。