One of Vim's lesser-known operators is
v are the
> are the theater kids, and
! is the kid
who has to eat with the teachers because no one likes them.
I assume you understand text objects and the basics of UNIX and piping.
! takes a range, asks for a UNIX command (which I'll call a
filter, since most of the useful commads are filters) on Vim's command
line, and runs the filter on it by using that range as STDIN. It
replaces the range with the output of the command.
For example, placing your cursor (in Vim) on the next line and typing
:.!wc -w would replace the line with the text
testing testing one two three
Let's break that command down:
:opens Vim's command mode.
.selects the line the cursor is on.
!means the rest of the line is interpreted as a UNIX command.
wc -wcounts the words in the selected region, which is 5.
Say you want to copy the contents of a file from the web and you have
the URL copied. One way to do it is to put your cursor on an empty
region (to avoid replacing some text you don't want to replace) and
:.!curl (url of file you want)
Word Count and Undo
a long block of text ...
Visually select the text, or use a text object like
!ip (filter in
paragraph). Then run the following command using the filter.
That'll tell you how many words are in that region. Hit
u to undo
the text replacement. After all, you wouldn't want to lose all those
hard-typed words, would you?
Evaluate Code / Cheap Calculator
Say you're in a Python file and you have a code block like the following:
if 2+2: print("hi") else: pass
You can use this as a quick way of evaluating a code block, or as a poor man's calculator. This works independent of the filetype. I just tested it in a Markdown file.
Lining up tables
You have some text in a table and it's not well-aligned
1 2 3 4
!column -t will turn it into a nice table like this:
1 2 3 4
Sort / Unique
!sort | uniq (or the more concise
do what you'd imagine they do.
Go Out and Try It
I'm sure you'll find some uses for it. If any of them come in especially handy, let me know