ししちにじゅうはち 4x7=28

よんたったー https://twitter.com/keita44_f4

elpyの設定メモ

Emacsにelpyを設定して四苦八苦した結果をメモ。
他にも苦しんでる人のために。
必要なPython環境をWindowsに用意する方法は前エントリを参照。

苦しんだ点とかまとめ

  • elpyはpython modeと一緒に動くメジャーモード
    • key-mapについて
      • python modeとelpy modeのkey-mapは別々に存在する
      • elpy起動時にpython modeのkey-mapをelpy modeのそれで上書きする
      • ショートカットの設定はelpy側のkey-mapに設定する
    • elpyの起動について
      • .pyファイルに対してpython modeとelpy modeの両方をオンしないといけない
      • python-mode-hookにelpyの起動をねじ込んだ
  • elpyの起動には(package-initialize)がいる

参考になったところ

設定したEmacsの設定ファイル(init.el)

;;; python mode
(add-hook 'python-mode-hook
          '(lambda ()
             (setq indent-tabs-mode nil)
             (setq indent-level 4)
             (setq python-indent 4)
             (setq tab-width 4)
             (package-initialize)       ; なぜかこれが無いとelpyが動かない
             (elpy-enable)
             (elpy-mode)
             ))

;;; elpy mode
;; pythonのrope、jediのパッケージを入れておくこと
;; 公式はさらにflake8、importmagic、autopep8、yapfを推奨している
(add-hook 'elpy-mode-hook
          '(lambda ()
             (elpy-use-ipython)
             ;; quickrunをC-cC-cに設定
             (define-key elpy-mode-map "\C-c\C-c" 'quickrun)
             ;; company-mode + rope/jediを使うためautocompletionをオフ
             (auto-complete-mode -1)
             ; companyによる補完のキーマップを設定
             (define-key company-active-map (kbd "\C-n") 'company-select-next)
             (define-key
               company-active-map (kbd "\C-p") 'company-select-previous)
             (define-key
               company-active-map (kbd "\C-d") 'company-show-doc-buffer)
             (define-key
               company-active-map (kbd "<tab>") 'company-complete)
             ))

;;; py-autopep8
;; pythonのautopep8のパッケージを入れておくこと
(add-hook 'python-mode-hook 'py-autopep8-enable-on-save)

;;; python flymake
;; pythonのpyflakesのパッケージを入れておくこと
(require 'tramp-cmds)
(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
     ; Make sure it's not a remote buffer or flymake would not work
     (when (not (subsetp (list (current-buffer)) (tramp-list-remote-buffers)))
      (let* ((temp-file (flymake-init-create-temp-buffer-copy
                         'flymake-create-temp-inplace))
             (local-file (file-relative-name
                          temp-file
                          (file-name-directory buffer-file-name))))
        (list "pyflakes" (list local-file)))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))
(add-hook 'python-mode-hook
          (lambda ()
            (flymake-mode t)))

苦しんだ話

  • 最初は、2つ目の.pyファイルを開かないとelpyがenableにならなかった。
  • さらに、python modeでquickrunのショートカットを設定したせいで、elpyが起動するとquickrunが動かないように見えた
  • elpyのバグかと思って見てたら、お互いのショートカットが別々に存在していた。
  • elpyではC-cC-cをpython-shell-send-bufferとやらで上書きしていて、c\:/〜/ipython.exeなる謎のエスケープが入ったipythonが呼ばれてて混乱した。