Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

camelCase to underscore in vi(m)

If for some reason I want to selectively convert camelCase named things to being underscore separated in vim, how could I go about doing so?

Currently I've found that I can do a search /s[a-z][A-Z] and record a macro to add an underscore and convert to lower case, but I'm curious as to if I can do it with something like :

%s/([a-z])([A-Z])/\1\u\2/gc

Thanks in advance!

EDIT: I figured out the answer for camelCase (which is what I really needed), but can someone else answer how to change CamelCase to camel_case?

like image 225
Jeff Avatar asked Mar 03 '11 19:03

Jeff


3 Answers

You might want to try out the Abolish plugin by Tim Pope. It provides a few shortcuts to coerce from one style to another. For example, starting with:

MixedCase

Typing crc [mnemonic: CoeRce to Camelcase] would give you:

mixedCase

Typing crs [mnemonic: CoeRce to Snake_case] would give you:

mixed_case

And typing crm [mnemonic: CoeRce to MixedCase] would take you back to:

MixedCase

If you also install repeat.vim, then you can repeat the coercion commands by pressing the dot key.

like image 67
nelstrom Avatar answered Nov 20 '22 15:11

nelstrom


This is a bit long, but seems to do the job:

:%s/\<\u\|\l\u/\= join(split(tolower(submatch(0)), '\zs'), '_')/gc

like image 45
Raimondi Avatar answered Nov 20 '22 15:11

Raimondi


I suppose I should have just kept trying for about 5 more minutes. Well... if anyone is curious:

%s/\(\l\)\(\u\)/\1\_\l\2/gc does the trick.

Actually, I realized this works for camelCase, but not CamelCase, which could also be useful for someone.

like image 17
Jeff Avatar answered Nov 20 '22 15:11

Jeff