Next: , Previous: , Up: SMIE   [Contents][Index]


22.7.1.6 Specifying Indentation Rules

提供された文法にもとづき、他に特別なことを行わなくても、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つの引数methodargをとる関数により指定されます。ここでargの値と期待されるリターン値は、methodに依存します。

methodは、以下のいずれかを指定できます:

argがトークンのとき、関数はそのトークンの直前のポイントで呼び出されます。リターン値nilは常にデフォルトの振る舞いへのフォールバックを意味するので、関数は期待した引数でないときはnilをリターンするべきです。

offsetは、以下のいずれかを指定できます: