Search code examples
vimvariablesrefactoring

How to quickly change variable names in Vim?


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 variable to something more meaningful while I’m in the process of reading the code, so that I could read the rest of it faster.

Is there some command in Vim which could let me do this quickly?

I don’t think regexes would work because:

  1. the same single letter name might have different purposes in different scoping blocks; and

  2. the same combination of letters could be part of another longer variable name, a string literal, or a comment.

Are there any known solutions?


Solution

  • The following is how to rename a variable which is defined in the current scope {}.

    1. Move your cursor to the variable usage.
    2. Press gd. Which means - move the cursor to the definition.
    3. Now Press [{ - this will bring you to the scope begin.
    4. Press V - will turn on Visual Line selection.
    5. Press % - will jump to the opposite } and thus will select the whole scope.
    6. Press :s/ - start of the substitute command.
    7. <C-R>/ - will insert a pattern that matches the variable name (that name you were on before pressing gd).
    8. /newname/gc<CR> - will initiate search and replace with confirmation on every match.

    Now you have to record a macro or even better - map a key.

    Here are the final mappings:

    " For local replace
    nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left>
    
    " For global replace
    nnoremap gR gD:%s/<C-R>///gc<left><left><left>
    

    Put this to your .vimrc or just execute. After this pressing gr on the local variable will bring you to :s command where you should enter new_variable_name and press Enter.