TL;DR
- 症状:WindowsのVSCodeでC/C++のファイルを編集時、関連プラグインがインストールされていて、かつ「Format on Save」が有効になっているにも関わらず保存時にフォーマッタが走らない。
- 確認方法:C/C++のファイルを開いた状態で、コマンドパレットから「ドキュメントのフォーマット (Format Document)」を実行すると、右下に「write EPIPE」というエラーが出たらこれ。
- 対応: ここから、「Windows 64 bit」をダウンロードしてLLVMをインストールし、clang-formatにパスを通し、VS Codeを再起動する。
- 関連issue
詳細
もうTL;DRに書いた通りなんだけれど、WindowsのVSCodeでclang-formatが効かなくなった時の覚書。
VSCodeでC/C++のファイルを編集する際、まずC/C++のプラグインを入れると思う。ついでにClang-Formatプラグインを入れて、保存時にフォーマッタが走るようにする人も多いだろう。しかし、いつのまにかこれが動かなくなった。
具体的には、
- Windows 10
- VSCode 1.43.2
- C/C++ プラグイン 0.27.0
- Clang-Format プラグイン 1.9.0
の組み合わせで、保存時にフォーマッタが走ってくれない。
明示的にフォーマットさせるため、Ctrl+Shift+Pでコマンドパレット出して「format」と入力して「ドキュメントのフォーマット (Format Document)」を選んで実行すると、右下に「write EPIPE」というエラーが出てくる。こんなの。
調べてみると、Clang-Formatのプラグインのリポジトリに、同じ問題を報告したissueがあった。
そこに書いてあったWorkaroundが
- LLVMを入れる
というものだった。
Clang-Formatプラグインは、clang-formatが見つからないと、VSCodeのC/C++プラグインが持っているclang-formatを使う。それは
C:\Users\ユーザー名\.vscode\extensions\ms-vscode.cpptools-0.27.0\LLVM\bin\
にあるのだが、どうもこれとの連携に問題があるらしい。
そこで、 ここから、「Windows 64 bit」をダウンロードしてLLVMをインストールし、clang-formatにパスを通す。LLVMのインストール時に「全員にパスを通す」か「カレントユーザのみにパスを通す」か選べるので、それはお好みで。ただし、ここでパスを通さない場合は、プラグイン側でパスを指定してやる必要がある。
パスを通した場合、適当なターミナル(例えばWindows PowerShell)を起動し、clang-format.exeにパスが通っていることを確認する。
PS C:\Users\username> clang-format.exe --version
clang-format version 10.0.0
この状態でVSCodeを再起動すれば、次からは保存時にclang-formatが走るはず。