Edited at

PyCharm でファイル保存時に autopep8 で自動フォーマットしたい!


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. 全てのプロジェクトで有効にしたい場合

デフォルトではファイルウォッチャーを追加したプロジェクトでのみ有効になっているので、以下のファイルウォッチャーの一覧画面で LevelGlobal に設定すると他プロジェクトでも利用できます

ファイルウォッチャーを作成したプロジェクト以外では、 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