ごりごりやっているのだが、ここに書けない。。。これはどうしたらよいか考えてみる。
さて、仕事とは無関係なこととして、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 件のコメント:
コメントを投稿