2009年11月4日水曜日

Emacs22 の起動処理

仕事でやっていることが、勉強とだんだんかぶってきた。
ごりごりやっているのだが、ここに書けない。。。これはどうしたらよいか考えてみる。
さて、仕事とは無関係なこととして、Emacs22の環境整備をはじめた。まず、起動プロセスの調査から。


** Emacs22の起動プロセス

- infoに情報あり。Elisp, 39.1 Starup Emacs。
- 詳細を知るにはソースを読む。次のものがメイン。
- configure
- src/emacs.c
- lisp/loadup.el
- lisp/startup.el
- 呼び出しというか実行順はこんな感じ。
call src/emacs.c
...
load lisp/loadup.el
...
load lisp/startup.el
...
load lisp/loaddefs.el
...
load lisp/site-load.el
...
load lisp/site-init.el
call normal-top-level (eval top-level)
[normal-top-level (startup.el)]
...
call command-line (startup.el)
...
...
call Frecursive_edit (keyboard.c)

- loadup.elに含まれるものは、通常、temacsによっ
てdumpされ、emacsのイメージに含まれている。
昔はマシンのスピードが遅かったので、
site-load.elやsite-init.elをカスタマイズした
上で、自分用のイメージをdumpしていた。今はマ
シンのスピードが速いので、これらを使うのは得
策ではない。

- ここでは、EmacsおよびElisp librariesのデプロイ
を検討するための基礎情報に重点を置く。


0-1. 標準ライブラリパス

the standard library path.

- Emacsのcompile時にデフォルト値を決定。

- サイトのライブラリの置き場所として(デフォルト
では)、

- `/usr/local/share/emacs/VERSION/site-lisp'
- `/usr/local/share/emacs/site-lisp'

が設定される。前者はemacsのVERSIONに特化したも
の。後者はVERSIONに関わらないもの。

しかし、サイトのライブラリの置き場所だけでなく
設定ファイルの置き場所も兼ねている。configure
の中は次のとおり。

ac_default_prefix=/usr/local
# prefixを確定する機構
datarootdir='${prefix}/share'
datadir='${datarootdir}'
lispdir='${datadir}/emacs/${version}/lisp'
locallisppath='${datadir}/emacs/${version}/site-lisp:'\
'${datadir}/emacs/site-lisp'
lisppath='${locallisppath}:${lispdir}:${datadir}/emacs/${version}/leim'

- Emacs内では'load-path'変数にてこの値は管理され
る。よって、起動の途中でこの変数の値が変更され
れば、それ以降は変更された値が有効になる。

- debianのコンパイルではどういう設定になっている
かは要調査。


0-2. system type

- Emacsのcompile時に決定。
- emacs.cにて定義。

----
DEFVAR_LISP ("system-type", &Vsystem_type,
doc: /* Value is symbol indicating type of operating system you are using.
Special values:
`gnu/linux' compiled for a GNU/Linux system.
`darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
`macos' compiled for Mac OS 9.
`ms-dos' compiled as an MS-DOS application.
`windows-nt' compiled as a native W32 application.
`cygwin' compiled using the Cygwin library.
`vax-vms' or
`axp-vms' compiled for a (Open)VMS system.
Anything else indicates some sort of Unix system. */);
----


1-1. サブディレクトリ

subdirectories.

- loadup.elの所作。
- lispディレクトリのサブディレクトリを設定する。
設定するのはつぎのもの。
- emacs-lisp
- language
- international
- textmodes


1-2. サブディレクトリ

subdirectories.

- normal-top-level関数(startup.el)の所作。
- load-pathに含まれている各ディレクトリについて、
そこにsubdirs.elまたはleim-list.elがあれば、そ
れを実行する。通常subdirs.elには、関数
normal-top-level-add-subdirs-to-load-pathの呼
び出しがあり、そこにあるサブディレクトリを
load-pathに追加する。


2. ウィンドウシステムの初期化

loading the initialization library for the
window system.

- a windows systemでEmacsを起動しているなら、
`term/WINDOWSYSTEM-win.el'をloadする。

3. 言語環境と端末コーディング

the language environment and the terminal
coding system.

- Infoの説明では、これはウィンドウシステムの初
期化の前だが、sourceだと順番が逆。
- normal-top-level関数(startup.el)が、
set-locale-environment関数
(international/mew-cmds.el)を呼び出すことによ
り実現。

3-2. ユーザの特定

- comman-line関数 (startup.el) の所作。
- 環境変数などにアクセスするための基礎として、
userを特定する。


4. 初期化オプションの処理 (後半)

- comman-line関数 (startup.el) の所作。

- emacs.cが前半処理を実施。それはloadup.el部分
に入るまえに実施される。

5. before-init-hook

- Infoでは5と6は逆。sourceではこの順番。

- comman-line関数 (startup.el) の所作。
- before-init-hookを実行する。


6. ウィンドウフレームとフェイス

- comman-line関数 (startup.el) の所作。
- ウィンドウフレームとフェイスを初期化する。


7. site-start.elの特定とload

- comman-line関数 (startup.el) の所作。

- 標準ライブラリパスを順番に探す。みつかったとこ
ろで探索をやめ、それをload する。
- '--no-site-file'を起動オプションに指定すると、
このファイルはloadされない。


8. ユーザのInit Fileの特定とload

- comman-line関数 (startup.el) の所作。

ここで特定したホームディレクトリへのパスを"~"で
あらわす。
- 次の順でInit Fileを探す。みつかったところで探
索をやめて、みつかったものをloadする。

a. '~/.emacs'
b. '~/.emacs.elc'
c. '~/.emacs.el'
d. '~/.emacs.d/init.elc'
e. '~/.emacs.d/init.el'

- '-q'すなわち'--no-init-file'を起動オプションに
指定すると、このファイルはloadされない。
- また'-Q'すなわち'--batch'を起動オプションに指
定すると、このファイルはloadされない。
- '-u'にてユーザを指定すると'~'はそのユーザのホー
ムディレクトリを参照するためInit Fileが変更さ
れる。
- load関数の機構なら、'~/.emacs.d/init'も探索対
象になるはずだが、どうなのか。(要調査)


9. サイトのdefault.elの特定とload

- comman-line関数 (startup.el) が支配。

- 標準ライブラリパスを順番に探す。みつかったとこ
ろで探索をやめ、それをloadする。
- '-q'すなわち'--no-init-file'を起動オプションに
指定すると、このファイルはloadされない。
- 変数'inihibit-default-init'がnon-nilだと、こ
のファイルはloadされない。


10. after-init-hook

- comman-line関数 (startup.el) の所作。
- after-init-hookの実行。


11. initial-major-mode

- comman-line関数 (startup.el) の所作。
- *scratch*がまだfundamental-modeなら、
initial-major-mode関数を呼び出してこれを変更。


12. TERMTYPEの特定とterm/TERMTYPEのload

- normal-top-level関数 (startup.el) の所作。
- 次の手順で特定しloadする。

a. (getenv "TERM")にて環境変数TERMの値を得る。
b. aで得た文字列について、一番最初のハイフン以前
の値をTERMTYPEとする。例えば、TERMが'aaa-48' な
らば、TERMTYPEは'aaa'。
c. term/TERMTYPEがloadすべきファイルとなる。こ
れを標準ライブラリパスから探してloadする。

- 変数term-file-prefixがnilだと、このファイルは
loadされない。


13. initial echo area message

- これはsourceには無いような?


14. processing the action arguments

- これもsourceには無いような?


15. emacs-startup-hook, term-setup-hookの実行

- normal-top-level関数 (startup.el) の所作。

- emacs-startup-hookの実行。
- term-setup-hookの実行。


16. frame-notice-user-settings

- normal-top-level関数 (startup.el) の所作。
- user-settingsが有効になるようにnoticeをかける。


17. window-setup-hookの実行

- normal-top-level関数 (startup.el) の所作。
- window-setup-hookの実行。


18. initial scratch message、display startup screenの表示

- normal-top-level関数 (startup.el) の所作。
- 画面にメッセージ表示。



** Emacs22のloadとrequire

*** load

(load FILE &optional NOERROR NOMESSAGE NOSUFFIX MUST-SUFFIX)

FILEに含まれているLisp codeを実行する。
load-suffixes変数に定義されている順にsuffixをFILE
にファイルを探す。最後にsuffixをつけないでFILEその
ままで探す。探す対象ディレクトリはload-path変数に
含まれているもの。

*** autoload

(autoload FUNCTION FILE &optional DOCSTRING INTERACTIVE TYPE)

FUNCTIONが呼び出されたら、FILEをloadする。
DOCSTRINGを書けば、未load状態でもFUNCTIONの説明を
表示することができる。

autoload cookie `;;;###autoload' を関数定義の直前
に書いておくと、update-file-autoloads関数によって、
その関数に対するautoloadがloaddefs.elに追加される。

*** require

(require FEATURE &optional FILENAME NOERROR)

FEATUREがload済みでなければ、それをFILENAMEから
loadする。FEATUREがfeatures変数の値(list)に含まれ
えていないなら、loadは実行されない。

FILENAMEが省略されている場合は、FEATUREのprint name
(おそらくシンボルの印字名)がFILENAMEの代替となる。

*** provide

(provide FEATURE &optional SUBFEATURES)

FEATUREがこのEmacsの a feature であることを周知す
る。SUBFEATURES はシンボルのリスト。このFEATUREに
付随して実現されている features を周知する。

*** package

Emacs22にCLのようなpackageシステムは存在しない。

0 件のコメント: