[ホーム]-> [Emacs]-> [2.3 -> 20]

Mule-2.3 から Emacs-20 への個人的な記録

目次


前置き

現在、mule-2.3@emacs-19.34 と emacs-20 をそれぞれ /usr と /usr/local の下に共存させて使っています。徐々に emacs-20 の方をメインにしていってるのですが、ここではその際に気付いたことを書いています。

個人的な環境

emacs-20.6.tar.gz + leim-20.6.tar.gz に次のようなパッチを当ててコンパイルしてます。

いろいろあてていても結局は SKK しか使わなかったりするのですが(汗)。 なおパッチは上の順序で当てれば reject されることはなかったです。 egg Version 4 を入れることで、Vine Linux 1.1 の標準的な環境 (kernel 2.0.36, glibc-2.0) の上で FreeWnn と一緒に、たまごによる変換や kinput2 による変換も行えてます。 私のところでは十分安定して動作してます。 以前は、kinput2 を起動してると Shift-Space としたときに、kinput2 の窓が開いてハングする、ということがよくあったのですが。感謝。 なお、VJE の評価版を入れてみたところ、vjed + vje を通しても使うことができました。 ATOK は試せる環境にないですが、Laser5 Linux の上で同じような感じで make したもので動作確認をして下さった方がいます。 ちゃんと動いているそうです。


文字コードの扱い (特に日本語関係)

何はともあれ .emacs

(set-language-environment "Japanese")

は必要でしょう。私は EUC を中心にして使っているので、

(set-terminal-coding-system 'japanese-iso-8bit-with-esc)
(set-keyboard-coding-system 'japanese-iso-8bit-with-esc)
(modify-coding-system-alist 'process "" 'japanese-iso-8bit-with-esc)

あたりも入れてます。 keyboard の設定は、japanese-iso-8bit (euc-jp のこと) にしておかないと kinput2 の入力の時に文字化けしました。 また、一番下の設定を入れておかないと、eldic.el を使う場合に文字化けがおきたりしました。 (特にこちらは、最後の with-esc を付けないと外字の表示のところで文字化けが起きた。) また、terminal の指定をしないと、emacs -nw で文字化けしました。

ただ、この指定だと一般的すぎるので弊害がおきる可能性もありです。 eldic は dic というプログラムを起動するので、そのためだけに設定するという場合は

(modify-coding-system-alist 'process "dic" 'japanese-iso-8bit-with-esc)

みたいな感じの指定の方が安心かもしれません。

逆に、上の設定をまとめてやるには、

(set-default-coding-systems 'japanese-iso-8bit-with-esc)
と書いておけば、terminal や keyborad もこの設定になります。

で、そうしておいて

(modify-coding-system-alist 'process ".*ci" 'iso-2022-7bit-ss2)
(modify-coding-system-alist 'process ".*rcs.*" 'iso-2022-7bit-ss2)
(modify-coding-system-alist 'process ".*rlog" 'iso-2022-7bit-ss2)

などと必要に応じて設定すると...。

次に fontset の指定ですが、デフォルトだの 16 point のフォントは私の環境だとちょっと大きいので、.Xdefault に

Emacs.Fontset-0: -misc-fixed-medium-r-normal--14-*-*-*-*-*-fontset-14,\
 ascii:-misc-fixed-medium-r-normal--14-130-*-*-c-*-iso8859-1,\
 latin-jisx0201:-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0,\
 katakana-jisx0201:-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0,\
 japanese-jisx0208:-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0,\
 japanese-jisx0212:-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0212.1990-0
Emacs.Font: fontset-14

というのを入れています。 最後の jisx0212 (補助漢字) の部分は普通は入ってないのでいらないでしょう。 こうしておくと、14 point のフォントで起動してくれます。 Shift を押しながら左のマウスボタンを押したときに出てくるフォントメニューを使って、起動してから 16 point に変更することもできますし。

更に、

Emacs.Fontset-1: -misc-marumoji-medium-r-normal--14-*-*-*-*-*-fontset-m14,\
 ascii:-misc-fixed-medium-r-normal--14-*-*-*-c-*-iso8859-1,\
 latin-jisx0201:-misc-fixed-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0,\
 katakana-jisx0201:-misc-marumoji-medium-r-normal--14-*-*-*-c-*-jisx0201.1976-0,\
 japanese-jisx0208:-misc-marumoji-medium-r-normal--14-*-*-*-c-*-jisx0208.1983-0

というのを付け加えておけば、フォントメニューから丸文字を選択できるようにもなります。 なお、上の例では ascii だけは marumoji でなく fixed にしてます。個人的に英数字の丸文字は好きでないので。

他にも赤城フォントや長尾フォントを使えば、より小さな文字の指定もできますね。


初期ファイル (.emacs) の共存

Mule-2.3 と Emacs-20.4 の .emacs の共有の問題ですが、最初は .emacs の中に

(if (equal "20" emacs-major-version)
    (load "~/.emacs20")
  (load "~/.emacs19"))

みたいな分岐を作ってたんですが、customize を使うと .emacs の下にいろいろと書き加えられてしまってうまくないです。 が、emacs-20.4 では標準初期化ファイルが .emacs.el になってくれたので(.emacs しかなければ、そちらを読んでくれるけど)、実は .emacs.emacs.el を両方書いておくと、mule-2.3@emacs-19.34 では .emacs を emacs-20.4 では .emacs.el の方を読んでくれ、しかも 20.4 の customize では .emacs.el の方に設定を書き込んでくれるということで、めでたしめでたしとなります。


Emacs-W3 の設定

Emacs-20.4 を入れたついでに W3 を w3-4.0pre.44.tar.gz にしてみました。 ただ、デフォルトだと XEmacs 用の設定に合わせているのか何かの原因で、フレームの大きさが代わったり horizontal line や table の罫線が豆腐になったりしました。 ということで、現在

(autoload 'w3 "w3" "WWW Browser" t)
(setq w3-table-ascii-border-chars 
      [?  ?  ?  ?' ?  ?- ?` ?- ?  ?. ?| ?| ?, ?- ?| ?-])
(setq w3-default-homepage "file:/home/matsu/public_html/index-j.html")
(custom-set-variables
 '(w3-user-fonts-take-precedence nil)
 '(w3-default-stylesheet "/usr/local/share/default.css")
 '(w3-horizontal-rule-char 45)
 '(w3-use-terminal-glyphs nil)
 '(w3-use-terminal-characters nil)
 '(w3-user-colors-take-precedence nil))

のような指定をしてます。下の方は、Emacs-20 のカスタム機能から設定したものです。 フレームの大きさが変わるのは、w3-use-terminal-charactersnil にするだけで回避できるようです。 border-char を JIS 罫線にしたらどうなるかは、まだ試してません。

なお、w3 の設定は、~/.w3/profile にも設定されます。 この ~/.w3 というディレクトリは手で作る必要があって、そうしないと w3 のメニューバーから設定を保存する、を選択しても弾かれてしまいました。 stylesheet は下手に機能を生かしておくと文字が見えないページも出てきてしまうので、この辺もメニューバーで設定して保存しておくといい気がします。

また、Vine の ML で教えてもらったのですが、大きなページ?などで固まる場合は、

(make-variable-buffer-local 'enable-kinsoku)
(add-hook 'w3-mode-hook
          (function
           (lambda ()
             (setq enable-kinsoku nil))))

として、w3-mode では enable-kinsoku を nil にしておくといいらしいです。

もっとも最近はもっぱら w3m を使うようになっているので、出番は少ないのですが。


SKK 10.59 での auto-fill など

SKK な人は Emacs-20.x では skk-10.xx を使いたくなると思いますが、これは 9.6 の頃とは auto-fill の動作が若干違います。 つまり fill-column を超えてもひらがなだけを打ってる時には auto-fill してくれないという仕様になっているように思います。 この辺りの変換の仕方はかなり変更されているみたいなので、ひょっとして弊害がでるかもしれないですが、次のパッチを当てると、skk-10.59 でも 9.6 と同様の動作をするようになりました。 skk.diff これを当てた skk.el ないしはバイトコンパイルしたものを個人の load-path でオリジナルの skk.el よりも前の方にあるところに置いておくというのが楽でしょう。 ただ、これだとバージョンアップした時に消すのを忘れると悩むことになりますが。

skk-10.56 の頃は起動した後 mule-diag を実行すると、エラーがでます。これは、default-input-method が文字列でなくシンボルになってるためみたいです。と思っていたら、これは Emacs の方のバグだったみたいです。10.57 以降ではこれの対策がなされています。

なお、上のパッチを当てた skk-10.59 の SRPM を作ってみました。

なお、skk-10.47 の頃から apel-9.22 以降が必要になってます。

もう一つ。skk-10.59 では、最初に SKK を起動すると、input-method が japanese-skk に設定されます。 私は普段は SKK なのですが、たまに tamago-4.0.6 から Wnn を使うこともあるので、 C-\ では必ず japanese-egg-wnn が起動して欲しいので、 .emacs.el に次のように書いてます。

(add-hook 'skk-mode-hook
          (function (lambda ()
                      (setq-default default-input-method "japanese-egg-wnn")
                      (setq default-input-method "japanese-egg-wnn"))))

日本語の dynamic abbreviation

今一昔の Mule から Emacs 20 に踏み切れないという人が挙げる理由に、日本語の動的略称展開が賢くないというのがあります。 私もこれで少し悩んでたのですが、難波さんから Mule-2.3@19.28 の dabbrev.el を使うといいということを教えてもらいました。 もともと forward-word などは Emacs-20.x でも日本語に対してちゃんとした(というか、以前の Mule と同じような)動作をするのですが、19.34 の頃から dabbrev.el では forward-word ではなく正規表現による移動に切り替わり、それが syntax の変化とからんで、うまく動作しなくなっているという状況のようです。 だから、forward-word などで語をひろってる 19.28 の dabbrev.el だと正常に動作すると。

ただし、そうしても日本語の句読点などの syntax が少しおかしいようで、これは

(modify-syntax-entry ?。 ".")
(modify-syntax-entry ?、 ".")

のようなのをちまちま設定する必要があります。 これを適当な hook で設定するとか、defadvice で設定するとかで、 dabbrev 時に有効にすればいいみたい。 今は hook かけてしのいでますが、どうするのがいいかはまだ思案中。


雑多なこと

length

実際に Emacs Lisp を書いたりしてる人だと、はまりやすいのが文字コードの問題。そして、length などの問題のような気がします。

この辺ちゃんと調べてないので嘘を書いてしまいそうなのだけど、Emacs 20.3 くらいから、byte 単位の indexing ではなく、文字単位の indexing が採用されてるらしく、例えば length では、

 Emacs 20.4      (length "文字") => 2
 Mule 2.3@19.34  (length "文字") => 6

となります。 普通の「文字」は Emacs の内部コードでは一文字3バイトなので、Mule 2.3 では 6 が返るのですが、Emacs 20.4 では 2 文字ということで 2 が返るんですね。 では byte 数を知りたい場合はというと、string-bytes という関数が用意されていて、

 Emacs 20.4      (string-bytes "文字") => 6

となります。 以上は length の話ですが、他にも似たような感じで emacs lisp を書き直さないといけない場合はでてくるだろうなあ。

write-file

文字コードと言えば、文字コード系の指定の仕方が代わったのもそうだけど、write-file の引数が Emacs のものに戻りました。 つまり Mule-2.3 では数値引数を与えて C-x C-w とすると、保存する際の文字コード系を聞いてきたのですが、単に上書きする時に確認を取るだけになったわけです。 この辺も、自作マクロではまる人がいそうな感じがします。私だけかな。 それはともかく、文字コード系を指定してファイルを書き込むには C-x [RTN] f などとして、そのバッファのデフォルトの文字コード系を設定してから C-x C-w ということになりますね。 同様に、文字コード系の判定にミスる場合も C-x [RTN] c に続けて文字コード系を入れて、C-x C-f するとか。 ちょっと面倒ですが、そんなに使う場面が多いわけではないので、ま、いっかという感じですかね。

jam-zcat

次にはまったのは、jam-zcat. jka-compr が Mule ではうまく動作しなかった時期には、このマクロには随分とお世話になっていたのだけれど、最近では namazu.el とか jka-compr を require しているものも増えてきた感じ。 で、jam-zcat を load してるとバッティングして動作がおかしくなったりします。 Emacs20 からは jka-compr も正しく動作しているみたいなので、素直に (require 'jka-compr) することにしました。

bibtex

bitex-mode が標準でついてくるようになりました。素晴しい。


Emacs 20 用の SRPM パッケージ

これについては、Linux のページを御覧下さい。 SRPM で、しかも /usr/local 以下に入るようになっているので、これから各環境で build すれば、おそらく RedHat 系のディストリビューションでは問題なく使えるのではないかと思います。私個人は Vine-1.1 で使っています。


リンク

文中のリンクと重複しますが...。


[ホーム]->[Emacs]->[2.3 -> 20]