VS CodeでC#を書いていると、Enterを押した瞬間に意図せずコード全体が整形され、カーソルが飛び、差分が膨らむ――そんな厄介な現象に悩んでいませんか。本記事は「次の行へ移動」だけを行い、自動整形を完全に止めるための具体策と、再発を防ぐための設定体系・原因切り分けのコツまでを丁寧に解説します。今日から快適なコーディング体験を取り戻しましょう。
現象の正体と仕組みを理解する(なぜEnterで整形が走るのか)
VS CodeのC#編集でEnter時に整形が起きる主因は、エディタ本体の「オンタイプ整形(on-type formatting)」と、C#拡張が提供するフォーマッタの挙動が組み合わさって発生するためです。オンタイプ整形は、}や;、改行(Enter)など特定キー入力をトリガーに、フォーマッタが「正しいコードスタイル」に近づけるための書き換えを行います。さらに、保存時整形や貼り付け時整形、コードアクション(source.fixAllやorganizeImports)が有効だと、Enter以外のタイミングでも整形され、原因の切り分けが難しくなります。
まずは仕組みを理解し、「どのトリガーを止めれば、期待する動作(Enter=改行のみ)になるのか」を的確に特定することが重要です。
最短で止める:まずはGUIから設定を変更する
VS Codeの設定UIから、Enter時の自動整形をオフにする最短手順です。以下はWindows/Linux基準ですが、macOSはCtrlの代わりに⌘(Command)を使ってください。
- 設定を開く
ショートカット:Ctrl + ,
または メニュー → ファイル → 基本設定 → 設定 - C#に絞り込む
設定画面右上の「設定をフィルター」でC#を選ぶか、検索ボックスに@lang:csharpと入力します。 - 該当トグルをオフにする
Workspace ▶︎ [C#]タブで、少なくとも以下を確認します。- Format On Type(タイプ時に整形):オフ
- Format On Enter(改行時に整形):オフ(※一部バージョン・構成では個別の設定が表示されない場合があります。その場合は
Format On TypeをオフにすればEnterも抑止されます)
この段階で多くの環境ではEnter時の整形が止まります。止まらない場合は、他のトリガー(保存・貼り付け・コードアクション)の影響を疑い、次章以降の対策へ進んでください。
設定ファイル(settings.json)で一気に止める(上級者向け・確実)
UIで探すより、確実に効かせたい方はsettings.jsonに直接記述します。言語別セクションに限定しておけば、C#以外の言語に影響を与えません。
"[csharp]": {
"editor.formatOnType": false,
"editor.formatOnEnter": false, // 環境によっては無い場合あり。その場合は削除してOK
"editor.formatOnPaste": false, // ついでに貼り付け時整形も無効化
"editor.formatOnSave": false // 保存時整形も一旦無効化(必要に応じて後で戻す)
}
追加・変更方法:設定画面右上の{}(JSONを開く)アイコンからsettings.jsonを開き、上記を貼り付けます。ワークスペース固有の問題なら、.vscode/settings.jsonに記述しましょう(プロジェクトに同梱でき、チームでも再現性が保てます)。
Enter以外の「別トリガー」で整形されていないかを確認する
Enterを止めても「いつの間にか整形されている」場合、以下の設定を確認します。
| 設定キー | 役割 | 一時推奨値 | 備考 |
|---|---|---|---|
editor.formatOnSave | 保存時に整形 | false | Enter問題の切り分けが済むまでオフ推奨 |
editor.formatOnPaste | 貼り付け時に整形 | false | 差分が増える原因になりやすい |
editor.codeActionsOnSave | 保存時コードアクション | 必要最小限に | source.fixAll等で整形相当が走ることあり |
editor.defaultFormatter | 既定フォーマッタ | 慎重に選択 | 他の拡張(CSharpier等)に切り替わっていると想定外の整形が起こる |
代表的なcodeActionsOnSave例と対処:
"editor.codeActionsOnSave": {
"source.fixAll": false,
"source.organizeImports": false,
"source.fixAll.style": false
}
.editorconfigの影響を見直す(VS Codeより強いことがある)
C#では、.editorconfigがフォーマット・スタイルの最上流として効くケースがあります。プロジェクト直下やリポジトリ上位に置かれた.editorconfigが、VS Code側の設定より優先されるシナリオがあるため、Enter停止の最終盤でここを確認するのが鉄則です。
特に有名なのが、「Fix formatting」に該当するルールの無効化です。次のような設定で、整形提案や自動修正の圧力を弱められます。
# .editorconfig(抜粋)
root = true
[*.cs]
# フォーマット違反(IDE0055)の提案を弱める / 無効化
dotnet_diagnostic.IDE0055.severity = none
# 代表的な改行・改括弧のスタイル例(必要に応じて)
csharp_new_line_before_open_brace = all
csharp_prefer_braces = true:suggestion
ポイント:
IDE0055は「フォーマット修正」を広く指す診断IDです。noneにすると、保存やコードアクションで自動的に整形されにくくなります。- チームでスタイルを維持したい場合は、Enter時だけ止め、保存時整形は残すなど「目的別」に切り分けましょう。
拡張機能固有の設定も必ずチェックする
VS CodeでC#を扱う拡張は複数あります。代表的なものと確認箇所は以下の通りです(名称や配置はバージョンにより変わることがあります)。
| 拡張 | 確認ポイント | Enter時挙動への影響 |
|---|---|---|
| C#(Microsoft公式) | 拡張機能の設定にあるFormat On Typeやフォーマッタ有効化のトグル、既定フォーマッタの選択 | オンタイプ整形の主体。ここをオフにするとEnter由来の整形が止まる |
| OmniSharp(旧来のC#拡張) | 拡張機能の設定 → フォーマット関連、omnisharp.*設定、EditorConfigサポートの有効/無効 | バージョンによって設定名が異なる。Format On Typeを明示的にオフに |
| CSharpier等のフォーマッタ | 「既定フォーマッタ」が切り替わっていないか、オンタイプを提供していないか | 拡張側がオンタイプ整形に対応しているとEnterで整形される |
| Razor/Blazor関連(.razor) | [razor]セクションのeditor.formatOnTypeや拡張設定 | .razorファイルは言語IDが異なるため、[csharp]だけでは止まらない |
拡張機能ビューからC#拡張の歯車アイコン → 拡張機能の設定を開き、拡張側にも同名・類似名のトグルが存在しないかを必ず確認してください。
「ユーザー設定」と「ワークスペース設定」の優先度を理解する
Enterの挙動がプロジェクトによって違って見えるのは、設定の適用範囲が異なるためです。
| 層 | 保存場所 | 適用範囲 | 備考 |
|---|---|---|---|
| デフォルト | アプリ内 | 全体 | VS Code本体の既定値 |
| ユーザー | ユーザー設定 | 全プロジェクト | 個人の好み。まずここで止めても良い |
| ワークスペース | .vscode/settings.json | 対象プロジェクト | チームで再現性を持たせるのに最適 |
| フォルダー | マルチルートの各フォルダー | 該当フォルダーのみ | 複雑なリポジトリで注意 |
| 言語別 | "[csharp]": { ... } | C#のみ | 他言語へ影響を出さずに制御可能 |
Enter問題に限定して確実に止めたい場合は、ワークスペースの言語別セクションでオフにするのが最も安全です。
Razor(.razor)やテストコードでも止める:言語別セクションを重ねる
ASP.NET CoreのRazorファイルはC#とHTMLが混在し、言語IDがrazorとして扱われます。[csharp]だけでは止まらないため、[razor]側にも同じ指定を追加します。
"[razor]": {
"editor.formatOnType": false,
"editor.formatOnEnter": false
}
同様に、Unity等の特殊テンプレートや生成コードに関わる拡張がある場合も、該当する言語ID・ファイルグロブに合わせて調整しましょう。
確実に再現・検証するためのミニマム手順
- 新規フォルダーを作成し、VS Codeで開く。
.vscode/settings.jsonを作成し、以下を貼り付ける:{ "[csharp]": { "editor.formatOnType": false, "editor.formatOnEnter": false, "editor.formatOnPaste": false, "editor.formatOnSave": false } }Program.csを作成して数行のコードを書く。- Enterを押し、意図しない整形が止まっているか確認する。
- 必要なら
editor.formatOnSaveだけをtrueに戻し、保存時の最終整形だけ許可するなど、目的別に段階的に戻していく。
「Enterだけ改行したい」ための実践Tips
- 改行だけ入れたいのに整形される:
editor.formatOnTypeをオフに。 - 行を上下に追加したい:Ctrl+Enter(下に行を追加)、Shift+Enter(上に行を追加)。(多くの環境で整形トリガーより先に挿入が実行され、体感が改善します。整形そのものは設定で止めておくのが確実)
- 補完の確定で整形が走る気がする:補完確定時の改行挿入とオンタイプ整形が連動している可能性があります。
editor.formatOnType・拡張のフォーマッタ設定を見直してください。
チームでの運用:Enterは止める、保存で整える
「書いている最中は崩れない」ことと「コミット前はそろう」ことを両立する王道パターンを紹介します。
- ワークスペースの
.vscode/settings.jsonで、C#のformatOnTypeとformatOnEnterをfalseにする。 editor.formatOnSaveはtrueに戻す(Enter時のストレスは無く、保存時にだけ整う)。.editorconfigでチームの最低限のスタイル(改行・括弧・スペース等)を定義する。- CIの前処理で
dotnet format(またはチーム規定のフォーマッタ)を実行して最終整合性を担保する。
この運用だと、編集体験は静かに、差分はきれいにを両立できます。
ありがちなつまずきと回避策
- UIでオフにしたのに止まらない:ユーザー設定ではなく、ワークスペースやリモート(WSL/コンテナ)側の設定に上書きされている可能性。対象の
.vscode/settings.jsonを確認。 - .editorconfigが勝ってしまう:リポジトリの上位階層に別の
.editorconfigがあると合成されます。root = trueの位置やdotnet_diagnostic設定を見直す。 - 別フォーマッタが既定になっていた:コマンドパレットの「Format Document With…」で既定フォーマッタを確認し、意図しない拡張(CSharpierなど)を既定から外す。
- Razorだけ止まらない:
[razor]セクションを追加。 - Enterで整形が止まったらインデントも効かなくなった:
editor.autoIndentの設定も確認。整形と自動インデントは別機能です。
診断を一気に進めるチェックリスト
| チェック項目 | 期待する設定 | 確認場所 |
|---|---|---|
| オンタイプ整形 | [csharp].editor.formatOnType = false | settings.json / 設定UI |
| 改行時整形 | [csharp].editor.formatOnEnter = false(あれば) | settings.json / 設定UI |
| 保存時整形 | [csharp].editor.formatOnSave = false(切り分け中は) | settings.json / 設定UI |
| 貼り付け時整形 | [csharp].editor.formatOnPaste = false | settings.json / 設定UI |
| コードアクション | editor.codeActionsOnSave最小化 | settings.json |
| 既定フォーマッタ | 意図した拡張のみ | コマンド「Format Document With…」 |
| .editorconfig | IDE0055のseverity調整 | .editorconfig |
| Razor | [razor]にも同様の設定 | settings.json |
安全に元へ戻すための「段階的ロールバック」
Enter問題が解消したら、以下の順で必要最小限の自動整形を復活させると安全です。
- まず
editor.formatOnSaveだけをtrueに戻す(書いている最中は静かを維持)。 - 差分が過大でなければ、
source.organizeImportsのみ有効にする。 - 最後までEnterが気にならないようなら、
editor.formatOnTypeはオフのままにする。
ケーススタディ:大規模リポジトリでの「Enter暴発」鎮静化
あるモノレポでは、C#以外にTypeScriptやPythonも共存し、複数のフォーマッタ拡張がインストール済みでした。Enterでの暴発整形の原因はC#拡張のオンタイプ整形と、保存時のsource.fixAllが複合的に作用していたこと。対処は以下の3点です。
.vscode/settings.jsonで[csharp]のformatOnType・formatOnEnterを停止。editor.codeActionsOnSaveからsource.fixAllを除外し、organizeImportsのみ残す。.editorconfigでIDE0055のseverityをsuggestionに緩和。
結果、Enter時の整形は止まり、保存時に最小限の輸入整理だけ行われる状態へ。レビューの差分は小さく保たれ、開発速度も改善しました。
トラブルシュートのフロー(言語横断で使える)
- 言語別セクションで
formatOnType・formatOnEnterをオフ。 - formatOnSave / formatOnPasteを一時的にオフ。
- codeActionsOnSaveを空にして検証。
- 既定フォーマッタが意図通りか確認。
- .editorconfigの
IDE0055を緩和または無効化。 - Razorなど別言語IDも個別に対処。
- 改善したら、保存時やインポート整理だけ段階的に戻す。
サンプル:実運用で使える設定セット
編集中は静か、保存時に揃える
{
"[csharp]": {
"editor.formatOnType": false,
"editor.formatOnEnter": false,
"editor.formatOnPaste": false,
"editor.formatOnSave": true
},
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
}
チーム優先(Enter停止+CIで最終整形)
{
"[csharp]": {
"editor.formatOnType": false,
"editor.formatOnEnter": false,
"editor.formatOnPaste": false,
"editor.formatOnSave": false
}
}
# .editorconfig(チーム標準)
root = true
[*.cs]
dotnet_diagnostic.IDE0055.severity = suggestion
csharp_new_line_before_open_brace = all
キーバインド派のための補助ワザ
設定切り替えに加え、キーバインドで体験を最適化できます(例)。
- 下に行を追加:
Ctrl+Enter(editor.action.insertLineAfter) - 上に行を追加:
Shift+Enter(editor.action.insertLineBefore) - 「ドキュメントのフォーマット」は必要な時だけコマンド実行(既定:
Shift+Alt+F)
根本対策は設定側ですが、日々の編集で「改行だけ素早く挿入したい」場面では大きな助けになります。
まとめ:Enterのストレスをゼロにして、書くことに集中する
EnterでC#が自動整形されるのは、オンタイプ整形とフォーマッタ、そして保存時の各種自動処理が重なって起きる現象です。解決の最短経路は、
- 言語別([csharp])で
editor.formatOnTypeとeditor.formatOnEnterをオフ - 保存・貼り付け・コードアクション由来の整形を一時停止し、影響範囲を切り分ける
- .editorconfigでIDE0055などの診断を適切にコントロール
- 拡張機能側の同名設定や既定フォーマッタの選択を再確認
これらを実施すれば、Enterは「単なる改行」に戻り、手癖のままに素早くコードを書けるようになります。最終的な整形は保存時やCIに委ね、編集体験とコード品質の両立を実現しましょう。
付録:本記事の手順(抜粋・クイックリファレンス)
- 設定を開く(Ctrl+,)
@lang:csharpで絞り込み- Format On Typeと必要ならFormat On Enterをオフ
- 動かなければ
settings.jsonを直接編集:"[csharp]": { "editor.formatOnType": false, "editor.formatOnEnter": false } - 保存・貼り付け・コードアクションの整形を一時停止
.editorconfigのIDE0055を見直す- 拡張機能の歯車からフォーマット関連設定を確認

コメント