カーソル前の単語を次々に大文字(小文字・capitalize)にする

Ctrl+中指か薬指を使うキー操作が多いEmacsで指の負担を軽くする方法 - http://rubikitch.com/に移転しましたにて大文字の入力の話題が出てきた。

clmemo@aka: 大文字連続入力 |Emacs|はupcase-backward-wordを定義している。これを進化させて、連続して実行したら後ろの単語を次々とupcase|downcase|capitalizeするようにしてみた。

ついでに upcase-word 等を直接使うことがまったくといっていいほどないので electric-*-backward-word 系に置き換えておいた。

無変換をAltに割り当てることで親指Altを実現しているから、マーク→upcase-region等よりも指の負担を抑えられる。

;; http://www.emacswiki.org/emacs/DoubleKeyBinding
(defvar seq-store-times 0)
(defvar seq-start-point 0
  "Stores location of pointer when sequence of calls of the same
 function was started. This variable is updated by `seq-times'")

(defun seq-times (name &optional max)
  "Returns number of times command `name' was executed. If `max'
 is specified the counter will wrap around at the value of `max'
 never reaching it. It also updates `seq-start-point'."
  (if (eq last-command name)
      (if (= (setq seq-store-times (1+ seq-store-times)) max)
          (setq seq-store-times 0) seq-store-times)
    (setq seq-start-point (point) seq-store-times 0)))

(defun electric-upcase-backward-word ()
  (interactive)
  (upcase-word (- (1+ (seq-times 'electric-upcase-backward-word 10000)))))
(defun electric-capitalize-backward-word ()
  (interactive)
  (capitalize-word (- (1+ (seq-times 'electric-capitalize-backward-word 10000)))))
(defun electric-downcase-backward-word ()
  (interactive)
  (downcase-word (- (1+ (seq-times 'electric-downcase-backward-word 10000)))))

(define-key esc-map "u" 'electric-upcase-backward-word)
(define-key esc-map "c" 'electric-capitalize-backward-word)
(define-key esc-map "l" 'electric-downcase-backward-word)