Emacs (Meadow) + GaucheでScheme開発

Scheme処理系は色々あるがGaucheを使うことにした。理由は特にない。Emacsで便利に使えそうなのをGoogleで検索してたら最初に見つかっただけ。

Gauche本体はGauche本家のダウンロードページから取ってこれる。MinGWコンパイルしたWindows版のリンクは404になっているが、一つ前のバージョンをアドレス直打ちすればOK。

Unix版のインストールは難しくない。configure && make && make installでいけた。configureのオプションはいくつかあったが、SICPを勉強する分にはデフォルトで問題ない気がする。

Windows版は展開するのみ。ただし、Meadowから使うときにGauche (gosh.exe) のパスに空白文字があるとうまくいかないっぽいので空白文字を含まないところに置く。つまりC:/Documents and Settings以下はやめよう。

EmacsMeadowでは最初からSchemeモードが用意されている(いつのバージョンからあるかは知らない。少なくともEmacs-22やMeadow-3系にはある)。基本的な設定はこのサイトの設定をコピペする。なお

(setq gosh-program-name "/usr/local/bin/gosh -i")

の部分は自分が置いたgosh.exeのパスに変更する。

これで.scmファイル編集中にC-cSでGaucheを起動できる。また、現在のバッファをGaucheに読み込ませるのはC-cC-l。

これだけではいくつか不満があったのでもう少し追加する。まずinferiro-scheme-mode(schemeを動作させるほうのバッファ)で、C-p, C-nでコマンドヒストリを辿れるようにする。デフォルトではカーソル上下してしまう。

(add-hook 'inferior-scheme-mode-hook '(lambda()
   (define-key inferior-scheme-mode-map "\C-p" 'comint-previous-input)
   (define-key inferior-scheme-mode-map [up] 'comint-previous-input)
   (define-key inferior-scheme-mode-map "\C-n" 'comint-next-input)
   (define-key inferior-scheme-mode-map [down] 'comint-next-input)))

さらにC-cC-lでschemeファイルをロードしたときに、自動的に*scheme*バッファに移動するようにする。

; 現在のバッファのファイルを読み込む
(defun my-scheme-load-current-buffer-file ()
  (interactive)
  (scheme-load-file (buffer-file-name (current-buffer))))

; 現在のバッファのファイルを読み込み、*scheme*バッファに移動
(defun my-scheme-load-current-buffer-file-and-switch ()
  (interactive)
  (my-scheme-load-current-buffer-file)
  (switch-to-buffer-other-window "*scheme*"))

(add-hook 'scheme-mode-hook '(lambda()
  (define-key scheme-mode-map "\C-c\C-l" 'my-scheme-load-current-buffer-file-and-switch)))

本当はloadに失敗したときは移動しないようにしたいけどやり方がわからない...。