回答:
関数とマクロのシンボルには、またはでlisp-indent-function
設定できるプロパティがありdeclare
、if
すでに定義されているため、そのまま使用できますput
。
可能なプロパティ値については、こちらをご覧ください。
M-: (info "(elisp) Indenting Macros")
return
if
のデフォルト設定は2
、2番目のフォームgetの特別な扱いを意味し、オフセットされます。
プロパティ値をに変更する'defun
と、すべてのボディフォームが整列します。
(put 'if 'lisp-indent-function 'defun)
インデントスタイルには理由があることに注意してください。if
Elisp 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で作業することが難しくなり、他の人が自分の作業で作業することが難しくなります。
私は実際には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)))
declare
新しいマクロごとにステートメントを置くことを忘れないでください。これはどのような場合でも良いことです。
if
によって実行されるのインデントだけを修正しlisp-indent-function
ます。