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.
/home/username/.local/bin/docker-compose
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:
date
cal
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:
<,'>!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