Written March 3, 2014. Tagged Vim.
When my pair programming partner saw how I use Vim's c%
operator-motion combo, he described it as "life-changing". While that might be overstating things, it is quite useful.
Say you want to change link_to("text", my_path("one", "two"))
into link_to("text", one_two_path)
.
Assume the caret is on the m
in my_path
:
link_to("text", my_path("one", "two"))
^
You could hit cf)
to change up-to-and-including the next ")".
Or you could hit c%
to do the same thing.
This saves you one character. Nice, but not a big deal.
Now let's say the input text was link_to("text", my_path(singularize("one"), pluralize(double("two"))))
.
You could count the brackets carefully and hit c4f)
.
Or you could just hit c%
.
How does this work?
The %
motion finds the next parenthesis on the current line and then jumps to its matching parenthesis.
link_to("text", my_path(singularize("one"), pluralize(double("two"))))
^ A B
So the %
motion finds A
, then jumps to its matching parenthesis B
. Everything between ^
and B
(inclusive) will be changed.
That's not quite all %
does. It also handles []
square brackets, {}
curly braces and some other things. It can be used as a standalone motion or with other operators than c
.
For example, you could use %d%
to change remove_my_argument(BigDecimal(123))
into remove_my_argument
.
Or if you're at the beginning of the line hash.merge(one: BigDecimal(1), two: BigDecimal(2)).invert
and want to add a key just before the ending parenthesis, just hit %
to go there.
See :help %
and :help matchit
for more.