SLIME:slime indentation - lisp-cookbook-ja/common-lisp GitHub Wiki
Emacsに付属するcl-indent.elの機能を拡張したSLIMEのcontribモジュールです。インデントのスタイルを定義でき、common-lisp-set-styleコマンドで切り替えられるようになっています。
設定
slime-indentationを有効にするには、slime-setupにslime-indentationを指定します。
(slime-setup '(slime-fancy slime-indentation))
のようなEmacs Lispコードを評価するとロードされます。.emacsに書いておけば良いでしょう。
スタイルの切り替え
common-lisp-set-styleコマンドを利用します。M-x common-lisp-set-styleすると
Specify Common Lisp indentation style:
というプロンプトがEmacsのミニバッファに表示されるので、スタイルの名前を指定します。
定義済みのスタイル
:basic: すべてのオプションをデフォルトに設定するスタイル。 :classic: 1995年当時のcl-indent.elをエミュレートするスタイル。ifのthen部とelse部のインデントがスペース2個分になり、caseの各clauseのbody部がkey部よりスペース2個分深くインデントされる。 :modern: 汎用的なスタイル。glossary/lambda_list ラムダリストのキーワードとキーワードパラメータを揃え、loopのsubclauseのインデントをしない。 :sbcl: Steel Bank Common Lispのソースコードで使われているスタイル。modernスタイルをベースに、SBCL固有の構文への対応、タブによるインデントの禁止、78桁での折り返し、whitespace-modeによるタブと連続するスペースの可視化をする。
インデント例
ラムダリスト
;; basic
(lambda (x y &optional z
&key a b
c
&rest rest)
t)
;; modern, sbcl
(lambda (x y &optional z
&key a b
c
&rest rest)
t)
;; classic
(lambda (x y &optional z
&key a b
c
&rest rest)
t)
if
;; basic, modern, sbcl
(if (atom t)
t
nil)
;; classic
(if (atom t)
t
nil)
case
;; basic, modern, sbcl
(case x
((1 3 5 7 9)
:odd)
((0 2 4 6 8)
:even))
;; classic
(case x
((1 3 5 7 9)
:odd)
((0 2 4 6 8)
:even))
loop
;; basic, classic
(loop for i
from 0
below 10
collect i)
;; modern, sbcl
(loop for i
from 0
below 10
collect i)