============================================== 2004.08.25 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
       第 28 回 便利なマクロ(4)ローマ字のミスタイプからの立ち直り
                    〜関数を乗っ取って実装する〜
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

※解除の方法は、このメールの末尾をごらんください。
========================================================================

        ごぶさたしております、でるもんた・いいじまです。
毎度毎度、まぐまぐさんの発行間隔の限度である「6 か月」に達しての
発行になってしまいました。

☆目次☆
        ・今回のお題
・おことわり

・乗っ取るべき関数を探す
・乗っ取る!
・とりあえずはテストから
・では、本題。ローマ字ミスタイプからの立ち直り
・リストを使う方法はホームページで

        ・次回予告

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆今回のお題☆

Wnn 特集の最終回になります。
        今回は、「ローマ字のミスタイプからの立ち直り」を扱います。

たとえば、「しゃ」と入力しようとして「sh」と入力し、その時点で、
「さ」に変更しようと思い立って「Backspace a」と入力したとします。
そうすると、期待通りに「さ」になってくれる場合もあれば、「sあ」に
なってしまう場合もあります。

今回は、「sあ」になってしまう典型例として、egg V3 を例にとりあげ、
「関数を乗っ取る」という方法でこれを「さ」に直すマクロを紹介します。

☆おことわり☆

今回扱うマクロは、egg V3 のみが対象となります。つまり、Mule 2.3 や
XEmacs、emcws の Wnn は対象になりますが、Tamago4 の環境は対象になり
ません。

これらの違いについては第 24 回で触れましたが、自分の環境が分からない
人は、
C-h v(飯嶋式キーバインディングでは M-h v) fence-mode-map RET
として、キーマップが表示されるか、それとも [No match] と出るかで
判別がつきます。

キーマップが表示されれば egg V3 が組み込まれていますが、[No match]
と出れば egg V3 は入っていない、つまり、今回の対象外になります。

☆

Tamago4 などの環境は、機を見て考慮に入れようと思います。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆乗っ取るべき関数を探す☆

今回扱う「関数を乗っ取る」という手法は、C++ や Java でプログラミ
ングをしている人ならおなじみの手法だと思います。つまり、デフォル
トの関数があらかじめ用意されていて、必要なものだけ自分で書いたも
ので置き換える、という方法です。Emacs には、C++ や Java のような
「クラス」の概念がないので本当は微妙に違うのですが、大体同じような
ものだと思っていただければ結構です。

まずは、文字列を入力していて変換キー(スペースキー)を押したときに、
どの関数が呼ばれるのかを調べます。

% cd /usr/local/share/emacs/19.34/lisp
% grep fence-mode-map *.el

とすると、egg.el に

> (define-key fence-mode-map " "  'henkan-fence-region-or-single-space)
> (define-key fence-mode-map "\C-@" 'henkan-fence-region)
> (define-key fence-mode-map [?\C-\ ] 'henkan-fence-region)

とあるのがわかります。そこで

% grep 'defun henkan-fence-region'

で探してみると、やはり egg.el にあって、これは引数を取らない関数
だということがわかります。内容はごく簡単なので丸ごと書き直しても
いいのですが、このマクロを書いた時点では、将来的に拡張される可能
性が十分にあったので、関数を乗っ取るという形を取りました。


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆乗っ取る!☆

では、いきなり関数を乗っ取ってしまいます。

まず、元の関数の内容を別の名前で退避します。この文はオマジナイだと
思って(私もよくわかっていません)、そのままコピー・アンド・ペースト
してしまってください。

(or (fboundp 'delmonta-henkan-fence-region-backup)
        (fset 'delmonta-henkan-fence-region-backup
                (symbol-function 'henkan-fence-region)
        )
)

(or (fboundp ....)) のチェックをしているのは、デバッグなどでこの
式を何度も評価した際に、「いちばんはじめの段階での内容」を退避する
はずの delmonta-henkan-fence-region-backup に、新しく定義し直した
あとの henkan-fence-region の内容が入ってしまう、ということを防ぐ
ためです。

☆とりあえずはテストから☆

とりあえず、実際のコーディングに入る前に、テストコードを書いてみ
ましょう。

(defun henkan-fence-region ()
(interactive)
(message "変換開始!")
(sleep-for 1) ; 1秒待つ
(delmonta-henkan-fence-region-backup)
)

このコードは、単純に "変換開始!" という文章を表示した後、delmonta-
henkan-fence-region-backup に退避しておいた元の関数を呼び出して、
変換の動作をします。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆では、本題。ローマ字ミスタイプからの立ち直り☆

では、ローマ字のミスタイプを修正してからかな漢字変換を実行するコー
ドを書いてみましょう。いちばん単純な方法で、次のようになります。

(defun henkan-fence-region ()
(interactive)

(goto-char egg:*region-start*)
(while (re-search-forward "kあ" egg:*region-end* t)
(replace-match "か" nil nil)
)

(goto-char egg:*region-start*)
(while (re-search-forward "kい" egg:*region-end* t)
(replace-match "き" nil nil)
)

; 中略

(delmonta-henkan-fence-region-backup)
)

☆リストを使う方法はホームページで☆

でも、考えられるミスタイプの数だけ goto-char と (while ...) を繰り
返し書くのは面倒ですよね。後からカスタマイズしようとしたときに面倒
です。できれば、

(defvar delmonta-henkan-recovery-alist '(
("bあ" . "ば")
("bい" . "び")
("bう" . "ぶ")
("bえ" . "べ")
("bお" . "ぼ")
;以下略
)

のようなリストを用意しておいて、そのリストに加除すれば必要なものが
変更される、という仕様のほうが便利です。

これについては、リスト自体も、あるいはそれを実現するための文法項目
も、非常に長くなりますので、当マガヂンのホームページからたどって
ください。

完成したコードが、
http://www.ht.sakura.ne.jp/~delmonta/emacs/wnn-recovery.el
でダウンロードできるようになっています。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆次回予告☆

        今後の予定は、
                ○文字コードの話の続編
                        ・Big5のサポート
                        ・JIS コードや区点コードでの文字入力
                ○Backspace と Emacs 21 と Linux に関する奇妙な問題
                ○コピー&ペーストの話
                ○モードライン(反転行)をいじる
        などを予定しています。詳細はホームページをごらんください。

        それではまた♪

========================================================================
極私的 Emacs カスタマイズ紹介マガジン Emacs をわたし色に染めて♪

発行人  でるもんた・いいじま <delmonta@ht.sakura.ne.jp>
        [ホームページ] http://www.ht.sakura.ne.jp/~delmonta/emacs/
        [掲示板]       http://6036.teacup.com/delmonta/bbs

配信    インターネットの本屋さん・まぐまぐ
        http://www.mag2.com/m/0000013484.htm

登録解除・メールアドレス変更は発行人ホームページからどうぞ。また、発行人
ホームページでは、第 0 回からのすべてのバックナンバーを公開しています。
========================================================================

Copyright © IIJIMA Hiromitsu aka Delmonta, 2016/03/10 15:09 JST
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

古文書本館トップ | 電脳外道学会