The coding style for one project may use
CamelCase for variables, while another may use
under_scores. Here are some Vim procedures to switch between CamelCase and under_score variable names.
Converting from legacy PHP
This is a simple procedure to change variables names from
The commands below define these mappings:
+Find the next
_Convert the next underscore on the current line.
When required, you can yank the following lines in Vim (on the first line, type
2Y), then execute them (type
@") to map the
:nnoremap + /\$\w\+_<CR> :nnoremap _ f_x~
Now you can press
+ to search for the next
$variable_with_underscores, then press
_ to find and delete the next underscore and toggle the case of the next character. Repeatedly press
_ until all underscores are processed, then press
+ to find the next variable. For example, you may type
+__+_+___ to skip through a file.
+~ for initial capitals.
The simple procedure above is suitable for manually changing a small number of variables, while inspecting each change. Using a substitute, the process can be automated. The following command will change all variables names from
If wanted, the
\v (very magic) option can be used to reduce the number of backslashes, and the conventional
/ can be used as the delimiter instead of
#. The following command is equivalent to the above:
Change under_scores to CamelCase
The following shows two substitute commands for converting names with underscores to camel case. The first command converts the beginning character to uppercase, while the second leaves it unchanged. Both commands operate on all underscore names in the current line.
" Convert each name_like_this to NameLikeThis in current line. :s#\(\%(\<\l\+\)\%(_\)\@=\)\|_\(\l\)#\u\1\2#g " Convert each name_like_this to nameLikeThis in current line. :s#_\(\l\)#\u\1#g " Test (first line is original; second and third are results from above). " CONSTANT ab_cd_ef some words name_like_this and another_name = some_more " CONSTANT AbCdEf some words NameLikeThis and AnotherName = SomeMore " CONSTANT abCdEf some words nameLikeThis and anotherName = someMore
Copy the above text into Vim. In Vim, move the cursor to the first substitute command and press
Y to copy the line. Move the cursor to the line containing the underscore names in the test text and type
@" to execute the copied substitute command. That will change each underscore name to camel case in the current line.
The command uses the
\l pattern to search for lowercase letters, so it will work correctly to convert
AbcDefGhi, but it will convert
abc1Def2Ghi (where the first character is still lowercase).
Change CamelCase to under_scores
The following shows two substitute commands for converting camel case names to names with underscores. The first command is slightly simpler but fails if the name contains numbers. Both commands operate on all camel case names in the current line.
" Convert each NameLikeThis to name_like_this in current line. :s#\(\<\u\l\+\|\l\+\)\(\u\)#\l\1_\l\2#g " Alternative: accept numbers in name. :s#\C\(\<\u[a-z0-9]\+\|[a-z0-9]\+\)\(\u\)#\l\1_\l\2#g " Test (first line is original; second is result from above). " CONSTANT AbCdEf some words NameLikeThis and AnotherName = someMore " CONSTANT ab_cd_ef some words name_like_this and another_name = some_more
If wanted, the substitute commands can be applied to the whole buffer using
% to indicate "all lines". For example, the second command applied to the whole buffer would be:
Be sure to run a diff to verify that the substitute has changed what you want.
We couldn't get any of the above to work but succeded with the following command:
It looks for any places with an underscore followed by a lower case letter and replaces that with an upper case letter.