I learned today how to call a function on a captured group to modify the replacement text when using `replace-regexp` or `query-replace-regexp` in Emacs. A function is called by writing something like `\,(function-to-be-called \1)` in the replacement string.
Here is an example: I had to write a new Java class with a lot of getters and setters with special logic. The getters and setters had to delegate their job to special methods:
private static final String FOO_BAR = PREFIX + "FOO_BAR"; public SomeType getFooBar() { return getValue(FOO_BAR); } public void setFooBar(SomeType fooBar) { setValue(FOO_BAR, fooBar); }
`PREFIX` is just another String constant used by the other constants.
The methods `getValue` and `setValue` are used by all generated getters and setters in that class.
I found a nice way to solve that problem using the `replace-regexp` function of Emacs. First I wrote a list of the properties, I wanted to generate, in a new buffer. The properties were written in snake case. Here is a short example:
foo_bar hello_hello
I copied the content into another buffer to generate the constants and the methods separately. I called `replace-regexp` in the first buffer to replace
\(.+\)
with
private static final String \,(upcase \1) = PREFIX + "\,(upcase \1)";
Then I switched to the second buffer and called `replace-regexp` to replace
\(.+\)
with
public SomeType get\,(s-upper-camel-case \1)() { return getValue(\,(upcase \1)); } public void set\,(s-upper-camel-case \1)(SomeType \,(s-lower-camel-case \1)) { setValue(\,(upcase \1), \,(s-lower-camel-case \1)); }
After that I copied the content of each buffer into my Java class.
It is important to keep the words in the source list (e. g. "foo_bar") in lower case so `s-upper-camel-case` and `s-lower-camel-case` work as expected.