将emacs shell输出管道输出到新缓冲区

时间:2011-12-21 13:52:46

标签: shell emacs

例如,我希望能够输入类似的内容:

$ git diff | tempbuffer

并在新的未保存缓冲区中打开diff。

5 个答案:

答案 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确定if   resize-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'。