Vim Tips Wiki
(make the tab portion of the tip more obvious, put in tabs category)
(change "anon" author to blank; trim "created" date; minor manual clean)
Line 4: Line 4:
 
|previous=94
 
|previous=94
 
|next=96
 
|next=96
|created=August 7, 2001
+
|created=2001
 
|complexity=intermediate
 
|complexity=intermediate
|author=Anonymous
+
|author=
|version=6.0
+
|version=7.0
 
|rating=88/31
 
|rating=88/31
 
|category1=Tabs
 
|category1=Tabs
Line 14: Line 14:
 
Ever want to capture the output of an ex command like <tt>:set all</tt> into a Vim text buffer for easy viewing? This is actually a very easy thing to accomplish!
 
Ever want to capture the output of an ex command like <tt>:set all</tt> into a Vim text buffer for easy viewing? This is actually a very easy thing to accomplish!
   
You can use the :redir command to redirect the output of an ex command to a register and then paste the contents of the register into a Vim buffer.
+
You can use the <tt>:redir</tt> command to redirect the output of an ex command to a register and then paste the contents of the register into a Vim buffer.
For example:
 
   
 
For example:
 
<pre>
 
<pre>
 
:redir @a
 
:redir @a
Line 26: Line 26:
   
 
You can also write a Vim function to do the above. Since you probably don't want your command output to mess up your carefully constructed window layout, this function will pipe the output of a command into a new tab, allowing you to simply close the tab when done. If you don't like [[Introduction to using tab pages|using tabs]], or you don't have tab support because you didn't compile with it or your Vim version is less than 7.0, you could modify this function to use a new split window instead:
 
You can also write a Vim function to do the above. Since you probably don't want your command output to mess up your carefully constructed window layout, this function will pipe the output of a command into a new tab, allowing you to simply close the tab when done. If you don't like [[Introduction to using tab pages|using tabs]], or you don't have tab support because you didn't compile with it or your Vim version is less than 7.0, you could modify this function to use a new split window instead:
 
 
<pre>
 
<pre>
 
function! TabMessage(cmd)
 
function! TabMessage(cmd)
redir => message
+
redir => message
silent execute a:cmd
+
silent execute a:cmd
redir END
+
redir END
tabnew
+
tabnew
silent put=message
+
silent put=message
set nomodified
+
set nomodified
 
endfunction
 
endfunction
 
command! -nargs=+ -complete=command TabMessage call TabMessage(&lt;q-args>)
 
command! -nargs=+ -complete=command TabMessage call TabMessage(&lt;q-args>)
Line 45: Line 44:
   
 
==References==
 
==References==
* {{help|:redir}}
+
*{{help|:redir}}
   
 
==Related scripts==
 
==Related scripts==
* {{script|id=120|text=Decho}}
+
*{{script|id=120|text=Decho}}
   
 
==Comments==
 
==Comments==
 
This may be obvious to experts, but it took me a very long time to figure it out, because Google searches on terms like 'pipe', 'buffer', 'shell', etc never brought it to my attention. However, you can pipe the contents of the file currently being edited (the current buffer) to a shell command, and replace the current file/buffer with the _output_ of that command, using this:
 
This may be obvious to experts, but it took me a very long time to figure it out, because Google searches on terms like 'pipe', 'buffer', 'shell', etc never brought it to my attention. However, you can pipe the contents of the file currently being edited (the current buffer) to a shell command, and replace the current file/buffer with the _output_ of that command, using this:
  +
<pre>
 
:%! [cmd]
+
:%! [cmd]
  +
</pre>
   
 
ie, if you didn't know the :retab command (as for a long time I didn't), you could expand tabs using basic unix commands like ":%! expand -t 4". Wish I'd known this a long time ago, so I'm posting it here in the hopes that others might find it :-)
 
ie, if you didn't know the :retab command (as for a long time I didn't), you could expand tabs using basic unix commands like ":%! expand -t 4". Wish I'd known this a long time ago, so I'm posting it here in the hopes that others might find it :-)
   
 
----
 
----
The answer is (for ex.):
+
The answer is (for example):
  +
<pre>
 
:read !ls ~
+
:read !ls ~
  +
</pre>
   
and :help :read for more info
+
and {{help|:read}} for more information.
   
 
----
 
----

Revision as of 03:56, 4 December 2009

Tip 95 Printable Monobook Previous Next

created 2001 · complexity intermediate · version 7.0


Ever want to capture the output of an ex command like :set all into a Vim text buffer for easy viewing? This is actually a very easy thing to accomplish!

You can use the :redir command to redirect the output of an ex command to a register and then paste the contents of the register into a Vim buffer.

For example:

:redir @a
:set all
:redir END

Now, register 'a' will have the output of the "set all" ex command. You can paste this into a Vim buffer, using "ap.

You can also write a Vim function to do the above. Since you probably don't want your command output to mess up your carefully constructed window layout, this function will pipe the output of a command into a new tab, allowing you to simply close the tab when done. If you don't like using tabs, or you don't have tab support because you didn't compile with it or your Vim version is less than 7.0, you could modify this function to use a new split window instead:

function! TabMessage(cmd)
  redir => message
  silent execute a:cmd
  redir END
  tabnew
  silent put=message
  set nomodified
endfunction
command! -nargs=+ -complete=command TabMessage call TabMessage(<q-args>)

Example usage:

:TabMessage highlight

Note that :redir can use a variable instead of a register, as shown above.

References

Related scripts

Comments

This may be obvious to experts, but it took me a very long time to figure it out, because Google searches on terms like 'pipe', 'buffer', 'shell', etc never brought it to my attention. However, you can pipe the contents of the file currently being edited (the current buffer) to a shell command, and replace the current file/buffer with the _output_ of that command, using this:

:%! [cmd]

ie, if you didn't know the :retab command (as for a long time I didn't), you could expand tabs using basic unix commands like ":%! expand -t 4". Wish I'd known this a long time ago, so I'm posting it here in the hopes that others might find it :-)


The answer is (for example):

:read !ls ~

and :help :read for more information.