一部のEmacs Lispフォームのインデントを変更する


8

Common Lispのように、いくつかのEmacs Lispフォームをインデントしてほしい。たとえば、Emacs Lispでは、次のifようにインデントされます。

(if COND
    THEN
  ELSE)

私はそれをこのようにしたいのですが:

(if COND
    THEN
    ELSE)

私はこれを行うことができます:

(setq lisp-indent-function #'common-lisp-indent-function)

しかし、これはすべてのフォームに影響を与えるためcl-letf、ユーザー定義マクロなどのEmacs Lispマクロのインデントが解除されます。

回答:


17

回答:

関数とマクロのシンボルには、またはでlisp-indent-function設定できるプロパティがありdeclareifすでに定義されているため、そのまま使用できますput

可能なプロパティ値については、こちらをご覧ください。

M-: (info "(elisp) Indenting Macros") return

ifのデフォルト設定は2、2番目のフォームgetの特別な扱いを意味し、オフセットされます。

プロパティ値をに変更する'defunと、すべてのボディフォームが整列します。

(put 'if 'lisp-indent-function 'defun)

ベストプラクティス:

インデントスタイルには理由があることに注意してください。ifElisp ifではCommon Lisp とは異なります。

署名が異なることに注意してください。

Common Lisp: (if TEST THEN &OPTIONAL ELSE)

Emacs Lisp: (if COND THEN ELSE...)

Emacs lispでは、条件の後に好きなだけ多くのフォームを置くことができますが、最初のフォームのみがTHEN句であり、他のすべてのフォームはELSE句の一部です。

これは有効なElisp ifフォームで、CLでは無効です。

(if something
    (message "THEN")
  (message "all")
  (message "these")
  (message "run")
  (message "on")
  (message "ELSE"))

これは、THEN句をよりインデントすることが重要である理由を示しています。それは、すべてのELSE形式に対して目立つようにすることです。

インデントは、ユーザーがコードを解析する機能にとって重要であることに加えて、elispの受け入れられたスタイルパターンに反します。遭遇するelispコードの99.99999%(慎重に計算)は、まったく同じデフォルトのインデントスキームを使用します。if自分で使用するためのインデントを変更すると、他の人のelispで作業することが難しくなり、他の人が自分の作業で作業することが難しくなります。


2

私は実際にはCommon Lispのインデントを使用していifます。あなたは私のようないくつかのコードをカスタマイズすることができます:

(setq lisp-indent-function 'common-lisp-indent-function)
(eval-after-load 'cl-indent
  `(progn
     (put 'cl-flet 'common-lisp-indent-function
          (get 'flet 'common-lisp-indent-function))
     (put 'cl-labels 'common-lisp-indent-function
          (get 'labels 'common-lisp-indent-function))
     (put 'if 'common-lisp-indent-function 2)))

ありがとうございます。ただし、これにより、すべてのユーザー定義マクロのインデントも修正する必要があります。私はむしろ逆のルートをたどり、ifによって実行されるのインデントだけを修正しlisp-indent-functionます。
エレナ

私は何年もこの設定をしてきました。他に「修正」する必要のあるマクロはありません。declare新しいマクロごとにステートメントを置くことを忘れないでください。これはどのような場合でも良いことです。
abo-abo 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.