しかし、やはり Gauche 専用のモードがあった方が良いでしょうね。
そこで、http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Gauche%3aEditingWithEmacs で幾つか紹介されている Majar Mode から、http://www.hh.iij4u.or.jp/~nishio/gauche-mode/ を使ってみることにしました。
この時点で最新の snap shot だった gauche-mode-20060110.tar.bz2 を download して、README の通りに make してみたんですが、
*** ERROR: string required, but got #f Stack Trace: _______________________________________ 0 (string->list format-string) At line 37 of "/usr/share/gauche/0.8.3/lib/srfi-29/format.scm" 1 (format #f ";; exclude modules:\t~s\n" (cdr argv)) At line 50 of "./make-sym.scm" 2 (print-comments) At line 112 of "./make-sym.scm" make: *** [BSD/gauche-module-symbol.dat] エラー 70
となってダメでした。
gauche で error を吐いてるので、XEmacs とは関係無さそうです。
README を見てみると、gauche-mode は最終更新が 2005-12-08 で、しかも `cleanup make-sym.scm' となっていて、error を起こした script そのものです。
これは gauche を最新に上げないと無理な気が。
一応、一世代古い gauche-mode も試してみましたが同じでした。
make -n してみると、いきなり gosh make-sym.scm とかして error になっているので、これを単独で実行してみても全く同じ結果に。
つまり、このスクリプトが gosh 上で正しく動作できていないということなので、gauche の構築した環境がマッチしてないという可能性が高いことになります。
となればやはり最新を試してみるべきなので、Gauche-0.8.6.tgz (2006/2/20時点の最新。現在は 0.8.7) を download して展開。
make && make test で問題無し。そのまま sudo make install として最新版のインストール完了。
$ gosh -V Gauche scheme interpreter, version 0.8.6 [utf-8,pthreads]
となりました。
そして gauche-mode を make し直してみると、今度は成功しました。
しかし、私は普段、C-h を `backward-delete-char' に bind しているのですが、gauche-mode では `apropos' に bind してしまうので、bind し直すことにしました。
しかし、この gauche-mode、モードの実行時に gosh の process を生成して、その process にインタラクティブに評価させてるんですね。
これまで Perl や Ruby をその様な発想で利用したことはありませんでした。考えてみれば Perl/Ruby の debbugger や shell buffer (shell-mode) と同じなんですが、スクリプトの編集モードとそれを括りつける発想がありませんでしたねえ。
Emacs Lisp では当然の様にやってた訳ですが、Emacs Lisp だから特別に感じていた (そもそも Emacs が Emacs Lisp のインタプリタな訳ですし) ということでしょうね。
Scheme ということで、Emacs Lisp と同様に利用したいという強い欲求から来たものでしょうか。素晴しいです。
それならばついでに、という事で、Emacs の scratch buffer と同様のものを作ってしまうことにしました。
;; Create scratch buffer for Gauche. (defconst gauche-util-help-message ";; If you want to exit this buffer, type C-c C-q.") (defun gauche-util-create-scratch-buffer () "Create scratch buffer for Gauche." (interactive) (let ((sbuf (generate-new-buffer "*gauche scratch*"))) (set-buffer sbuf) (insert (concat initial-scratch-message gauche-util-help-message "\n\n")) (save-excursion (goto-char (point-min)) (let ((end (re-search-forward "lisp" nil nil nil)) (start (match-beginning 0))) (replace-match "gauche" nil nil))) (set-buffer-modified-p nil) (switch-to-buffer sbuf) (gauche-mode) (save-excursion (goto-char (point-min)) (let ((end (re-search-forward "for gauche evaluation" nil nil nil)) (start (match-beginning 0))) (add-text-properties start end '(face font-lock-reference-face)))))) (defun gauche-util-kill-scratch-buffer () "Kill scratch buffer for Gauche." (interactive) (progn (gauche-kill-gauche-process) (kill-buffer (current-buffer)))) (global-set-key [(control q) G] 'gauche-util-create-scratch-buffer) (add-hook 'gauche-mode-hook (lambda () (define-key (current-local-map) [(control c) q] 'gauche-util-kill-scratch-buffer)))
このコード、scratch buffer の生成時に挿入されている文字列のうち、
for Lisp evaluation.
となっているところを、
for Gauche evaluation.
と書き変えて更に強調する処理を加えるため*だけ*に、余計なコードが歪な構成で入ってますが、それはご愛嬌ということで。あと、そもそも gauche-mode が XEmacs でしか動作しないので、このコードも XEmacs 以外のことは何も考えてません。
でも、そろそろ本当に FSF Emacs に移行しなきゃと思ってるんですけど、どんどん自分で自分の首を絞めてますね。