I am using Vim to read through a lot of C and Perl code containing many single letter variable names.
It would be nice to have some command to change the name of a va
I know it's an old question, and @mykola-golubyev's way obviously IS the best answer for the particular case in the OP question (which, I assume is going through obfuscated code where you're likely to have multiple blocks with same var names); but with the question name like that many people coming here from google searches probably look for a less situation-specific ways to rename variables in VIM -- and those can be more concise
I'm surprized no one suggested this way:
*
:s//
NEWNAME/gc
The *
is the same as gn
- it searches for the next occurence of the word under cursor AND it becomes the last searched pattern, so when you omit the search pattern in the substitute command, VIM assumes this is the pattern to search for.
For small amounts of var copies, an even quicker one:
*
cw
NEWNAMEthen repeat
n.
for other occurrences
Search for occurrence, cw
is the command for change word, n
goes to next occurrence of the last searched term and .
repeats the last command (which is change word to NEWNAME)
(Credits for me knowing all this go to @doomedbunnies on Reddit)
Another cool trick is this: (credits to @nobe4)
*
cgn
NEWNAMEthen repeat
.
for other occurrences
cgn
is "change whatever is the result of (find next occurrence)". Now that this is the last command, you don't need the n
to go to the next occurrence, so fewer strokes again, and, more importantly, no need to alternate n
and .
. But, obviously, this one has the drawback of not having a way to skip an occurrence.
Here are some benefits:
*
or gn
for word selection is very quick -- just one keystroke (well, let's say 1.5)*
or gn
makes sure you don't get any matches inside other words, just as :%s///gc
does. Beats typing the :%s/\/NEWNAME/gc
by hand: I personally tend to forget to use the \<
things to limit matches to whole words only.n
to skip unwanted matches -- probably even fewer than the extra strokes needed to limit the scope. Under normal curcumstances, your variables are most likely somewhat localized to a certain code block anyway.