一般的な情報
(注: 全体を最後まで読んでください。私が抱えている個々の問題に対処し、提案された解決策がなぜうまくいかないのかを確かめるために、少し時間をかけて整理しました。)
私は、自動的にインデントを行うために、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 に強制できますか?
(それとも、私が#ifdef
s を有害な方法で使用していて、これが 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 */
}
}