【问题标题】:Pipe emacs shell output to a new buffer管道 emacs shell 输出到新缓冲区
【发布时间】:2012-01-25 07:50:55
【问题描述】:

例如,我希望能够输入如下内容:

$ git diff | tempbuffer

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

【问题讨论】:

  • 如果我可以建议,请尝试 magit。它可能不完全符合您的要求。但我认为它符合您的需求github.com/magit/magit

标签: shell emacs


【解决方案1】:

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

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

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

我会用 M-! (phils 的回答)如果我从头开始启动 shell 命令和上面的命令(类似于 Sean 的回答),如果我在 shell 中“处于某些东西的中间”,然后决定“我想将它通过管道传输到 Emacs”。

【讨论】:

    【解决方案2】:

    我使用来自 emacs wiki 的信息作为起点制作了一个包 (e-sink)。它按照您的描述工作,并且“尾”是输出,而不是等到进程完成显示所有内容。

    【讨论】:

      【解决方案3】:

      不幸的是emacsclient 不读取它的标准输入,所以你需要某种包装器。这是一个适合我的 Bash shell 函数:

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

      【讨论】:

      • 感谢您的评论。对不起,我有点傻。我已将此函数放在我的 bash 文件中,并且可以从控制台调用它。但是,我不明白如何传入我真正想要运行的命令(即git diff)。
      • 就像你原来的帖子一样,即。 git diff | tempbuffer.
      【解决方案4】:

      您可以只使用 M-! -- 它会在与您的 shell 缓冲区相同的 cwd 中运行命令,并将结果输出到 *Shell Command Output* 缓冲区。

      请注意,如果结果是简短的,则该缓冲区将不会被提升,并且输出将被复制到回显区域;但是缓冲区 仍然使用且可用。 C-hf shell-command RET 详细说明了什么是“简短”输出:

      如果输出足够短,可以在回显区域显示 (由变量max-mini-window-height 确定,如果 resize-mini-windows 是非零),它显示在那里。 否则,将显示包含输出的缓冲区。

      【讨论】:

      • 你也可以用C-u M-!将输出放入当前缓冲区。
      • @Daimrod:这正是 OP 想要做的。她在一个 eshell 中,希望命令的输出转到一个新的缓冲区。
      • 这太棒了 - 谢谢。唯一缺少的是将新缓冲区置于正确的模式。例如,如果我将git diff 的结果发送到新缓冲区,我希望缓冲区处于差异模式。
      • 我发现你可以手动设置模式。比如我刚刚做了M-!然后git diff,我可以用M-x diff-mode设置缓冲区的diff模式。
      • @MaryRoseCook:你可能不再需要这个了,但是你有没有尝试在 diff 前面添加一个 emacs 模式行来指定模式?它可能会起作用,因为它会在加载缓冲区时被解析。
      【解决方案5】:

      如果您使用eshell,您可以将输出重定向到缓冲区,例如

       print foo > #<buffer bar>
      

      创建一个新的缓冲区bar,内容为'foo'。有关详细信息,请参阅 Emacswiki http://www.emacswiki.org/emacs/EshellRedirection

      【讨论】:

      • 谢谢。这确实适用于 eshell。但是,我使用的是普通 shell(即 M-x shell)。
      • 如果 eshell 不适合您,您可以将输出通过管道传输到 emacsclient。为此,您需要一个脚本或 shell 函数。作为起点,请参阅emacswiki.org/emacs/EmacsClient#toc43
      • 这在使用 TRAMP 时非常有用,例如。 "foo /ssh:user@machine:/some/remote/file > #"
      • @u-punkt,有没有办法自定义这个重定向?我想让它更简单一点,比如print foo &gt; #bar
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多