Vim Tips Wiki
(Uploaded by JohnBot from a locally edited file)
No edit summary
Tag: sourceedit
(9 intermediate revisions by 4 users not shown)
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
  +
|category2=
 
}}
 
}}
This is a *request* for a tip. I need to be able to pipe the output of a :blah ex command into the Vim text buffer for editing. I wanted to do this many times for different reasons and could never find a way!
+
Ever want to capture the output of an ex command like <code>:set all</code> into a Vim text buffer for easy viewing? This is actually a very easy thing to accomplish!
   
 
You can use the <code>:redir</code> command to redirect the output of an ex command to a register and then paste the contents of the register into a Vim buffer.
I would just love to be able to do :hi --&gt; textBuffer and examine the output at my own leasure scrolling up and down and using Vim search commands on it. Same thing for :set all, and other things. Considering that cut and paste is horrible in windows, I can't for example do :set guioptions? then cut and paste! So I have to retype it, or cut and paste from the help manual. I really want to be able to pipe the output of ex commands into the text buffer. Can someone help me?
 
   
==Comments==
 
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:
 
For example:
 
 
<pre>
 
<pre>
 
:redir @a
 
:redir @a
Line 25: Line 23:
 
</pre>
 
</pre>
   
Now, register 'a' will have the output of the "set all" ex command. You can paste this into a Vim buffer. You can also write a Vim function to do the above.
+
Now, register 'a' will have the output of the "set all" ex command. You can paste this into a Vim buffer, using <code>"ap</code>.
   
  +
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 tab pages]], 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:
See {{help|:redir}}.
 
  +
<pre>
 
function! TabMessage(cmd)
 
redir => message
 
silent execute a:cmd
 
redir END
  +
if empty(message)
  +
echoerr "no output"
  +
else
  +
" use "new" instead of "tabnew" below if you prefer split windows instead of tabs
 
tabnew
  +
setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted nomodified
 
silent put=message
  +
endif
 
endfunction
 
command! -nargs=+ -complete=command TabMessage call TabMessage(&lt;q-args>)
  +
</pre>
   
 
Example usage:
----
 
 
<pre>:TabMessage highlight</pre>
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:
 
   
  +
Note that <code>:redir</code> can use a variable instead of a register, as shown above.
:%! [cmd]
 
   
  +
==References==
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 :-)
 
 
*{{help|:redir}}
   
  +
==Related scripts==
----
 
  +
*{{script|id=120|text=Decho}}
The answer is (for ex.):
 
   
 
==Comments==
:read !ls ~
 
 
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]
  +
</pre>
   
  +
That is, if you didn't know about the <code>:retab</code> command, you could expand tabs using basic Unix commands like <code>:%! expand -t 4</code>.
and :help :read for more info
 
   
 
----
 
----
 
The answer is (for example):
Here's a function that pipes the output of a command into a new tab (Vim 7.0):
 
 
 
<pre>
 
<pre>
 
:read !ls ~
function! TabMessage(cmd)
 
redir =&gt; message
 
silent execute a:cmd
 
redir END
 
tabnew
 
silent put=message
 
set nomodified
 
endfunction
 
command! -nargs=+ -complete=command TabMessage call TabMessage(&lt;q-args&gt;)
 
 
</pre>
 
</pre>
   
 
and {{help|:read}} for more information.
Example usage:
 
 
----
:TabMessage highlight
 
 
Here is a function that inserts the output of an Ex command into a split window:
 
  +
function! OutputSplitWindow(...)
Another alternative is to use Dredir function in the Decho script {{script|id=120}}.
 
  +
" this function output the result of the Ex command into a split scratch buffer
 
  +
let cmd = join(a:000, ' ')
  +
let temp_reg = @"
  +
redir @"
  +
silent! execute cmd
  +
redir END
  +
let output = copy(@")
  +
let @" = temp_reg
  +
if empty(output)
  +
echoerr "no output"
  +
else
  +
new
  +
setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted
  +
put! =output
  +
endif
  +
endfunction
  +
command! -nargs=+ -complete=command Output call OutputSplitWindow(<f-args>)
  +
Example: :Output echo strftime("%H:%M")
  +
:I think I incorporated the useful stuff out of this script into the tip. I did not see much in the way of important differences, and in some ways the tip was better. --[[User:Fritzophrenic|Fritzophrenic]] ([[User talk:Fritzophrenic|talk]]) 18:00, June 3, 2015 (UTC)
 
----
 
----

Revision as of 12:11, 7 June 2015

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 tab pages, 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
  if empty(message)
    echoerr "no output"
  else
    " use "new" instead of "tabnew" below if you prefer split windows instead of tabs
    tabnew
    setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted nomodified
    silent put=message
  endif
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]

That is, if you didn't know about the :retab command, you could expand tabs using basic Unix commands like :%! expand -t 4.


The answer is (for example):

:read !ls ~

and :help :read for more information.


Here is a function that inserts the output of an Ex command into a split window:

function! OutputSplitWindow(...)
  " this function output the result of the Ex command into a split scratch buffer
  let cmd = join(a:000, ' ')
  let temp_reg = @"
  redir @"
  silent! execute cmd
  redir END
  let output = copy(@")
  let @" = temp_reg
  if empty(output)
    echoerr "no output"
  else
    new
    setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted
    put! =output
  endif
endfunction
command! -nargs=+ -complete=command Output call OutputSplitWindow(<f-args>)

Example: :Output echo strftime("%H:%M")

I think I incorporated the useful stuff out of this script into the tip. I did not see much in the way of important differences, and in some ways the tip was better. --Fritzophrenic (talk) 18:00, June 3, 2015 (UTC)