将Emacs shell输出导入新缓冲区

13
例如,我想要能够输入类似以下内容的东西:
$ git diff | tempbuffer

并且在一个新的、未保存的缓冲区中打开差异。


3
如果我可以建议,试试使用Magit。它可能不完全符合您的要求,但我认为它能满足您的需要。https://github.com/magit/magit - kindahero
5个回答

10
如果您使用eshell,您可以将输出重定向到缓冲区,例如。
 print foo > #<buffer bar>

该命令创建一个名为 bar,并包含内容为 'foo' 的新缓冲区。有关更多详细信息,请参见 Emacswiki 上的http://www.emacswiki.org/emacs/EshellRedirection


1
谢谢。这对于eshell确实有效。但是,我正在使用正常的shell(即M-x shell)。 - Mary Rose Cook
1
如果你不能使用eshell,你可以将输出管道到emacsclient。你需要一个脚本或shell函数来实现这一点。作为起点,请参考http://www.emacswiki.org/emacs/EmacsClient#toc43。 - u-punkt
当使用TRAMP时,这非常有用,例如:"foo /ssh:user@machine:/some/remote/file > #<buffer bar>" - Warbo
@u-punkt,有没有办法自定义这个重定向?我想让它更简单一些,类似于“print foo > #bar”的形式。 - rph

9
您可以使用M-!命令,它将在与您的shell缓冲区相同的cwd中运行命令,并将结果输出到*Shell Command Output*缓冲区。
请注意,如果结果很简短,则不会提高该缓冲区,并且输出将被复制到回声区域; 但是缓冲区仍然可以使用和可用。按C-hf shell-command RET可以了解什么构成“简要”输出的详细信息:

如果输出足够短以显示在回声区域中 (由变量max-mini-window-height确定,如果 resize-mini-windows为非nil),则在其中显示。 否则,显示包含输出的缓冲区。


3
您也可以使用 C-u M-! 将输出放置在当前缓冲区中。 - Daimrod
1
@Daimrod:这正是OP不想做的事情。她在eshell中,希望命令的输出进入一个新的缓冲区。 - Thomas
1
这太棒了 - 谢谢。唯一缺失的部分是将新缓冲区放入正确的模式中。例如,如果我将 git diff 的结果发送到一个新缓冲区,我希望该缓冲区处于 diff 模式。 - Mary Rose Cook
1
我发现你可以手动设置模式。例如,如果我刚刚执行了M-!,然后执行了git diff,我可以使用M-x diff-mode来设置缓冲区的差异模式。 - Mary Rose Cook
@MaryRoseCook:你可能不再需要这个了,但是你尝试过在diff前面添加一个emacs modeline来指定模式吗?这可能会起作用,因为它会在加载缓冲区时被解析。 - haylem

4

很遗憾,emacsclient不能读取标准输入,所以你需要一些包装器。这里是一个适用于我个人的Bash shell函数:

tempbuffer() {
  perl -MFile::Temp -MFile::Copy -e \
  'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file';
}

感谢您的评论。抱歉,我有点傻。我已经将此函数放入我的bash文件中,并可以从控制台调用它。但是,我不明白如何传递我实际想要运行的命令(即git diff)。 - Mary Rose Cook
就像在您的原始帖子中一样,即 git diff | tempbuffer - Sean

1

我的个人偏好是能够在Bash中键入而无需管理任何文件的内容:

git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f)

emacsclient 在 Bash 删除临时文件之前等待您完成对缓冲区的操作。

如果我从头开始启动 shell 命令,我会使用 M-!(phils 的答案),如果我正在 shell 中间某个位置并决定“我想将此管道传输到 Emacs”,那么我会使用上述方法(类似于 Sean 的答案)。


0
我使用emacs维基上的信息作为起点,制作了一个包(e-sink)。它按照您描述的方式工作,并且“tail”输出而不是等待进程完成以显示所有内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接