Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

と思ったのですが、ググってもなかなか情報が出てこず・・・
苦戦しましたが解決したのでメモです

PyCharm での設定

ファイルウォッチャーという、ファイルが保存されたタイミングで任意のプログラムを実行できる機能を使って autopep8 が実行されるように設定します
https://pleiades.io/help/idea/using-file-watchers.html

1. 新規のウォッチャーを追加

設定画面から [Tools] → [File Watchers] を選択し + ボタンをクリックします

もしメニューに File Watchers が表示されていない場合は、同じ名前の File Watchers というプラグインをインストールすると表示されるようになります
autopep2.png

2. autopep8 を設定

以下の画面が表示されたらそれぞれ項目を入力します

  • File type
    • Python を選択
    • 一つ下の Scope を選ぶと対象とするファイルのディレクトリを制限できます
  • Program
    • autopep8 コマンドの場所を選択
    • 例) /hoge/bin/autopep8
  • Arguments
    • autopep8 に渡す引数を入力
    • 例) --in-place --aggressive --aggressive $FilePath$

autopep1.png

(optional) 3. 全てのプロジェクトで有効にしたい場合

デフォルトではファイルウォッチャーを追加したプロジェクトでのみ有効になっているので、以下のファイルウォッチャーの一覧画面で LevelGlobal に設定すると他プロジェクトでも利用できます
ファイルウォッチャーを作成したプロジェクト以外では、 Enabled がオフになってしまっているので忘れずにオンにしましょう
autopep3.png

(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

scouty
「あらゆる事象を必然化し、 世の中のミスマッチをなくす」ことをミッションとし、AIヘッドハンティングサービスを開発・運営するスタートアップ
https://lapras.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away