For example, I want to be able to type something like:
$ git diff | tempbuffer
and have the diff opened in a new, unsaved buffer.
For example, I want to be able to type something like:
$ git diff | tempbuffer
and have the diff opened in a new, unsaved buffer.
You can just use M-! -- it will run the command within the same cwd as your shell buffer, and output the results to a *Shell Command Output* buffer.
Note that if the results are brief, that buffer will not be raised and the output will be copied to the echo area; however the buffer is still used and available. C-hf shell-command RET has details of what constitutes "brief" output:
If the output is short enough to display in the echo area (determined by the variable
max-mini-window-heightifresize-mini-windowsis non-nil), it is shown there. Otherwise, the buffer containing the output is displayed.
git diff to a new buffer, I'd like the buffer to be in diff mode.M-! and then git diff, I can set the diff mode of the buffer with M-x diff-mode.If you use eshell you can redirect output to a buffer, e.g.
print foo > #<buffer bar>
which creates a new buffer bar with the content 'foo'. For further details, see the Emacswiki at http://www.emacswiki.org/emacs/EshellRedirection.
print foo > #bar.#<> characters. It feel it should be doable to simplify it but I'm still a beginner so I don't know yet how.Unfortunately emacsclient doesn't read its standard input, so you need some kind of wrapper. Here's a Bash shell function that works for me:
tempbuffer() {
perl -MFile::Temp -MFile::Copy -e \
'copy *STDIN, $file = File::Temp->new; system "emacsclient", $file';
}
git diff).git diff | tempbuffer.My personal preference is for something you can type in Bash without having to manage any files:
git diff | (f=$(mktemp); cat > $f; emacsclient $f; rm -v $f)
emacsclient waits for you to be finished with the buffer before Bash deletes the temporary file.
I would use M-! (phils's answer) if I was starting the shell command from scratch and the above (which is similar to Sean's answer) if I was 'in the middle of something' in the shell and then decided 'I want to pipe this to Emacs'.