type t (* void *)

関数型言語や英語学習の事とか。

Emacsでpythonを書く環境

老人なのでemacsでプログラムを書いていますが、最近はpythonを少しだけ書く必要があったので環境の話をまとめます。
melpaにアクセスできることを想定してます。

念の為、バージョンに依存するところはないと思いますがpackage.elを使うので24以上、 私の環境は26.1です。

 ;;; package.elの初期化
 (when (require 'package)
   (add-to-list
    'package-archives
    '("melpa" . "http://melpa.milkbox.net/packages/") t)
   (package-initialize)
   )

elpy

M-x package-install elpy 殆どこれで終わる。 elpypythonを書くためのパッケージなどをまとめてインポートする全部のせextension。
以下の機能がまとめて入る。

  • 補完機能(jedi, company-mode)
  • コードのシンタックスなどのチェックツール(autopep8, flake8)などとの連携

f:id:no_maddojp:20181118005733g:plain

jedi + company-modeの例

f:id:no_maddojp:20181118005946g:plain

flake8の警告

autopep8, flake8はそのままでは入らず、自前でpipなどでインストールする。
elpyからこの手のツールがどう見えているのかはelpy-configでわかる。

f:id:no_maddojp:20181118010116g:plain

elpy-enableを事前に実行しておかなければならない。

 (when (and (require 'python nil t) (require 'elpy nil t))
   (elpy-enable))

elpyはpyenvとのかみ合わせが悪く、使っている場合はexecutableのばしょを教えてあげないといけない。 python3.6とか使いたいので教えてあげよう。

(when (require 'set-pyenv-version-path nil t)
 (add-to-list 'exec-path "~/.pyenv/shims"))

company-quickhelp

必須じゃないが、わたしはauto-completeに慣れていてcompany-modeをなるべくこれに近づけたい。
company-modeは標準ではquick-helpが表示されず下のバーに表示する。 ヘルプを見たければC-rで出すこともできるが、これで表示させることができる。

miscs....

company-modeの挙動を何とかする

company-modeはとにかくこの枠組で入力させることが想定されているっぽくて、例えば 候補にない入力をしたり候補を無視してSPCを入力しようとすると、SPCが候補を確定するアクションになってしまう。

SPCを入力したときにcompany-modeのcompleteを無視するようにする。

(defun insert-space ()
   (interactive)
   (insert-char ?\ ))
(define-key company-active-map (kbd "SPC") 'insert-space)

customize-groupからcompany-continue-commandsinsert-spaceを追加する。 これは最初からnot、つまりどの関数が実行されたらcompanyのcompletionを無視するかを指定できる。

こんなことしなくてもよさそう。

github.com

(setq company-require-match 'never)

キーバインド

python-modeC-c C-cから*Python*バッファを作ることができるが、このときの挙動を変更する。
このほうが便利。

 (define-key inferior-python-mode-map (kbd "M-p") 'comint-previous-matching-input-from-input)
 (define-key inferior-python-mode-map (kbd "M-n") 'comint-next-matching-input-from-input)

雑感

Emacsは暴力で設定が書けるから楽だにゃん。