Cの字下げ機構は、構文解析で得られた構文構成要素リスト
c-syntactic-context
を使って、現在行の字下げ幅を計算します。
このリストの各要素は、構文シンボルを含むコンスセルですが、
バッファ内位置を含んでいる場合もあります。
リストの各要素は、最終的な総字下げ量に2つの方法で寄与します。
まず、各構文シンボルに字下げオフセットを対応付ける連想リスト
c-offsets-alist
から要素を探すために構文シンボルが使われます。
各構文構成シンボルのオフセットを総字下げ量に加えます。
つぎに、リストの要素にバッファ内位置が含まれていれば、
その箇所の桁位置を字下げ量に加えます。
これらのオフセットと桁数をすべて加えることで、総字下げ量が求まります。
以下の例でCの字下げ機構の動作を説明しましょう。
1: void swap (int& a, int& b) 2: { 3: int tmp = a; 4: a = b; 5: b = tmp; 6: }
3行目にポイントがあって、そこで<TAB>と打って字下げし直すとしましょう。 上(see Syntactic Analysis)でも説明しましたが、 その行に対する構文構成要素リストはつぎのようになります。
((defun-block-intro . 28))
ここでは、まず、連想リストc-offsets-alist
から
defun-block-intro
を探すことから始めます。
その結果が整数値2であったとしましょう。
この値を計算中の合計(0で初期化されている)に加えて、
総字下げ量は空白2文字と更新されます。
つぎの段階は、バッファ内位置28の桁位置を求めることです。 バッファ内位置28の中括弧は0桁目にあるので、 0を計算中の合計に加えます。 3行目には構文要素が1つしかないので、総字下げ量は空白2文字となります。
1: int add (int val, int incr, int doit) 2: { 3: if (doit) 4: { 5: return(val + incr); 6: } 7: return(val); 8: }
4行目で<TAB>と打つと、同じ過程を繰り返しますが、 異なる値を使って計算されます。 この行に対する構文構成要素リストはつぎのとおりです。
((substatement-open . 43))
まずは、シンボルsubstatement-open
を連想リスト
c-offsets-alist
から探します。
このシンボルに対するオフセットが2であったとしましょう。
この時点で計算中の合計は2(0 + 2 = 2)です。
つぎに、バッファ内位置43(3行目のif
の`i'の位置)の
桁位置2を加えます。
結果として、空白4文字という総字下げ量が求まります。
行を解析した結果、c-offsets-alist
に現れない構文シンボルが
みつかった場合、そのシンボルは無視します。
しかし、変数c-strict-syntax-p
がnil
以外の値であれば、
エラーを報告します。