WindowsでGauche環境構築 / Emacs設定の勉強
cygwinのEmacsがC-x C-cで終了できないのは、cygwinのコンソール内ではCtrl-Cがコマンドプロンプトの終了シグナルと競合してしまって認識されないから、らしい。
いちおう回避方法はあるようですが、いろいろとめんどくさいことになりそうなのでcygwin emacsはやめてMeadowを使うことに。
やったこと
- Meadowインストールフォルダ内にある dot.emacs.ja を .emacs にリネームして、ホームディレクトリの
C:\cygwin\home\username
に置いた。 - リンク先ページに書いてあるとおり、.emacsへ設定を追加した。http://karetta.jp/book-node/gauche-hacks/004682
この設定で、Meadow内でgoshが動くようになりました。
Emacsの設定を勉強しよう
今回Scheme用に追加した設定は、上記のサイトからコピーしてきたものを、ほぼそのまま使わせてもらいました。
(setq process-coding-system-alist (cons '("gosh" utf-8 . utf-8) process-coding-system-alist)) (setq gosh-program-name "C:/cygwin/usr/local/bin/gosh -i") (autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t) (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t) (defun scheme-other-window () "Run scheme on other window" (interactive) (switch-to-buffer-other-window (get-buffer-create "*scheme*")) (run-scheme gosh-program-name)) (define-key global-map "\C-cS" 'scheme-other-window) (show-paren-mode) (put 'and-let* 'scheme-indent-function 1) (put 'begin0 'scheme-indent-function 0) ……
それぞれどういう意味なのか見ていってみる。
process-coding-system-alist
(setq process-coding-system-alist (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))
setq
はsetq [symbol form]...
の形で、シンボルに値をセットする。[symbol form]の組は複数指定可能。process-coding-system-alist
は、プロセスごとに使用するコーディングシステムを指定する連想リスト。- リファレンスマニュアル 32.10.5 デフォルトのコーディングシステム
連想リスト
とは、リストの各要素がコンスセルになっているもの。コンスセル
とは、CAR・CDRという2つのポインタからなるオブジェクト。連想リストは、リストの各要素のセルが持つCARがキーで、そのキーに対応する値は同じセルのCDRである、として表される。
cons
はcons object1 object2
の形で、object1をCAR、object2をCDRとするコンスセルを作成する。("gosh" utf-8 . utf-8)
は 「文字列"gosh"をCARとし、consセル(utf-8 utf-8)をCDRとするconsセル」の意味。- リファレンスマニュアル 2.3.6.1 ドット対記法
- 【TODO】utf-8はシンボル? どこかで定義されているのか?
("gosh"
の前に付いている引用符「'」は、quote。引数を評価しないために使う。引用符を付けていなかったら関数として評価されてしまう。
というわけで、この設定の意味は
「process-coding-system-alistという連想配列の先頭に、["gosh" => (utf-8, utf-8)]というエントリを追加する」
といったところか。これで、goshプロセスへの入出力がutf-8で行われるということでしょう。
gosh-program-name
(setq gosh-program-name "C:/cygwin/usr/local/bin/gosh -i")
gosh-program-name
という変数に、文字列 "C:/cygwin/usr/local/bin/gosh -i" を設定している。
autoload
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
autoload function filename docstring interactive type
の形式。functionという名前の関数やマクロを filenameから自動的にロードするように定義する。filename
に拡張子がなければ、.el か.elc が自動的に付加される。docstring
は関数の説明文。optional。interactive
は定義をいつロードするか。nil以外なら、実際に呼び出すまで関数定義をロードしない。定義をロードしなくても補完は効く。optional。type
には、定義しているものが関数ではないときに何を定義しているのかの情報を書く。具体的には、マクロならmacro
、キーマップならkeymap
。optional。- リファレンスマニュアル 14.4 自動ロード
つまり、この設定は
「scheme-modeという関数・run-schemeという関数を、cmuscheme.elから動的にロードする」
という意味。cmuscheme.elは {Meadowインストールフォルダ}\lisp にありました。【TODO】検索パスはどうなってるんだろう。
→【追記】検索パスは load-path
変数の値。
defun
(defun scheme-other-window () "Run scheme on other window" (interactive) (switch-to-buffer-other-window (get-buffer-create "*scheme*")) (run-scheme gosh-program-name))
defun name argument-list body-forms
の形式。name
という名前の関数を定義する。引数がargument-listで内容がbody-forms。argument-list
は引数名のリスト。body-forms
の最初の二つは、関数の説明文字列とinteractive宣言であってもよい。- リファレンスマニュアル 11.4 関数を定義する
- リファレンスマニュアル 11.2.4 関数の説明文字列
- リファレンスマニュアル 20.2.1 interactiveの使い方
switch-to-buffer-other-window
は、switch-to-buffer-other-window buffer-or-name norecord
の形式。buffer-or-name
をカレントバッファにして、現在選択されていないウィンドウにそのバッファを表示する。- ウィンドウが一つしかない場合は現在のウィンドウを二つに分割する。
norecord
がnilだったら、指定したバッファがバッファリストの先頭に来る。- 【TODO】バッファリストって何だろう
- リファレンスマニュアル 27.7 ウィンドウへのバッファの表示
get-buffer-create
は、get-buffer-create name
という形式。name
という名前のバッファがあったらそれを返す。なければ作成する。- リファレンスマニュアル 26.9 バッファの作成
run-scheme
は上で説明されてるように、cmuscheme.elの中で定義されている。
つまり、この設定は
「scheme-other-window関数を定義する。その動作は、"*scheme*"という名前のバッファを作って、それにフォーカスを移動して、goshのパスを引数としてrun-scheme関数を起動する」というもの。
define-key
(define-key global-map "\C-cS" 'scheme-other-window)
define-key keymap key binding
の形式。- キーマップ
keymap
において、キーkey
の動作をbinding
に設定する。 global-map
は、デフォルトのキーマップ。
show-paren-mode
(show-paren-mode)
対応する括弧を光らせる設定。paren.elの中に書いてある。
【TODO】paren.elはどのタイミングでロードされてるのだろう?
put
(put 'and-let* 'scheme-indent-function 1)
put symbol property value
の形式。- 属性リスト
symbol
で、属性名property
の属性値をvalue
で置き換える。
つまり、この設定は
「属性リストand-let*のscheme-indent-function属性値を1にする」という意味。
まとめ
今回出てきた中で重要そうなのは、
- 変数に値をセットするsetq
- 関数を定義するdefun
- キーマップを定義するdefine-key
- 属性値を設定するput
といったあたりか。
しまった
リファレンスマニュアル、古い版を見ちゃってた。
リンク張り直すの大変なので、このまんまで…