C ++モード、インデンデーションの混乱

Aug 16 2020

今日、私は気になる奇妙なことに気づきました。これが私が書いた関数の小さな例です。私はアルマジロを使用していますが、それは重要ではありません。ここでは、インデントは問題なく表示されます。

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);
}

今、私は長い間の初期化を見つけるE2E3迷惑をので、私はより良い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文E2E3。これは最初の例では当てはまりませんでした。私の素人の考えでは、最後の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が変数として認識しない結果であると思います。誰かもこれを観察しましたか?

ここに説明のためのスクリーンショットがあります

回答

Andi Aug 31 2020 at 01:08

さて、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にも正式に適用され、この修正の説明が廃止されるまで、それほど時間はかからないと想像できました。