Попробуйте следующее:
:let @t="caw\<C-r>=join(map(split(@\", '_', 1), 'toupper(v:val[:0]).tolower(v:val[1:])'), '_')\n\e"
Затем, когда вы наберете @t
в обычном режиме, вы получите замену текущего слова в соответствии с вашим запросом. Если вы хотите просто слепо заменить все, тогда используйте
:%s/\<\w\+\>/\=join(map(split(submatch(0), "_", 1), "toupper(v:val[:0]).tolower(v:val[1:])"), "_")/g
Добавьте c
после g
, если хотите, чтобы vim спрашивал вас о каждой замене.
Второе решение предполагает, что в вашем исходном коде нет не-ASCII-идентификаторов.