============================================== 2002.12.16 発行 =========
極私的 Emacs カスタマイズ紹介マガヂン
Emacs をわたし色に染めて♪
------------------------------------------------------------------------
第 25 回 最近の Emacs と Wnn をめぐる諸々の問題
【後編】ローマ字カスタマイズの問題と、その他もろもろ
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
絶対にしないような「外道」なものまで、何でも結構です。
※解除の方法は、このメールの末尾をごらんください。
========================================================================
こんにちは、でるもんた・いいじまです。
☆目次☆
・アンケートの結果について
・今回のお題
・前回の補足訂正
(1) eval-after-load の場合
(2) .emacs の時点で Wnn を起動してしまう場合
・Tamago4、XEmacs でのローマ字カスタマイズ
・文法解説: or、catch、throw
・すいません、後日に回させてください
(1) XEmacs や Tamago4 でのかな入力
(2) jisx0201.el にまつわる問題
・次回予告
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆アンケートの結果について☆
さて、前回お願いしたアンケートですが、残念ながら回答数はひとけ
た(!)でした。引き続き回答をお待ちしておりますので、よろしくお願い
します。m(_ _)m
さて、気になる結果ですが、やはり、Mule 2.3 をいまだに使っていると
いう方はいらっしゃらず、Emacs 20 以降という方ばかりでした。とはい
え、手元に Emacs 20 の環境がないのでいかんともしがたく……ただ、
現在、Emacs 21の入った UNIX マシンを使えるようにしようという計画が
私の周囲で動いているので、それが稼働すれば本格的に Emacs 20 以降に
対応できると思います。
(Emacs 20/21 の Windows 版の一種である Meadow を自分のマシンに
インストールしなさいという声が複数あるのですが、それだけのディスク
スペースを、常用しないアプリのために置いておく余裕はないし…)
☆今回のお題☆
今回は、前回に引き続き、Wnn 関係を最近の Emacs に対応させるための
設定をします。前回と併せてお読みください。
なお、今回、前回とも、実機検証が不十分な部分があります。
というのは、現在私の使える環境では、Mule 2.3 はいちおう動いている
ものの、それは Wnn 対応のものではないのです。(Windows マシンから
telnet などでログインして、Windows 用の ATOK から文字を入力して
います。)
ましてや、Emacs 20 以降については、自分の手元には動作する環境が
なく、大学の友人のところに出かけていって、そこで動作確認をさせて
もらっている次第です。自分のところではないので、あまり長時間に
わたっていろんな作業をするわけにはいきません。
というわけで、Emacs 20 はおろか Mule 2.3 用のコードでも、正常に
動作しないおそれがありますので、何かお気づきの際はご連絡いただけ
れば幸いです。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆前回の補足訂正 (1) eval-after-load の場合☆
申し訳ありません、いきなり前回の訂正からです。
前回、eval-after-load を使う方法を紹介しました。下記のコードです。
(eval-after-load "wnn-egg" '(my-customize-egg3-wnn)) ; Mule 2.3/emcws
(eval-after-load "egg-wnn" '(my-customize-egg3-wnn)) ; XEmacs
(defun my-customize-egg3-wnn ()
(interactive)
(define-key fence-mode-map "\eO" nil)
(define-key fence-mode-map "\e[" nil)
(define-key henkan-mode-map "\eO" nil)
(define-key henkan-mode-map "\e[" nil)
(define-key fence-mode-map "\C-h" 'fence-backward-delete-char)
(require 'wnn-recovery)
; その他、Wnn 固有の設定はすべてこの defun の中に入れてしまう
)
ところがこのコードは、じつは Mule 2.3 では正常には動きません。
eval-after-load は、「第一引数で指定された Emacs Lisp ファイルが
すでに読み込まれていればすぐに、まだ読み込まれていなければそれが
読み込まれた時点で、第二引数に書かれた式を実行する」という意味です。
Mule 2.3 の場合(emcws でも、完全な確認はしていませんが、各種設定
ファイルを読む限りでは同様だと思います)、Mule をソースコードから
コンパイルする時点で、wnn-egg.el を含む Wnn 関係の設定一式は読み
込まれていますので、eval-after-load でとらえることができません。
そこで、Mule 2.3 や emcws では EGG という名前の変数が定義されて
いる(XEmacs や Tamago4 にはこの変数はありません)ことを利用し、
この変数が定義されていれば Mule 2.3 であるとみなすことにします。
また、今回は問題ありませんが、一般論として、eval-after-load 文は
defun 文よりも後で書くようにしてください(もし eval-after-load の
ほうを先に書いてしまうと、すでに egg-wnn.el が読み込まれていた
場合に、まだ未定義の関数 my-customize-egg3-wnn を呼び出そうとして
エラーになります)。結果として、次のようなコードになります。
(defun my-customize-egg3-wnn ()
(interactive)
(define-key fence-mode-map "\eO" nil)
(define-key fence-mode-map "\e[" nil)
(define-key henkan-mode-map "\eO" nil)
(define-key henkan-mode-map "\e[" nil)
(define-key fence-mode-map "\C-h" 'fence-backward-delete-char)
(require 'wnn-recovery)
; その他、Wnn 固有の設定はすべてこの defun の中に入れてしまう
; ローマ字カスタマイズ関係はここには書けません。詳細は後述。
)
(eval-after-load "egg-wnn" '(my-customize-egg3-wnn)) ; XEmacs
(if (boundp 'EGG) ; Mule 2.3(emcws も?)
(my-customize-egg3-wnn)
)
なお、ウェブ上にある第 24 回のバックナンバーはすでに、上記のものに
差し替えてあります。
☆前回の補足訂正 (2) .emacs の時点で Wnn を起動してしまう場合☆
前回、もうひとつの方法として、.emacs の時点で Wnn を起動してしまう
方法をご紹介しました。次のようなコードです。
(if (boundp 'input-method-alist)
(progn
;いったん Wnn を起動する
(if (assoc "japanese-egg-wnn" input-method-alist)
(activate-input-method "japanese-egg-wnn")
)
;デフォルトのものに戻す
(and
default-input-method
(assoc default-input-method input-method-alist)
(activate-input-method default-input-method)
)
(inactivate-input-method)
))
しかし、ひとつ大事な注意点を忘れていました。それは、このコードを
実行したからといって、必ず egg が起動されるとは限らないということ
です。当たり前のことですが、egg がインストールされていない環境では、
デフォルトのインプット・メソッドが起動される以外は、特に何も起こり
ません。
というわけで、上記のコードの後には次のように書いて、egg が起動
された場合にのみ egg 関係の設定が実行されるようにしてください。
(if (boundp 'fence-mode-map)
(progn
; この中に egg V3 関係の設定を集中して記入する
))
(if (boundp 'egg-conversion-map)
(progn
; この中に Tamago4 関係の設定を集中して記入する
))
なお、この方法の場合は、ローマ字カスタマイズ関係の記述を
(progn .... ) の中に書いても大丈夫なはずです。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆Tamago4、XEmacs でのローマ字カスタマイズ☆
Tamago4 や XEmacs では、ローマ字カスタマイズにも気を使います。
ここまで読んでこられた方なら既におわかりだと思いますが、単に
第 8 回で紹介したように .emacs に書くわけにはいかないからです。
○XEmacs
まずは XEmacs のほうから。前回、
(eval-after-load "egg-wnn" '(my-customize-egg3-wnn))
を紹介しましたが、実はローマ字カスタマイズをこの my-customize-egg3-wnn
の中に書くことはできません。というのは、egg-wnn.el が読み込まれた
時点では、まだローマ字→かな変換関係のモジュールは読み込まれて
いないからです。ローマ字→かな変換関係の初期設定は its-hira.el に
書いてあるので、its-hira.el が読み込まれたときをとらえるために、
たとえば次のようにします。
(defun my-customize-romaji-egg3-hira ()
(interactive)
(setq its:*defrule-verbose* nil)
(its-define-mode "roma-kana" "あ" nil)
(its-defrule "la" "ぁ")
(its-defrule "li" "ぃ")
(its-defrule "lu" "ぅ")
(its-defrule "le" "ぇ")
(its-defrule "lo" "ぉ")
)
(eval-after-load "its-hira" '(my-customize-romaji-egg3-hira))
○Tamago4
Tamago4 でも事情はほぼ同じです。ただ、ローマ字→かな変換関係の
初期設定が書かれているのは its/hira.el なので、次のようにします。
(defun my-customize-romaji-tamago4-hira ()
(interactive)
(define-its-state-machine-append
its-hira-map
(its-defrule "la" "ぁ" nil t)
(its-defrule "li" "ぃ" nil t)
(its-defrule "lu" "ぅ" nil t)
(its-defrule "le" "ぇ" nil t)
(its-defrule "lo" "ぉ" nil t)
)
)
(eval-after-load "its/hira" '(my-customize-romaji-tamago4-hira))
注意していただきたいことが 2 点あります。まず、Tamago4 では、
its-defrule には、第三・第四の引数として nil t が必要です。
第三引数の nil の意味は、実は私はよく分かっていないのですが、
とりあえず nil を与えれば正常に動作するようです。
第四引数の t は、「既存の定義を上書きする」という意味です。これが
ないと、Tamago4 では「Duplicated definition (la)」といったエラーに
なります。
また、Tamago4 では、its-define-mode を実行する代わりに、カスタ
マイズ関係全体を
(define-its-state-machine-append
its-hira-map
ここに書く
)
という形で書くのが作法です。its-hira-map というのがローマ字から
ひらがなへの変換表の入った変数で、これを別の変数に変えることに
よって、ローマ字→ひらがなモード以外のモードでのカスタマイズを
することができるからです。
【補足】(1) 実際には、(define-its-state-machine-append ....) で
囲まなくても正常動作します。というのは、its-defrule
は、特に指定しなければ、最も最近に定義されたローマ字
変換表を書き換えることになっており、hira.el が読み
込まれた時点では当然、その「最も最近に定義されたロー
マ字変換表」とはローマ字→ひらがな変換表(its-hira-map)
になっているからです。
(2) Tamago4 では、このように eval-after-load を使う方法の
他に、
(add-hook egg-mode-hook
'my-customize-romaji-tamago4-hira
)
と書く方法があります。こちらのほうが簡単ですが、この
書き方をした場合は、C-\ で日本語入力モードを ON にする
たびに (my-customize-romaji-tamago4-hira) が実行される
ことになるので、書き方によっては注意が必要です。
○では、いろんなバージョンの Emacs でひとつの .emacs ファイルを共有
するには?
さて、問題はこの先です。ひとつの .emacs ファイルを、egg V3 が
入っている環境と Tamago4 が入っている環境の両方で使いたい場合は、
どうなるでしょうか。
結論から言えば、特に何も考えることはありません。順番に書けばそれで
OK です。
(defun my-customize-romaji-egg3-hira () ; Mule 2.3 / XEmacs 用
(interactive)
(setq its:*defrule-verbose* nil)
(its-define-mode "roma-kana" "あ" nil)
(its-defrule "la" "ぁ")
(its-defrule "li" "ぃ")
(its-defrule "lu" "ぅ")
(its-defrule "le" "ぇ")
(its-defrule "lo" "ぉ")
)
(defun my-customize-romaji-tamago4-hira () ; Tamago4 用
(interactive)
(define-its-state-machine-append
its-hira-map
(its-defrule "la" "ぁ" nil t)
(its-defrule "li" "ぃ" nil t)
(its-defrule "lu" "ぅ" nil t)
(its-defrule "le" "ぇ" nil t)
(its-defrule "lo" "ぉ" nil t)
)
)
(eval-after-load "its-hira" '(my-customize-romaji-egg3-hira))
(eval-after-load "its/hira" '(my-customize-romaji-tamago4-hira))
(if (boundp 'EGG)
(my-customize-romaji-egg3-hira)
)
【補足】Mule 2.3 にも its/hira.el がありますが、Mule 2.3 の場合は
ソースコードからのコンパイルの時点で its/hira.el が読み込ま
れているため、eval-after-load で書いても反応しません。
○参考: egg V3 と Tamago4 での its-defrule の仕様の違い
egg V3(Mule 2.3、emcws、XEmacs)と Tamago4 では、its-defrule の
内容が次のように異なっています。これは M-x describe-function
(標準のキー操作だと C-h f、飯嶋式だと M-h f)で出てくる内容です。
egg V3 の場合
|(its-defrule INPUT OUTPUT &optional NEXT STATE MAP)
|
|INPUT が入力されると OUTPUT に変換する.NEXT が nil でないときは
|変換した後に NEXT が入力されたように変換を続ける.INPUT が入力さ
|れた時点で変換が確定していない時は STATE をフェンス上に表示する.
|変換が確定していない時に表示する文字列は変数 its:make-terminal-state
|および 変数 its:make-non-terminal-state に指示された関数によって
|生成される.変換規則は MAP で指定された変換表に登録される.MAP が
|nil の場合はもっとも最近に its-define-mode された変換表に登録される.
|なお OUTPUT が nil の場合は INPUT に対する変換規則が削除される.
Tamago4 の場合:
|(its-defrule INPUT OUTPUT &optional BACK ENABLE-OVERWRITE)
|
|入力 INPUT を認識し, OUTPUT を出力するようにステートマシンを構成
|する。BACK が(負の)整数の時は, OUTPUT を出力した後, BACK の分 key
|stroke を戻って動くものとする。変換規則はもっとも最近に
|its-define-state-machine された変換表に登録される。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆おまけ☆
Tamago4 の場合、上記の my-customize-tamago4-hira を
(defun my-customize-romaji-tamago4-hira () ; Tamago4 用
(interactive)
(define-its-state-machine-append
its-hira-map
(its-defrule "la" "ぁ" nil t)
(its-defrule "li" "ぃ" nil t)
(its-defrule "lu" "ぅ" nil t)
(its-defrule "le" "ぇ" nil t)
(its-defrule "lo" "ぉ" nil t)
)
(setcar (cdr its-hira-map) "あ連R漢")
)
としてみてください。cdr、setcar という関数については今回は説明
しません。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆すいません、後日に回させてください (1) XEmacs や Tamago4 でのかな入力☆
XEmacs や Tamago4 でのかな入力については、実機検証ができませんで
したので、後日に回させてください。
XEmacs については、Wnn をあらかじめ activate-input-method で起動
しておく方法をとった場合には、おおむね第 9 回で紹介したとおりの
方法で実現できます。唯一違う点といえば、読み込むべきファイル名が
its/kanainput ではなく its-kanainput となっている点です。
しかし、XEmacs でも、eval-after-load を使う方法では、いつの時点で
its/kanainput を読み込めばいいのか(もしくは、もっと別の書き方を
すべきなのか)、確認できませんでした。
Tamago4 では、現在公開されている version 4.0.6 では、かな入力の
機能は実現されていません。最新のベータ版(CVS という方法で管理さ
れています)にはあるようですので、次の版(4.0.7 になるのか 4.1.0
になるのかは分かりませんが)では実現していることでしょう。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆すいません、後日に回させてください (2) jisx0201.el にまつわる問題☆
また、第 11 回では、jisx0201.el を紹介して、これで半角カタカナが
入力できることを説明しました。これも、XEmacs や Tamago4 ではその
ままでは使えません。
XEmacs で、Wnn をあらかじめ activate-input-method で起動しておく
方法をとった場合、読み込むべきファイル名が egg-jisx0201.el となる
以外は、第 11 回で説明したとおりの方法でうまくいくはずです。
しかし、eval-after-load の場合、どのタイミングで egg-jisx0201.el
を読み込むべきなのか、確認ができませんでした。たぶん、egg-wnn.el
が読み込まれた時点でキーカスタマイズと一緒に実行すれば大丈夫だとは
思うのですが、全く確認がとれていないものを無責任に書くわけにはいき
ません。
また、Tamago4 では、its/hankata.el というファイルがあって、これを
使えばローマ字から直接半角カタカナを入力できるようですが、これに
ついても詳しい使い方が分かりませんでしたので、後日に回させてくだ
さい。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆次回予告☆
次回は、「Emacs の起動時の挙動」の予定です。
Emacs の起動時にどんなファイルが読み込まれるのか、.emacs よりも
あとで読み込まれるファイルとはどういうつきあい方をすればいいのか、
特に、そういったファイルで設定される内容を .emacs で上書きする方法
の説明になります。
今後の予定は次のようになります(順不同)。
○マクロのための文法解説II(第 21 回の続編)
○便利なマクロ (4) ローマ字のミスタイプからの立ち直り
○Emacs 内部の文字コードの話
○Emacs から外部のプログラムを呼び出す
○yank に関する問題(第 5 回)の続編
詳細な項目は、当マガヂンのホームページをご覧ください。
それではまた♪
========================================================================
極私的 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
これは「古文書」です。
古くなった情報も原則未修正で保存していますのでご注意ください。