vim の C プリプロセッサ ディレクティブを他のステートメントと同じインデントにする 質問する

vim の C プリプロセッサ ディレクティブを他のステートメントと同じインデントにする 質問する

一般的な情報

(注: 全体を最後まで読んでください。私が抱えている個々の問題に対処し、提案された解決策がなぜうまくいかないのかを確かめるために、少し時間をかけて整理しました。)

私は、自動的にインデントを行うために、vimでcindentを使用しています。ほとんどの場合、うまく機能します。しかし、cindentには3つの欠点があります。悪いこと(私の意見では) C プリプロセッサ ディレクティブ (ハッシュ ('#') で始まるステートメント) が関係します。

関連がある場合、インデントにはタブを使用しており、.vimrc には が含まれていますfiletype indent on

悪いこと1

プリプロセッサディレクティブを入力するとすぐに、vim はそれを 1 列目に配置します (完全にインデントを解除します)。たとえば、vimが私のコードに何をするかはこれです私が入力している通り:

int main(void)
{
    while(1) {
        /* normal things */
#ifdef DEBUG
        printDebugInfo();
#endif
        /* normal things */
    }
}

しかし、こんな感じにしたい:

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}

言い換えれば、vim がプリプロセッサ ディレクティブを他の C/C++ ステートメントと同じように扱うことを希望します。

悪いこと2

プリプロセッサディレクティブのある行に==(または行をまたいで)使用すると、[movement]=vimはそれを1列目に戻します(これは悪いこと 1 と一致していますが、それでも問題があります。)

悪いこと3

(悪い点1または2、またはの使用により<<)プリプロセッサ指令が列1に来る場合、そこに「引っかかる」および は の影響を受けません>>。インデントを増やす唯一の方法はI<Tab>またはですi<Ctrl-t>。そうすると「スタック解除」され、<<またはを使用して移動できるようになります>>

失敗した解決策

一つの解決策set cinkeys-=0#私の を入れることを提案します.vimrc。これ修正悪いこと1 - 3、しかし、新しいものを追加する:

悪いこと4( のみcinkeys-=0#

プリプロセッサディレクティブ1列目==またはの影響を受けないため、または タブ文字を挿入して[movement]=手動でインデントするまで、インデントを自動的に修正することはできません。>>

質問

悪いこと 4 を起こさずに悪いこと 1 - 3 を解決する方法はありますか?'#' で始まる行を通常の C ステートメントのように扱うように vim に強制できますか?

(それとも、私が#ifdefs を有害な方法で使用していて、これが vim がそれをやめるように指示しているのでしょうか?)

私は vim にパッチを適用したり再コンパイルしたりしたくないのですが、必要な場合はそうします。

ベストアンサー1

からVim ドキュメント、cinoptions の下:

Vim は次の場合に列 1 に行を配置します:

  • 'cinkeys' に '#' が含まれている場合、'#' (プリプロセッサ ディレクティブ) で始まります。
  • ラベル (「case」と「default」以外の、':' が続くキーワード) で始まり、'cinoptions' には正の値を持つ 'L' エントリが含まれていません。
  • インデントを任意に組み合わせると、行のインデントが 0 未満になります。

したがって、0#から削除するとcinkeys、デフォルトの動作が上書きされるはずです。(このアイデアは、インターネット上で

set cinkeys=0{,0},0),:,!^F,o,O,e

cinkeys への変更により、まさにあなたが探していたものが得られる結果は次のとおりです。

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}

おすすめ記事