Next: SMIE Indentation Helpers, Previous: SMIE Tricks, Up: SMIE [Contents][Index]
提供された文法にもとづき、他に特別なことを行わなくても、SMIEは自動的なインデントを提供できるでしょう。しかし実際には、このデフォルトのインデントスタイルでは、恐らく十分ではありません。多くの異なる状況において、これを微調整したいと思うかもしれません。
SMIEのインデントは、インデントルールは可能な限りローカルであるべきという考えにもとづきます。バーチャルインデント(virtual
indentation)という考えによって、この目的を達成します。これは、特定のプログラムポイント(program
point)は行頭にバーチャルインデントがある場合は、それをもつだろう、という発想です。もちろん、そのプログラムポイントが正に行頭にある場合は、そのプログラムポイントのバーチャルインデントは、プログラムポイントのカレントのインデントです。しかしそうでない場合は、SMIEがそのポイントのバーチャルインデントを計算するために、インデントアルゴリズムを使用します。ところで実際には、あるプログラムポイントのバーチャルインデントは、その前に改行を挿入した場合にプログラムポイントがもつであろうインデントと等しい必要はありません。これが機能する方法を確認するためには、Cにおける{
の後のSMIEのインデントルールは、{
がインデントする行自体にあるか、あるいは前の行の終端にあるかを配慮しないことが挙げられます。かわりに、これらの異なるケースは、{
の前のインデントを決定するインデントルール内で処理されます。
他の重要な考え方として、parentの概念があります。あるトークンparentは、周囲にある直近の構文構造の代表トークン(head
token)です。たとえば、else
のparentは、それが属するif
であり、if
のparentは周囲を取り囲む構造の先導トークン(lead
token)です。コマンドbackward-sexp
は、あるトークンからトークンのparentにジャンプしますが、注意点がいくつかあります。opener(if
のような、ある構造を開始するトークン)にたいしては、他のトークンではそのトークンの後のポイントから開始する必要があるのにたいして、opnerではそのトークンの前のポイントから開始する必要があります。backward-sexp
はparentトークンがそのトークンのopenerの場合はparentトークンの前のポイントで停止し、それ以外ではparentトークンの後のポイントで停止します。
SMIEのインデントルールは、2つの引数methodとargをとる関数により指定されます。ここでargの値と期待されるリターン値は、methodに依存します。
methodは、以下のいずれかを指定できます:
:after
:
この場合、argはトークンであり、関数はargの後に使用するインデントにたいするoffsetをリターンすべきである。
:before
:
この場合、argはトークンであり、関数はarg自体に使用するインデントのoffsetをリターンすべきである。
:elem
:
この場合、関数は関数の引数に使用するインデントのオフセット(argがarg
の場合)、または基本的のインデントステップ(argがbasic
の場合)、のいずれかをリターンすべきである。
:list-intro
:
この場合、argはトークンであり、関数はそのトークンの後が単一の式ではなく、(任意のトークンにより区切られない)式のリストが続く場合は非nil
をリターンすべきである。
argがトークンのとき、関数はそのトークンの直前のポイントで呼び出されます。リターン値nil
は常にデフォルトの振る舞いへのフォールバックを意味するので、関数は期待した引数でないときはnil
をリターンするべきです。
offsetは、以下のいずれかを指定できます:
nil
: デフォルトのインデントルールを使用する。
(column . column)
: 列columnにインデントする。
:after
にたいするカレントトークンであり、かつ:before
にたいしてparentであるようなトークン)にたいして相対的な、numberによるオフセット。