3

デフォルトでは、Emacsのスキームモードは1つのスペースインデントを使用してコードをフォーマットします。

(string-append
 "foo "
 "bar "
 "baz")

私はそれを少なくとも2つのスペースにしたい、すなわち:

(string-append
  "foo "
  "bar "
  "baz")

Emacsのほとんどのモードでは、これは非常に簡単に変更できますが、スキームでそれを行う方法がわかりません。私はscheme.elのソースコードも調べましたが、そこにはあらゆる種類の派手な配置を行うためのロジックがありますが、「標準インデント」をカスタマイズする簡単な方法は見つかりませんでした。

4

2 に答える 2

13

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")
于 2012-09-15T00:20:13.993 に答える
0

インデントスタイルの多様性が問題の原因です。したがって、Emacsモードは通常、ほとんどの既存のインデントスタイルをサポートしようとしますが、新しいスタイルを発明するように促すため、必ずしも別のスタイルを簡単に使用できるとは限りません。一般に、「標準」のインデントスタイルで生活することを学ぶほうがよいでしょう。これは、他の人のコードを読んだり、他の人があなたのコードを読んだりするのに役立ちます。

于 2012-09-15T02:29:06.247 に答える