lisp-mode の改造
1. はじめに
xyzzy に付属している lispmode.l は大変よく出来ていますが、インデント用シンボルテーブルに
属性リストを使っているなどの気になる点もあります。
そこで、lisp-mode を少し改造してみました。
改造点は
- インデント用シンボルテーブルを属性リストからハッシュ表に変更
- インデント用シンボルテーブルにシンボルを追加する関数の追加
- マクロ展開用マクロ pme の追加
- その他、カレントバッファをコンパイルする関数などの追加
です。
2. インストール
ts-lispmode.lzh を解凍すると lispmode.l, lispmode.lc が生成します。
これら二つのファイルを /site-lisp にコピーし、
ダンプファイルを再作成します。
これで新しい lisp-mode がもともとの lisp-mode を override します。
アンインストールするには、新しく作成した /site-lisp/lisp-mode.l, /site-lisp/lisp-mode.lc を
削除し、ダンプファイルを再作成します。
以前は lisp-mode を上書きするよう書いていましたが、
佐野さんから /site-lisp の方が /lisp より優先度が
高いとのご指摘を戴きました。
謹んで訂正します。
3. テスト
Lisp のソースコードのファイルを開いて、適当に S 式を入力してみてください。
リターンキーを押したとき前よりレスポンスが早くなったような気がしたら大成功です。
もし、そんな気がしなくても以前と同じように動作していれば成功です。。。。
4. 追加された機能
紫藤には便利な追加機能を紹介します。
4.1 インデント用シンボルテーブルにシンボルを登録する
[function name:lisp-set-indent, default key: #\M-i]
マクロ名などの構文シンボルをインデント用テーブルに登録するとき使います。
この関数を起動すると、ミニバッファに
give [target-sym],[ref-sym] (RET=>end):
と表示され、入力を待ちます。例えば for を dotimes と
同じようにインデントさせたいときは、
2つのシンボル名をカンマ (,) で区切って
for,dotimes
と入力すると以降 for は dotimes と同じようにインデントされます。
終了するときは何も入力しないでリターンして下さい。
また、カンマの後にスペースは入れないで下さい。
4.2 マクロ展開を整形して表示する
[macro name:pme]
*scratch* で、マクロ展開形を確かめるために使います。
例)
(defmacro for ((var start stop) &body body)
(let ((gstop (gensym)))
`(do ((,var ,start (1+ ,var))
(,gstop ,stop))
((> ,var ,gstop))
,@body)))[ctrl-j]
for
(pme (for (i 3 7)
(princ i)))[ctrl-j]
(do ((i 3 (1+ i))
(#:G1 7))
((> i #:G1))
(princ i))
nil
4.3 その他のユーティリティ
次にその他のユーティリティを示します。
- [function name: eval-current-buffer, default key F10]
- 現在のバッファを評価します。
- [function name: compile-current-buffer, default key: S-F10]
- 現在のバッファをコンパイルします。
- [function name: lisp-indent+, default key: TAB]
- 範囲が選択されているときは選択範囲をインデントします。選択されていないときはカーソルのある行をインデントします。
5. おわりに
lispmode.l に、ほんの少し手を加えてみました。
ご参考までに。。。。