C ++モード、インデンデーションの混乱
今日、私は気になる奇妙なことに気づきました。これが私が書いた関数の小さな例です。私はアルマジロを使用していますが、それは重要ではありません。ここでは、インデントは問題なく表示されます。
float GetE0()
{
// Calculate E0 according to Kurfess et. al, 2000
arma::fvec
E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z}, E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
float cosPhi2 = norm_dot(E2,E3);
return Kurfess_Eq5(cosPhi2);
}
今、私は長い間の初期化を見つけるE2
とE3
迷惑をので、私はより良いreadibilityための2つの間に改行を行います。また、バッファ全体をインデントします。
float GetE0()
{
// Calculate E0 according to Kurfess et. al, 2000
arma::fvec
E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
float cosPhi2 = norm_dot(E2,E3);
return Kurfess_Eq5(cosPhi2);
}
さて、Emacsは同じ列に[...]フロートをインデントし、return文E2
、E3
。これは最初の例では当てはまりませんでした。私の素人の考えでは、最後の2つのステートメントarma::fvec
は、最初の例のように、ステートメントと同じ列に属しています。
これを修正する方法はありますか?
私はまだインターネットで特定のものを見つけることができませんでした。通常、私はcスタイルの「stroustrup」を使用しています。私は成功せずに他のスタイルを試しました。
編集:申し訳ありませんが、私は完全に忘れました。私はemacs25.2.2を使用しており、helmを使用しており、clangを備えた会社を使用していますが、インデントを変更するパッケージは考えられません。
Edit2: -Qオプション(emacs -Q)でも同じ動作が見られたので、パッケージが原因であるとは言えないと思います。
Edit3: emacs 27.1をインストールすると問題が修正されましたが、これにより、強調表示とインデントに関するフォローアップの質問が表示されます。
例3:インデントは正しいように見えますが、強調表示はオフになっています(以前はそうでしたが、インデントの問題が優先されました)。
float GetE0()
{
// Calculate E0 according to Kurfess et. al, 2000
arma::fvec
E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
float cosPhi2 = norm_dot(E2,E3);
return Kurfess_Eq5(cosPhi2);
}
上記の例では、EmacsE2
は変数として強調表示されていますがE3
、標準のテキストカラーです。インデントをExample4に変更すると、次のようになります。
float GetE0()
{
// Calculate E0 according to Kurfess et. al, 2000
arma::fvec
E2 {vertex2X - vertex1X,
vertex2Y - vertex1Y,
vertex2Z - vertex1Z},
E3 {vertex3X - vertex2X,
vertex3Y - vertex2Y,
vertex3Z - vertex2Z};
float cosPhi2 = norm_dot(E2,E3);
return Kurfess_Eq5(cosPhi2);
}
のインデントがE2
とは異なることがわかりE3
ます。異なるインデントは、emacsE3
が変数として認識しない結果であると思います。誰かもこれを観察しましたか?
ここに説明のためのスクリーンショットがあります

回答
さて、CC-Modeのメンテナ/開発者と連絡を取りましたが、これはバグであることがわかりました。彼らはまたそれの世話をしました:https://sourceforge.net/p/cc-mode/mailman/message/37097087/
通信には、テキスト形式のパッチがあります。パッチを適用するには、テキストをファイル(patchfile.txtなど)にコピーします。
$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes
cc-*。el.gzと.elcのみがあり、progmodesフォルダーにcc- .elファイルがない場合は、最初にそれらを抽出する必要があります。
$ gunzip cc-*.el
パッチを適用する前に、エラーが発生するかどうかを確認してください
$ patch --dry-run < patchfile.txt
出力が次のようになっている場合:
Hunk #1 succeeded at 9091 (offset -22 lines).
Hunk #2 succeeded at 9144 (offset -22 lines).
Hunk #3 succeeded at 11731 (offset -29 lines).
checking file cc-langs.el
Hunk #1 succeeded at 3684 (offset -9 lines).
これでパッチを適用できます
$ patch < patchfile.txt
[same output as dry-run]
パッチを適用している間、戻る必要がある場合に備えて、.origファイルがバックアップとして作成されます。
最後のステップとして、.elファイルを.elcにコンパイルする必要があります
$ emacs -Q -batch -f batch-byte-compile cc-*.el
私の出力:
Source file ‘/opt/emacs/emacs-27.1-install/share/emacs/27.1/lisp/progmodes/cc-langs.el’ newer than byte-compiled file; using older file
In end of data:
cc-styles.el:687:1:Warning: the function ‘c-guess-basic-syntax’ might not be
defined at runtime.
ここでemacsを再起動します。
出力のため([...]バイトコンパイルされた[...]よりも新しい)。ccモードのemacsでバッファを開くように求められました。
M-: c-recognize-bare-brace-inits
<Return>
エコー領域に「t」と表示されている場合は、すべて問題ないはずです。そうでない場合は、バックアップを使用して初期状態に戻すことを検討してください。
それにもかかわらず、私の場合、バグはこの方法で解決されました。修正がsourceforgeにも正式に適用され、この修正の説明が廃止されるまで、それほど時間はかからないと想像できました。