2012年1月9日月曜日

M-c 単語の本当の先頭を大文字にする

Emacs では M-c で単語の先頭を大文字に出来ます。
しかし単語といってもカーソルのある位置が単語の先頭とみなされてしまうので、カーソルが単語の途中にあった場合はそのカーソルの位置の文字が大文字に変換されてしまいます。

カーソルのある位置の単語が一発で変換されるようにしました。
(多分、再発明と思いますが書きたかったので。
ついでに単語の大文字化/小文字化/kill も書きました。書きたかったので。)
;; 単語の先頭に point を移動
(defun move-first-char-of-word()
  (if (eobp)
    (backward-char))
  (forward-char)
  (backward-word))

;; M-c (capitalize-word) の改善
(defun mod-capitalize-word()
  (interactive)
  (move-first-char-of-word)
  (capitalize-word 1))
(define-key global-map "\M-c" 'mod-capitalize-word)

;; M-u (upcase-word) の改善
(defun mod-upcase-word()
  (interactive)
  (move-first-char-of-word)
  (upcase-word 1))
(define-key global-map "\M-u" 'mod-upcase-word)

;; M-l (downcase-word) の改善
(defun mod-downcase-word()
  (interactive)
  (move-first-char-of-word)
  (downcase-word 1))
(define-key global-map "\M-l" 'mod-downcase-word)

;; M-d (kill-word) の改善
(defun mod-kill-word()
  (interactive)
  (move-first-char-of-word)
  (kill-word 1))
(define-key global-map "\M-d" 'mod-kill-word)

単語の上のどこにでもカーソルを持っていったときに実行する場合と、単語を打ち終わった直後(単語の後で次の単語の前)に実行する場合を想定しています。

Emacsテクニックバイブル には「同じコマンドを連続実行した時の振る舞いを変更する」ということで、連続して M-u M-u ... と 押したときには後方に向かって単語をどんどん変換していく方法が紹介されています。

紹介されている方法では、 C-a を連続で押した場合の挙動も変更になるようなのですが、 僕の場合は、C-a はすでに気に入った変更を加えているのと、単に書きたかったので書いてみました。

参考:31.18 大文字小文字の変更
参考:Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
 





0 件のコメント:

コメントを投稿