created 2002 · complexity basic · author zzapper · version 6.0
Here are some examples of filtering which show how to save output from Vim commands, or read text from a file, or send text to an external program while capturing the output from that program.
Redirection can capture the output generated by Vim commands.
Redirection to clipboard register
+ (or use any other register a-z):
:redir @+ :history :g/fred/ " any other commands :redir END
The output from the commands used is now in register
+ which might pasted into a new buffer, for example by entering
:new then typing
"+p to paste.
If wanted, you can temporarily turn off Vim's paging so there will be no "More" prompts, as shown in the following example which outputs to register
A (so output is appended to register
:redir @A :set nomore :echo 'History' :history :echo 'Scripts loaded' :scriptnames :set more :redir END
Redirection to a file:
:redir > out.txt :registers " any other commands :redir END
The above writes to the new file
out.txt. The command does nothing if that file already exists. To overwrite the file if it exists, use
:redir! > out.txt. To create a new file or append to an existing file, use
:redir >> out.txt.
Store glob results in register
" Clear @a (register a) because need to use A to append. :let @a = '' " Append all lines containing 'fred' to register a. :g/fred/y A " Append to a file (must use >>). :'a,'b g/^Error/ .w >> errors.txt
The last command uses the
:.w command which writes the current line (
.) by appending it to file
Get output from external commands:
:r !ls " read output from running ls, after current line :0r !ls " after line 0 (before first line) :-r !ls " before current line ("-" is ".-1") :r !dir " use 'dir' on Windows
Filter current file using an external command (these examples use
sort, but Vim has a built-in :help :sort command which should be used to sort lines):
:%!sort -u " use an external program to sort all lines :'a,'b!sort -u " same, for lines from mark a to mark b inclusive
The term "filter" means to replace lines with the result from running a program. The original lines are sent as stdin to the program, and are replaced with stdout from the program. You can also filter using motion commands or visual selection:
!}sort " sort from cursor to end of paragraph 3!}sort " same, 3 paragraphs 3!!sort " sort 3 lines V " start visual selection of lines (move cursor) " select some lines !sort " sort the visually selected lines
Following is a Python program to sort the words on each line of standard input (each line is separately sorted).
# File sortwords.py from sys import stdin for line in stdin: print ' '.join(sorted(line.split()))
A file you are editing in Vim may include the following text:
this is a line with some words words on each line will be sorted fried banana and cream
Use this procedure to filter the text:
Von the first line, then
jjto select three lines.
!python sortwords.pyand press Enter.
The lines are replaced with the result from running the program:
a is line some this with words be each line on sorted will words and banana cream fried