すなぶろ

Pythonistaを目指しているつもりが、Hyのおかげで無事脱線。Clojurian目指すことになりました。

Spacemacs + Python で快適コーディング環境を整える

最近spacemacsにハマってます。「Spacemacs とはなんぞや」についてはいろんな方々が 解説してくださっているので、その魅力についてはぜひそちらをご参照ください。 かくいう私もそういった記事を読んで手を出し、そのまま戻れなくなった身です。

今回は Python のコーディング環境を整えてみます。条件は以下。

  • Python 3.6.6
  • Spacemacs (develop branch)
  • virtualenvwrapper を使用している
  • pyenv を使用している (optional)

Spacemacs + Python + LiveCoding + IPython

Spacemacs では .py という拡張子のファイルを開くだけで Python コーディング用の様々なパッケージが自動インストールされる1のですが、 pip で特定のパッケージをインストールするとさらにパワフルになります。 しかも自動で。

サポートされている機能はこんな感じです。参考: spacemacs/Python layer

  • コードの自動補完
  • ドキュメント検索
  • テスト実行
  • virtualenv のサポート
  • PEP8 互換のコードチェック・自動整形
  • 不要な import 文のハイライト
  • import 文をアルファベット順で自動ソート
  • ライブコーディング
  • REPL
  • Python で書かれた Lisp 方言 hy との互換性

.spacemacs

まずはエディタへの設定です。といっても .spacemacs ファイルに記述するのは実に 5,6 行程度 しかありません。Spacemacs を起動して SPC f e d とコマンドを打ち、設定ファイルを開きましょう。 (Emacsキーバインドを採用している人は SPCM-m に読み替えてね)

設定を加えるのは dotspacemacs-configuration-layers という変数。 こんな感じに書き加えます。

dotspacemacs-configuration-layers
 '(
   ;; ここから追記
   syntax-checking
   (python :variables
           python-enable-yapf-format-on-save t
           python-sort-imports-on-save t)
  )

syntax-checking は厳密に言うと Python とは関係ないのですが、 後述するコーディング規約に則っていない場合や、不要な import 文などを ハイライトしてくれるため、インストールしておいたほうが良いでしょう。

Python に関する設定は普通 python という行を書き加えるだけでいいのですが、 オプション( :variables )を設定するため括弧で囲んでいます。 それぞれデフォルトでは nil (無効)になっているので、不必要な場合は行ごと削除してください。

  • python-enable-yapf-format-on-save t (セーブ時にコードを整形する)
  • python-sort-imports-on-save t (セーブ時に import 文をソートする)

書き加えたら SPC f e R で再読込します。

ディレクトリごとに設定を変える

Emacs の標準機能でディレクトリごとに設定を上書きすることができるので、 「 team/project/ 以下では import 文をソートしたくない!」という場合は、 team/project/.dir-locals.el というファイルに以下のように記述します。

((nil . ((dotspacemacs-configration-layers
          '((python :variables
                    python-sort-imports-on-save nil))))))

インデント幅などを設定することも可能なので、 プロジェクトでコーディング規約を共有している場合は便利でしょう。

試してみる

準備

ここからは実際に手を動かしながら確かめてみます。 サンプルとしては fizzbuzz あたりが良いでしょうか。

# プロジェクトディレクトリの作成
mkdir fizzbuzz
cd fizzbuzz

# 使用する Python バージョンを指定
# .python-version は Spacemacs が自動的に読み込んでくれます
pyenv local 3.6.6

# virtualenv の作成(要 virtualenvwrapper)
mkvirtualenv fizzbuzz

# .venv というファイルに記述しておくと
# .py ファイル読み込み時に自動的に activate してくれます
echo fizzbuzz > .venv

# Python パッケージのインストール
# 自動補完
pip install jedi json-rpc service_factory importmagic epc
# コーディング規約チェック
pip install flake8 yapf futures
# 不要な import 文のハイライト
pip install autoflake
# REPL 強化
pip install ipython

意外と量がありますね。実はこれでも省略しているほうで、Python コードにコンパイルできる Lisp 方言 hy と連携することができるなど、 python レイヤーをインストールするだけで様々な機能が有効になります。

pip install しないと Python コードは書けないの?

そんなことはありません。 Spacemacs は「Python パッケージがあれば利用する。なければ何もしない」というスタンスなので、Python パッケージをなにひとつインストールしなくても、インデントやカラーなどの恩恵を受けることができます。 例えば ipython がインストールされていなかった場合、代わりに python -i が REPL として実行されます。

コードを書いてみる

Spacemacs で SPC f f とし、 fizzbuzz/fizzbuzz.py を開きます。

.python-version (pyenv) と .venv (virtualenvwrapper) が正しく設定されていれば、 ファイルを開いたタイミングで自動的に各種機能が有効になります。 .venv ファイルは手動で用意しなければならないので、そこだけ注意といったところでしょうか。

Spacemacs + Python + LiveCoding + IPython

上図は SPC m l でライブコーディング2の結果を右上に表示し、 SPC m s i で REPL3 を左下に表示しながらコーディングしている様子です。

下線が引いてあるところはコーディング規約的に NG であったり、 実行時にエラーになるところだったり様々ですが、 yapf がインストールされていれば保存時に整形してくれるので、 ある程度ラフに書けるんじゃないかと思います。4

また、コードの自動補完により、 os.path モジュールの候補が表示されています。 fizzbuzz とは何の関係もないコードですが、とりあえず紹介ということで……。

他にも Python モード固有の機能を Spacemacs から呼び出したい場合は、 SPC m とコマンドを打てば候補がリストアップされます。 さらにその状態で詳しいヘルプが欲しい場合は C-h C-h とすると コマンド一覧が(英語で)出てきますので、あとはもう慣れだと思います。

まとめ

ここまで Spacemacs の Python レイヤーを駆け足で紹介してきました。Python バッファで SPC m するとわかりますが、他にも便利機能がたくさんあります。

カーソルの下にある関数定義を REPL にまるっと送ったり、 テストをメソッド単位で実行したりと、私もまだまだ使いこなせていないのが現状です。

でも今回行ったことといえば、以下の 2 つだけです。

  • .spacemacsPython レイヤーを追加する
  • pip install する

裏側ではコード補完用のサーバが起動したり、文法チェックのたびに Python が走ったりと 非常に複雑な処理が行われていますが、エンドユーザーである我々は実装を見ることなく、 ただ「便利だ」と感じるだけで透過的に機能を利用できています。

これが従来の Emacs だったらパッケージの設定だけで一日が終わっていたものですが…… Spacemacs、キュートです。

参考リンク