2に設定lisp-indent-offset
することもできますが、自分が何をしているのかを本当に理解していない限り、これを実行したくないことはほぼ間違いありません。
Lispスタイルの言語は、他の言語とは少し異なるインデント哲学に準拠しています。S式の最初の要素が開き括弧の後に単独である場合、慣例では、残りの要素を並べて同じ列から開始します。
(first-item
second-item
third-item fourth-item fifth-item
sixth-item)
2番目の要素が最初の要素と同じ行にある場合、規則では、次の要素を2番目の要素に揃えます。
(first-item second-item
third-item fourth-item fifth-item
sixth-item)
この規則は、への呼び出しなどの関数呼び出しを含む、特別な形式ではないsexpに適用されますstring-append
。特別な形式、つまりエバリュエーターとコンパイラーによって特別に解釈されるsexpは、わずかに異なるインデントに従います。評価する式を提供するフォームは、2つのスペースでインデントされます。
(lambda (value)
(display value)
(send-eof))
経験豊富なLisperにとって、2つのスペースは、式が特殊なフォームであり、その2つのスペースでインデントされたサブフォームが順番に評価されることを微妙に示しています。define-syntax
またはを使用して独自の特殊フォームを作成する場合defmacro
、Emacsに同じ方法でサブフォームをインデントするように指示できます。
;; define a CL-style `unless` macro...
(defmacro unless (test &rest forms)
`(or ,test (progn ,@forms)))
;; ...and tell emacs to indent its body forms with two spaces
;; (unless (= value 0)
;; (display value)
;; (send-eof))
(put 'unless 'lisp-indent-function 2)
インデントレベルを変更すると、何が起こっているかについて誤ったシグナルがリーダーに送信され、コードが損なわれます。Emacsがへの呼び出しをインデントする方法が気に入らない場合はstring-append
、2番目の形式に切り替えることをお勧めします。これにより、文字列がさらに右側に自動的にインデントされます。
(string-append "foo "
"bar "
"baz")