例如,我希望能够输入类似的内容:
$ git diff | tempbuffer
并在新的未保存缓冲区中打开diff。
答案 0 :(得分:10)
如果您使用eshell
,您可以将输出重定向到缓冲区,例如
print foo > #<buffer bar>
创建一个内容为'foo'的新缓冲区bar
。有关详细信息,请参阅http://www.emacswiki.org/emacs/EshellRedirection上的Emacswiki。
答案 1 :(得分:9)
您可以使用 M - ! - 它将在与shell缓冲区相同的cwd中运行命令,并将结果输出到*Shell Command Output*
缓冲区。
请注意,如果结果很简短,则不会引发该缓冲区并将输出复制到echo区域;但是缓冲区仍然是仍然可用。 C-h f shell-command
RET 详细说明了“简短”输出的内容:
如果输出足够短以显示在回波区域中 (由变量
max-mini-window-height
确定ifresize-mini-windows
是非零的,它显示在那里。 否则,将显示包含输出的缓冲区。
答案 2 :(得分:4)
不幸的是emacsclient
没有读取它的标准输入,所以你需要某种包装器。这是一个适合我的Bash shell函数:
tempbuffer() {
perl -MFile::Temp -MFile::Copy -e \
'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file';
}
答案 3 :(得分:0)
我使用emacs wiki中的信息作为起点制作了一个包(e-sink)。它就像你描述的那样工作并且“尾随”输出,而不是等到过程结束才能显示所有内容。
答案 4 :(得分:0)
我个人的偏好是您可以在Bash中输入的内容,而无需管理任何文件:
git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f)
在Bash删除临时文件之前,emacsclient等待您完成缓冲区。
我会用M-! (phils的答案)如果我从头开始执行shell命令和上面的(类似于Sean的答案),如果我在shell中的'某事'中然后决定'我想把它传递给Emacs'。