camelCase to underscore in vi(m)

18.5k views Asked by At

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?

7

There are 7 answers

4
Raimondi On BEST ANSWER

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

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

0
Jeff On

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 PascalCase, which could also be useful for someone.

0
michaelmichael On

For the CamelCase case:

%s#(\<\u\|\l)(\l+)(\u)#\l\1\2_\l\3#gc

Tip: the regex delimiters can be altered as in my example to make it (somewhat) more legible.

6
nelstrom On

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.

0
Luc Hermitte On

I have an API for various development oriented processing. Among other things, it provides a few functions for transforming names between (configurable) conventions (variable <-> attribute <-> getter <-> setter <-> constant <-> parameter <-> ...) and styles (camelcase (low/high) <-> underscores). These conversion functions have been wrapped into a plugin.

The plugin + API can be fetch from here: https://github.com/LucHermitte/lh-dev, for this names conversion task, it requires lh-vim-lib

It can be used the following way:

  • put the cursor on the symbol you want to rename
  • type :NameConvert + the type of conversion you wish (here : underscore). NB: this command supports auto-completion.
  • et voilĂ !
0
Chiedo On

I whipped up a plugin that does this. https://github.com/chiedojohn/vim-case-convert

To convert the case, select a block of text in visual mode and the enter one of the following (Self explanatory) :

:CamelToHyphen :CamelToSnake :HyphenToCamel :HyphenToSnake :SnakeToCamel :SnakeToHyphen

To convert all occerences in your document then run one of the following commands:

:CamelToHyphenAll :CamelToSnakeAll :HyphenToCamelAll :HyphenToSnakeAll :SnakeToCamelAll :SnakeToHyphen

Add a bang (eg. :CamelToHyphen!) to any of the above command to bypass the prompts before each conversion. You may not want to do that though as the plugin wouldn't know the different between variables or other text in your file.

0
Ela Dute On

For the camelCase:

%s/\v<([a-z_]+)([A-Z][a-zA-Z]+)>/\1_\l\2/gc

You may need to run this command multi times.