Pipe output of shell command (!) into a new buffer in Vim
How can I pipe the output of a shell command into a new buffer in Vim? The following obviously wouldn't work, but you can see what I'm getting at:
:!echo % | :newtab
Solution 1:
You can't pipe the output of a shell command into a command that creates a new buffer, but you can create a new buffer and read the output of a shell command into that buffer with one entry on Vim's command line. A working version of your example would be
:tabnew | r !echo <c-r>=bufname("#")<cr>
Note that the pipe symbol in this case is a separator between Vim ex commands, not the shell's pipe. See also
:help :tabnew
:help :r!
:help :bar
Solution 2:
Here's what I do. It's alluded to in comments in the above answers.
:new | r ! <cmd>
:new | r ! <cmd> # (# is replaced with filename)
Example 1: Find all text files in /tmp
:new | r ! find /tmp -name '*.txt'
Example 2: You're editing file foo.txt and you want to run ls -la foo.txt
and get the output in a buffer:
:new | r ! ls -la #
The #
is replaced with the filename of the original buffer you're editing. This is particularly useful for ad-hoc source control commands e.g.
:new | r ! hg annotate -un #
:new
creates a horizontal split, use :vnew
if you want a vertical split instead and :tabnew
for a new tab.