haskell 用の underscore → CamelCase 変換
最近時給が1000円を切っていることに気がついて大分凹んでいます。残業もどんどん多くなってきたしなぁ・・・。
平日はほとんど部屋でプログラミングをやる時間が取れず、休日はやる気がでないという悪循環でしたが、少し気合を入れてみるため、elispを久々に書いてみました。
haskellの命名規則は、関数はjava風のCamelCase、代数的データ型とかはJavaのclassとほぼ同じ命名規則です。
で、これを一々打っていると、SandSをやっているとはいえ、かなりshiftを押す回数が増えていきます。これが大分嫌になってきたので、簡単な変換関数を書いてみました。
(defun haskell-underscore-to-camelcase () (interactive) (let* ((bounds (bounds-of-thing-at-point 'symbol)) (symb (buffer-substring-no-properties (car bounds) (cdr bounds))) (rep-func '(lambda (str) (if (not (= 2 (length str))) str (let ((listed (mapcar 'char-to-string (string-to-list str)))) (upcase (cadr listed))))))) (save-restriction (when (and symb (<= 2 (length symb))) (narrow-to-region (car bounds) (cdr bounds)) (delete-region (point-min) (point-max)) (insert (replace-regexp-in-string "\\(_[a-zA-Z]\\)" rep-func symb)) (goto-char (cdr bounds)) ))))
無駄に長いような気が多少しますが、目的は達成できてるのでよしとします。これはアンダースコアの次に続く文字だけを大文字にしているので、mapM_とかは何もいじりません。
また、関数の場合は先頭に_を付けないだけでいいので、結構よさげです。とりあえず試用ということで、key-chordで __ に割り当ててみました。
この程度の関数を書くのに30分とか・・・。最近COBOLしか見てないとこんなになってしまうのか。