PyCharm でファイル保存時に autopep8 で自動フォーマットしたい!
と思ったのですが、ググってもなかなか情報が出てこず・・・
苦戦しましたが解決したのでメモです
PyCharm での設定
ファイルウォッチャーという、ファイルが保存されたタイミングで任意のプログラムを実行できる機能を使って autopep8 が実行されるように設定します
https://pleiades.io/help/idea/using-file-watchers.html
1. 新規のウォッチャーを追加
設定画面から [Tools] → [File Watchers] を選択し +
ボタンをクリックします
もしメニューに File Watchers
が表示されていない場合は、同じ名前の File Watchers
というプラグインをインストールすると表示されるようになります
2. autopep8 を設定
以下の画面が表示されたらそれぞれ項目を入力します
-
File type
-
Python
を選択 - 一つ下の
Scope
を選ぶと対象とするファイルのディレクトリを制限できます
-
-
Program
-
autopep8
コマンドの場所を選択 - 例)
/hoge/bin/autopep8
-
-
Arguments
- autopep8 に渡す引数を入力
- 例)
--in-place --aggressive --aggressive $FilePath$
(optional) 3. 全てのプロジェクトで有効にしたい場合
デフォルトではファイルウォッチャーを追加したプロジェクトでのみ有効になっているので、以下のファイルウォッチャーの一覧画面で Level
を Global
に設定すると他プロジェクトでも利用できます
ファイルウォッチャーを作成したプロジェクト以外では、 Enabled
がオフになってしまっているので忘れずにオンにしましょう
(optional) 4. プロジェクト毎に別設定を利用したい場合
例えば、プロジェクトのディレクトリ直下に .flake8
を置いていて、プロジェクト毎に異なる設定を有効にしたいとします
autopep8 の引数の --global-config
にプロジェクト毎の設定ファイルのパスを渡すことで異なる設定を有効にできます
例えば以下を Arguments
に設定します
--in-place --aggressive --aggressive $FilePath$ --global-config $ProjectFileDir$/.flake8
ダメだった方法
command + s
をマクロで置き換える
以下の Q&A で書かれているように、 autopep8 実行
と 保存
をするマクロを作り、 command + s
にそのマクロをバインドする方法も試してみました
https://stackoverflow.com/questions/44483748/pycharm-pep8-on-save
ですが、これだとファイルの拡張子に関係なく全てのファイルに autopep が適用されてしまい、 yml や json のファイルが勝手に書き換わってしまうという問題が起こることが分かり即却下となりました・・・
Save Actions を使う
Save Actions というプラグインを使うと保存時にフォーマットの修正を自動で実行できます
ただこれは、 PyCharm に設定したコードフォーマットを適用するというだけなので、 autopep8 を実行するためには使えませんでした
https://plugins.jetbrains.com/plugin/7642-save-actions