camelCase to underscore in vi(m)

12,842

Solution 1

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

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

Solution 2

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.

Solution 3

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.

Solution 4

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.

Solution 5

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.

Share:
12,842
Jeff
Author by

Jeff

Updated on June 14, 2022

Comments

  • Jeff
    Jeff almost 2 years

    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?