特定の行のカスタムインデント?


8

私は現在、バッファの残りのインデントをめちゃくちゃにすることなく、具体的にいくつかの行を処理する方法を理解しようとしています。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モードのコードを掘り下げるときにこれを理解するのに苦労しました。

前もって感謝します!

よろしく、ファビアン

回答:


0

DONOTINDENT行の性質によっては可能だと思います。

カスタムcc-offsets-alistルールでは、インデントする構文要素に応じて異なるインデントルールを使用できます。これを正しい構文記号と組み合わせて、必要に応じて特定の行をインデントすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.