============================================== 2003.02.17 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
              第 26 回 Emacs の起動時の挙動とふたつのホック
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

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

	こんにちは、でるもんた・いいじまです。

☆目次☆
	・アンケートに協力感謝
	・第 24 回の補足訂正
	・今回のお題
	・そもそも、Emacs の起動時にはどんなファイルが読み込まれるのか
	・default.el の設定が不満な場合──after-init-hook
	・ファンクションキーの設定がきかない!──term-setup-hook

	・and と or のトリッキーな使い方

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆アンケートに協力感謝☆

	前回、前々回とお願いしたアンケートですが、全部で 11 通の回答をいた
	だきました。厚く御礼申し上げます m(_ _)m

	結果を見るとやはり、Emacs 21 を使っているという方が多いようでした。
	やはり、最近の Linux や FreeBSD では Emacs 21 が標準になっている
	ことが大きいのでしょうか。

	また、危惧していた「当マガヂンの難易度」の項目ですが、大半の人が
	「少々難しいが許容範囲」と答えてくれましたので、当分は今のままの
	レベルを維持しようと思います。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆第 24 回の補足訂正☆

	さて、本題に入る前に補足訂正です。第 24 回の発行時には、.emacs の
	読み込み時に強制的に Wnn を起動するために、

	(if (boundp 'input-method-alist)
	(progn
		;いったん Wnn を起動する
		(if (assoc "japanese-egg-wnn" input-method-alist)
			(activate-input-method "japanese-egg-wnn")
		)

		;デフォルトのものに戻す
		(activate-input-method default-input-method)
		(inactivate-input-method)
	))

	というコードを紹介しました。しかしながら、最近になって新しいサー
	バーのアカウントを入手し、そこで試してみたところ、動作しないことが
	発覚しました。次のようにしてください。(Web 上のバックナンバーは
	すでに下記のように訂正してあります。)

	(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)
	))

	その新しいサーバーでは、default-input-method には "japanese" と
	いう値が設定されています。そこで、これを起動しようとして
		(activate-input-method default-input-method)
	を実行すると、「Can't activate input method `japanese'」という
	エラーになってしまいます。どんなインプット・メソッドがインストール
	されているかは M-x describe-variable RET input-method-alist で調べ
	られるので、これで調べてみると、"japanese" という項目は入っていま
	せんでした。(つまり、管理者が日本語入力関係のソフトをまともにイン
	ストールしていなかったのです。)

	そこで、「default-input-method で指定されたインプット・メソッドが
	実際にインストールされている場合に限り、activate-input-method を
	実行する」ということにして、上記のような and 文を書くことにしました。

	このような and 文の使い方の詳細については、今回の最後に解説を載せ
	ましたので、そちらを参照してください。

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

	今回は、「Emacs の起動時の挙動とさまざまなホック」です。
	Emacs の起動時には .emacs の他にどんなファイルが読み込まれるのか、
	.emacs よりもあとで読み込まれるファイルで設定される内容を上書きする
	にはどうすればいいのか、といった話題をお伝えします。

				☆

	今回の話題については、開発元である GNU のマニュアルに詳細な記載が
	あります。
		http://www.gnu.org/manual/
	この中の「elisp-manual-20-2.5」と「elisp-manual-21-2.8」がそれぞ
	れ、Emacs 20 用、Emacs 21 用のマニュアルです。今回の内容に関連する
	項目は、それぞれのマニュアルの「Operating System Interface」という
	章に記載されています。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆そもそも、Emacs の起動時にはどんなファイルが読み込まれるのか☆

	Emacs の起動時には、次のような順序でファイルが読み込まれます。

		1.site-start.el(/usr/local/share/emacs/site-lisp/ などに
		 置きます)
		2.~/.emacs(XEmacs の場合、~/.xemacs/init.el があればそちら)
		3.default.el(これも /usr/local/share/emacs/site-lisp/
		 などに置きます)
		4.画面の種類に応じた設定ファイル

	【補足】paths.el、site-load.el、mule-init.el、site-init.el といった
	    ファイルもありますが、これらは Emacs を C 言語のソースコード
	    からコンパイルする際に読み込まれるもので、通常の実行時には
	    読み込まれないので、書き換えても意味がありません。

	通常、マシンの管理者は、1. の site-start.el に、日本語入力システム
	の設定など、必要な設定を書き込みます。

	その次に ~/.emacs が読み込まれ、さらにその後から、default.el が
	読み込まれます。この default.el は主に、.emacs で設定した内容に
	応じていろいろな初期化をするために使われますが、個別のユーザーの
	設定を無視して強制的にユーザー全員に特定の設定を使ってもらうために
	使うこともあります。

	たとえば、初心者ユーザーが多い某システムでは、default.el に
		(setq default-buffer-file-coding-system 'euc-jp-unix)
	と書き込んでいます。こうすることで、詳しいことを知らないユーザーが
	.emacs に別の設定を書き込んでいたとしても、それを上書きしてデフォ
	ルトの文字コードを EUC にすることができます。

	4. の「画面の種類に応じた設定ファイル」というのは、term/xterm.el、
	term/vt100.el などです。環境変数 TERM の設定に応じて、カーソルキー
	やファンクションキーなどが正しく働くような設定が行われます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆default.el の設定が不満な場合──after-init-hook☆

	さて、default.el は .emacs よりも後になってから読み込まれるわけ
	ですが、場合によっては、この設定内容が不満になる場合があります。
	たとえば、上記の
		(setq default-buffer-file-coding-system 'euc-jp-unix)
	の例でいうと、「私は EUC ではなく JIS をデフォルトにしたい」と
	思った場合、.emacs にいくら書いても、default.el で上書きされて
	しまい、効果がありません。

	この場合、ふたつの方法があります。

	ひとつ目は、思い切って default.el を読み込まないようにしてしまう
	ことです。.emacs に
		(setq inhibit-default-init t)
	と書いてしまうだけで、default.el を読まなくなります。しかし、
	default.el には、それ以外にも必要な設定がかかれていることがある
	ため、どうしても必要な場合以外はおすすめできません。

	もうひとつは、after-init-hook を使う方法です。たとえば .emacs に
	    (add-hook 'after-init-hook '(lambda ()
		(setq default-buffer-file-coding-system 'iso-2022-jp-unix)
		;その他、default.el より後に実行したい内容をここに書く
	    ))
	と書いておけば、その内容は default.el よりも後から実行してくれます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆ファンクションキーの設定がきかない!──term-setup-hook☆

	第 2 回、第 14 回、第 20 回では、function-key-map を使ってファンク
	ションキーの設定をしたり、または Delete、Backspace といったキーを
	DEL、C-h に割り当てたり、ということをしましたが、不思議なことに、
	.emacs にこの設定を書いても効果がない、というケースがあります。

	たとえば、筆者の最近の環境は Windows の Tera Term Pro というソフト
	で UNIX マシンにログインして Emacs を使うことが多いのですが、その
	場合、デフォルトの設定では
		PageUp キーが Delete と見なされる
		End キーが Prior(PageUp)とみなされる
		Home キーが効かない
		Insert キーが Find キーとみなされる
	といった不具合があります。そこで、第 14 回で紹介したとおり、
		(define-key function-key-map "\e[21~" [f10])
		(define-key function-key-map "\e[3~" [prior])
		(define-key function-key-map "\e[2~" [home])
		(define-key function-key-map "\e[1~" [insert])
	と書いているのですが、実は、単に .emacs にこう書いても、効果があり
	ません。

	これは、.emacs が読み込まれ、さらに default.el が読み込まれたあと
	になってから term/vt100.el が読み込まれ、それによって上書きされて
	しまっているためです。

	対策としては、やはりホックを使うことになります。この例では
		(add-hook 'term-setup-hook '(lambda ()
			(define-key function-key-map "\e[21~" [f10])
			(define-key function-key-map "\e[3~" [prior])
			(define-key function-key-map "\e[2~" [home])
			(define-key function-key-map "\e[1~" [insert])
		))
	のように書くことになります。

	また、第 2 回で紹介した
		(define-key function-key-map [backspace] "\C-h")
		(put 'backspace 'ascii-character   8)
	も、環境によっては動作しない場合がありますから、上記の add-hook
	文の中に入れてしまってください。

	さらに、Emacs 21 では、設定によっては、
		Backspace キーを押すと、DEL を押したとみなされる
		Delete キーを押すと、C-d を押したとみなされる
	という奇妙な環境があります。これを通常の設定(Delete キー→DEL、
	Backspace キー→C-h)に戻すには、
		(normal-erace-is-backspace-mode 0)
	としてください。詳細は後日。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆and と or のトリッキーな使い方☆

	さて、今回の冒頭で紹介したコードの中に、
	(and
		default-input-method
		(assoc default-input-method input-method-alist)
		(activate-input-method default-input-method)
	)
	というコードがありました。

	通常、and 文というものは、
		(if (and X Y Z....)
			....
		)
	という形で使い、「X、Y、Z.... がすべて真(=nil 以外)なら…」と
	いう意味になります。

	ところが、今回は if 文なしで and が単独で出てきています。これに
	ついて解説します。

	(and X Y Z) というのは、「X、Y、Z がすべて真(=nil 以外)」という
	意味ですが、実は、次のように振る舞います。
		1.まず X を評価する。X が nil になれば、Y 以降は評価せずに、
		  (and ....) 全体の値は nil になる。
		2.次に Y を評価する。Y が nil になれば、Z は評価せずに、
		  (and ....) 全体の値は nil になる。
		3.続いて Z を評価する。Z が nil になれば、(and ....) 全体の
		  値は nil になる。Z が nil 以外になった場合は、その Z の
		  値を (and ....) 全体の値とする。

	つまり、今回の場合は、
		・default-input-method に nil 以外の値が入っていて、かつ、
		・(assoc default-input-method input-method-alist) が nil
		 以外の値を返したときに、
		・(activate-input-method default-input-method) を実行する
	という意味です。普通の if 文を使って書き換えれば、
		(if (and default-input-method
		         (assoc default-input-method input-method-alist)
		    )
		    (activate-input-method default-input-method)
		)
	となります。

	【補足】(assoc default-input-method input-method-alist) は、現在
	    インストールされているインプット・メソッド一覧が入っている
	    input-method-alist の中に、default-input-method があるか
	    どうかを調べるものです。文法的な詳細はまた後日。

				☆

	and と同様に、or もトリッキーな使い方をすることができます。
	or の場合は、たとえば (or X Y Z W) と書いたとして、
		・まず X を評価し、それが nil 以外の値になったら、Y 以降は
		 評価せずに、X の値を (or ....) 全体の値とする
		・次に Y を評価し、それが nil 以外の値になったら、Z 以降は
		 評価せずに、Y の値を (or ....) 全体の値とする
		・続いて Z を評価し、それが nil 以外の値になったら、W は
		 評価せずに、Z の値を (or ....) 全体の値とする
		・最後に W の値を評価し、それを (or ....) 全体の値とする
	という振る舞いを示すので、たとえば
		(setq temporaty-directory (or
			(getenv "TEMP") (getenv "TMP") "/tmp"
		))
	といった書き方ができます。これは、環境変数 TEMP が定義されていれば
	その値、TMP が定義されていればその値、どちらも定義されていなければ
	"/tmp"、を temporary-directory に代入します。

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

	次回は
		○便利なマクロ (4) ローマ字のミスタイプからの立ち直り」
		○Backspace と Emacs 21 と Linux に関する奇妙な問題
		○Emacs 内部の文字コードの話
	のどれかを予定しています。「便利なマクロ (4)」はまたもや Wnn の
	話ですが、Wnn についてはこれで一段落ですので、もうしばらくご辛抱
	ください。

        それではまた♪

========================================================================
極私的 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
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

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