In Intellij, how do I toggle between camel case and underscore spaced?
JavaCoding StyleIntellij IdeaJava Problem Overview
At my company we have two different style guides for java vs sql. In java I have a field named historyOfPresentIllness
and when i write the sql, I want to name it history_of_present_illness
. Is there a keyboard shortcut to switch from one to the other when I have the phrase highlighted? Or perhaps a plugin that can do this?
While I'm asking, I may as well ask if there's a way to turn historyOfPresentIllness
to history-of-present-illness
. That's from java to clojure style.
Java Solutions
Solution 1 - Java
Two plugins offer this feature:
I use a plugin called String Manipulation which does what you need (and more).
Select historyOfPresentIllness
and press Alt / option+M to bring up the plugin menu, then press:
- 5 - To snake_case (or to camelCase) which converts to
history_of_present_illness
- 6 - To hyphen-case (or to snake_case) which converts to
history-of-present-illness
To make this easier, you could set up a shortcut at File | Settings | Keymap
.
There also is the CamelCase plugin.
SHIFT+Alt / option+U toggles the selection between formats:
historyOfPresentIllness
--> history_of_present_illness
--> HISTORY_OF_PRESENT_ILLNESS
--> HistoryOfPresentIllness
--> historyOfPresentIllness
You can also undo your changes (now that a bug in the plugin got fixed).
Solution 2 - Java
Very simple press Clr + F
to open Find/Replace panel and check [✓] Regex copy past regex
Find: [_]{1,1}([a-z])
Replace: \U$1
Press [Replace all] button, Enjoy
Thanks @piotrek for _some_awe_var
to _someAweVar
Use Find: (\w)[_]{1,1}([a-z])
Replace: $1\U$2
Solution 3 - Java
From snake_case to CamelCase
- Find:
(\w)[_]{1,1}([a-z])
- Replace:
$1\U$2
- Settings:
- Match Case
- Regex
From CamelCase to snake_case:
- Find:
([A-Z])
- Replace:
\_\L$1
- Settings:
- Match Case
- Regex
Solution 4 - Java
If you are OK with PyCharm also refactoring usages, launch the "Rename" tool (Refactor > Rename). The window pops up with drop down list and you should see the snake_case version of the text in the list (you can open the window and switch to the snake_case with key-strokes so it can be pretty fast).
Solution 5 - Java
Answer above is almost perfect, but note that it will change variables like _something
or this._something
into Something
and this.Something
. I didn't want that in my case, as leading _ was used to denote "private" variables (old JS project). I slightly modified this approach:
Find: (\w)[_]{1,1}([a-z])
Replace: $1\U$2
This will ensure that only variables with _
is in the middle will be affected.