Vim: `!!`

The vi term is cmdline-ranges, see :help cmdline-ranges, good youtube video that describes a lot of related ex commands and how these work

In command mode, you can hit !! twice, to bring up a prompt which will send the current line to some external command.

For example, if you write:

which docker-compose

and then on that line, type !!bash, it’ll send that to bash, and replace the current line with the output of that command.


Could just as easily send some snippet of code to python or perl, or anything.

  • :.$ to run vim commands
  • :.! to run external commands

This doesn’t have to be on single lines though, you can do 6!! to send 6 lines to some external command.

As an example for vim commands, the keystrokes you’d have to do to write 5 lines to another file would be:

5!!<delete>$:w /tmp/output

the delete is to replace the ! (external vim command) to a $, which specifies a vim command.

The line would look like:

:.,.+4$:w /tmp/foo

The complicated .,.+4 is generated by vim when you do !!5, $:w /tmp/foo is the command I typed in.

I have a script called ix here which accepts some text as STDIN and makes an ix (pastebin), so I can do something like:

5!!ix -v (which becomes :.,.+4!ix -v)

.. which takes those 5 lines and uploads them to ix, copying a link to that paste to my clipboard, without ever leaving vim!

While not a feature in vi, in vim and neovim, this also works with visual mode, so say you had two commands:


If you go into visual line mode (V) and select both lines, then hit !, the become

'<,'>! — which represents your selection

By sending that to bash:


Sat Mar 12 02:19:04 PM PST 2022
     March 2022
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31