(defun ik:decamelize (string)
"Convert from CamelCaseString to camel_case_string."
(let ((case-fold-search nil))
(downcase
(replace-regexp-in-string
"\\([A-Z]+\\)\\([A-Z][a-z]\\)" "\\1_\\2"
(replace-regexp-in-string
"\\([a-z\\d]\\)\\([A-Z]\\)" "\\1_\\2"
string)))))
(defun ik:camerize<->decamelize-on-region (s e)
(interactive "r")
(let ((buf-str (buffer-substring-no-properties s e))
(case-fold-search nil))
(cond
((string-match "_" buf-str)
(let* ((los (mapcar 'capitalize (split-string buf-str "_" t)))
(str (mapconcat 'identity los "")))
(delete-region s e)
(insert str)))
(t
(let* ((str (ik:decamelize buf-str)))
(delete-region s e)
(insert str))))))