26 Mar 2018, 20:38

Emacsでデータサイエンス用環境構築(Python)

はじめに

肥大化してデブになった emacs設定を一旦捨て去り、一から作り直すことにした。

デブは自分のお腹だけで十分だ!(名言)

Motivation

以前は、こんな感じの設定ファイルを作っていたのだけれども、複雑になりすぎた。

また、データサイエンスをやるにつれて、以下のようなことがあり、Emacsを使いたくなってきた。

  • 自宅サーバにsshで自習室からつないで作業することが多いので、Pycharm使えない。
  • Jupyter Notebookを使うことが多いが、Jupyter Notebookでは、スクリプトかけない。
  • 今まで素の Emacsでしのいできたのだけれども、辛くなってきた。
  • ターミナルかっこいい\(o)/

目指す姿

  • データサイエンス、もっと言えばPythonに特化した環境を作りたい
  • 軽い環境を作りたい
  • できるだけシンプルにしたい

Environment

  • Ubuntu 16.04
  • Python 3.6(Anaconda)
  • Emacs 25.x

最新版Emacsを投入

まずは、Ubuntuに25系のversionをインストールする。

sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
sudo update-alternatives --config emacs

リポジトリ & 設定ファイルを作成

.emacs.dを gitで世代管理して、githubにバックアップしたい。まずは、emacs用のリポジトリを作成。

init.elも作成。ここを参考にして、カスタムディレクトリを起点に起動できるように記述。

(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

続いて、このリポジトリを利用して起動するためのスクリプトを作成して、パスの通ったところに置く。

#!/bin/bash                                                                                                                                                                                                          
emacs -nw -q -l /home/tsu-nera/dotemacs-for-data-science/init.el $1

パッケージ管理をどうするか?

以前はuse-packageを使っていた。しかし、今回はシンプルにしたいので、デフォルトで搭載されているパッケージ管理ツール package.elを使うことにする。以下の記事によると、25.1からはインストールされたパッケージが package-selected-package 変数に保持されるようになったらしい。

以下の設定を inti.elに書くことで、custom.elに設定を吐き出すようにする。

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

package-installでインストールできるパッケージを増やすために、リポジトリを追加する。

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(fset 'package-desc-vers 'package--ac-desc-version)
(package-initialize)

Python開発環境

ここからが本番! データサイエンスのために Python開発環境を整える。過去記事を参考に(古くてあまり参考にならないですが)、設定を書いていく。

python-mode - メジャーモード

メジャーモードはデフォルトの pythonパッケージではなく、python-modeをつかう。なんとなく。

(require 'python-mode)
(add-to-list 'auto-mode-alist '("\\\.py\\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

flycheck, flake8 – 静的解析

Pythonの静的解析ツールとして flake8, それをつかうためのインタフェース flycheckを入れる。

pip install flake8

python-modeのときだけ有効。

(defun tnoda/turn-on-flycheck-mode ()
  (flycheck-mode 1))
(add-hook 'python-mode-hook 'tnoda/turn-on-flycheck-mode)

jedi – 自動補完

jedi は pythonのための 自動補完ツール。

pip install jedi


(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)

jedi は Emacsの補完ツール , auto-completeを使っているので、その設定もしておく。

(require 'auto-complete-config)
(ac-config-default)
(global-auto-complete-mode t)

yapf – 自動フォーマット

自動でいい感じに整形してくれるツールを入れる。autopep8という古参なツールもあるけれども、新しい方を採用。

pip install yapf


;; py-yapf - auto format                                                                                                                                                                                             
(require 'py-yapf)
(add-hook 'python-mode-hook 'py-yapf-enable-on-save)

ひとまず完成した init.el