私は現在、バッファの残りのインデントをめちゃくちゃにすることなく、具体的にいくつかの行を処理する方法を理解しようとしています。MyFunc
例として次の関数を考えてください:
void MyFunc()
{
unsigned y = 0;
DONOTINDENT;
unsigned int x = 5 + 2;
return x + 12;
}
ここでは、行DONOTINDENT;
を列0までインデントしますが、関数の残りの部分は通常インデントする必要があります。私は次のカスタムを使用してこれを解決しようとしましたc-special-indent-hook
:
(defun my-c-mode-indent-hook ()
(let (p1 p2 myline)
(setq p1 (line-beginning-position))
(setq p2 (line-end-position))
(setq myLine (buffer-substring-no-properties p1 p2))
(if (string-match-p "DONOTINDENT" myLine)
(save-excursion
(indent-line-to 0))
)
)
)
(defun my-c-mode-common-hook ()
;; my customizations for all of c-mode and related modes
(setq c-special-indent-hook 'my-c-mode-indent-hook)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
OK、これは行に対しては非常にうまくDONOTINDENT;
機能しますが、後続のすべての行に対しては機能しませんDONOTINDENT;
。したがって、DONOTINDENT;
が列0までインデントされている場合は、列0までunsigned int x = 5 + 2;
もインデントされますが、列までインデントする必要がありますc-basic-offset
。
次の行のインデントを修正するにはどうすればよいですか?後続の行のインデントレベルの計算に影響を与えるために使用できる内部変数はありますか、またはこの計算は前のインデントに純粋に基づいていますか?switch-case-statementsのラベルも同様にインデントされているので、これをどうにかして実現できるはずだと思いますが、ccモードのコードを掘り下げるときにこれを理解するのに苦労しました。
前もって感謝します!
よろしく、ファビアン