2019年4月5日金曜日

Emacsのpython(elpy)関係を見直し(201912up)

今回は、python関係を見直してみた。 あくまで初心者用なので、projectとかtestとかは考えてない。 補完と文法チェックが出来ればよし。

環境は、debian(buster)で、pyenvを使って3.7。 virturalenvは使わず、globalにしている。 モジュールは、pipでインスト。

emacsは26.1で、use-package + ivy + company な環境。
company-jedi は使ってない。

基本はいつもどおり、コピペ。

(201912)pyvenv, jedi-core

pipenv  から  require  されているので、pyenv だけ有効にした。(210912)

  (use-package pyvenv :ensure t)

これまで pyenv-mode を使ってたが、 elpy が pyvenv を使っているので、 今回、 pyvenv にした。

jediは、elpy-module-companyがあるので、jedi-core を インストすれば良いようだ。 elpy-module-company and company-jedi are kind of redondant( https://github.com/jorgenschaefer/elpy/issues/1397)

下の設定は無効化。

   (use-package pyvenv :ensure t
    :mode ("\\.py\\'" . pyvenv-mode)
    :interpreter ("python" . pyvenv-mode)
    :after projectile
    :config
     (use-package jedi-core :ensure t
      :config
       (add-hook 'python-mode-hook 'jedi:setup)
       (setq jedi:complete-on-dot t)
       (setq jedi:use-shortcuts nil)
    )
   )

pipenv, jedi-core(201906)

pipenv を使ってみようと、 変更してみた。 pipenv 自体の使い方は、以下など参考にしてやってみた。

これまでは、home ディレクトリ全体を、pyenv で 3.7 にしてあるだけで、 作業フォルダ毎の仮想環境は使っていなかった。

まだ、一つの作業でしか試してないが、 なんとか使えているように思う。 のだが、emacsの反応が少し遅くなった?ように感じる。

projectile は一応動いているかも、という状態で意識的に使ってないない。 まあ、プロジェクトなんて僅かだから。

  (use-package pipenv :ensure t
    :diminish (pipenv-mode . "penv")
    :hook (python-mode . pipenv-mode)
    :init
    (setq pipenv-with-projectile nil)  ;; Disable Projectile integration
    ;; まだ使い熟せてないし、理解もできてないから。
    ;; (setq
    ;;  pipenv-projectile-after-switch-function
    ;;  #'pipenv-projectile-after-switch-extended)
    :config
    (setq pipenv-with-flycheck nil)
    ;; Use the pipenv env. when searching for Flycheck executables.
    )
    ;; [updata 201912]
    ;;
    ;; (use-package pipenv :ensure t
    ;; :hook (python-mode . pipenv-mode)
    ;; :custom
    ;;  (pipenv-projectile-after-switch-function #'pipenv-projectile-after-switch-extended)
    ;; )
    ;; C-c C-p a   pipenv-activate
    ;; C-c C-p d   pipenv-deactivate
    ;; C-c C-p s   pipenv-shell

   (use-package jedi-core :ensure t
    :config
     (add-hook 'python-mode-hook 'jedi:setup)
     (setq jedi:complete-on-dot t)
     (setq jedi:use-shortcuts nil) ; M-. and M-,
   )

pipenv のメモ

ディレクトリ作成、移動、インスト

  $ mkdir hoge
  $ cd hoge

  # 仮想環境の構築
  # $ pipenv install
  $ pipenv --python 3.7,3
  # $ pipenv --python 2.7.14  Python 2.7.14 を使う

  # PipfileとPipfile.lockが作成される。
  #  + Pipfile => 設定ファイル
  #  + Pipfile.lock => インストールしたライブラリ情報

Pipenvシェルを有効化、パッケージ管理

  $ pipenv shell
  $ pipenv install pylint
  $ pipenv install --dev epc
  # pipenv install --dev XXXX   開発時しか使わないなら
  $ exit  ::停止

  # emacs で使うやつ。
  #   epc, jedi, autopep8, pylint, yapf, isort, black
  #   black は --pre が必要だった
  # Pipfile に記述して、
  #   $ pipenv update
  # で全パッケージをインスト、更新できる

python-mode

elpyを使うには python-mode が事前に有効になっている必要がある。 折り畳みは、buildinの outline-minor-mode を使っている。

Debian のパッケージでインストされる /usr/share/emacs/26.1/lisp/progmodes/python.el.gz を使うようにした。 (201908)

   ;; [add 201912]
   (add-to-list 'interpreter-mode-alist '("python3" . python-mode))
   ;;
   (use-package python-mode :ensure nil
     :mode ("\\.py\\'" . python-mode)
     :interpreter ("python" . python-mode)
     ;; :after pyvenv-mode
     :config
     (python-mode)  ;; (201912)
     (setq python-indent-guess-indent-offset-verbose nil)  ;; (201912)
     ;; Non-nil means to emit a warning when indentation guessing fails.
     ;;
     (setq electric-indent-local-mode nil)
     (setq py-smart-indentation t)  ;; new in ver 6.2.4
     ;;
     (setq electric-indent-local-mode -1)
     ;; (setq indent-tabs-mode nil)  ;; original nil  (201912)
     ;; (setq py-indent-tabs-mode nil)  ;; original nil
     ;; (setq python-indent-offset 4)  ;; default 4
     ;;

     ;; (setq python-check-command "~/.pyenv/shims/pylint")  ;; 重複、コメントアウト
     (setq python-shell-interpreter "python")  ;; (201912)
     (setq python-shell-completion-native-disabled-interpreters '("python"))  ;; (201912)
     ;; (setq python-shell-interpreter-args "-i")  ;; original "-i"
     ;;
     (flymake-mode nil)  ;; (201912)
     (outline-minor-mode t)

     (setq python-check-command "~/.pyenv/shims/pylint")  ;; (201912)
     ;;
     ;; (201912) move to eldoc config.
     ;; (eldoc-mode t)
     ;; (setq eldoc-echo-area-use-multiline-p t)
     ;; (setq eldoc-idle-delay 3)
     ;; (setq eldoc-minor-mode-string nil)
     ;; (setq python-fill-docstring-style 'pep-257) ;; original pep-257
    )

elpy(includ company)

基本の設定に、上記と、gtags があれば、初心者の私には十分だと思うが、 elpy を入れると編集が少し楽になると感じている。

   (use-package find-file-in-project :ensure t
    :after projectile
    )
   ;;

   (use-package elpy :ensure t
    :diminish (elpy-mode . "elpy")
    :after python-mode
    :hook (python-mode . elpy-enable)
    ;; ここを elpy-mode にすると、python-modeになってないと怒られる。
    ;:init
    ;(package-initialize) ;; 無くても大丈夫そう
    :config
    (elpy-mode)
    ;for emacs26.1 is a new flymake.
    (when (require 'flycheck nil t)
     (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
     (add-hook 'elpy-mode-hook 'flycheck-mode))
    (setq elpy-syntax-check-command "pylint")
    ; flake8 がうまく動いてくれないから。きっとversionが附合してない。
    ; 初心者にはpylintよりflake8が向いていると、どこかで読んだ記憶がある。
    (delete 'elpy-module-highlight-indentation elpy-modules)
    ;; elpy は https://github.com/antonj/Highlight-Indentation-for-Emacs
    ;; を使ってる。

    ;; https://www.reddit.com/r/emacs/comments/8i4x57/is_it_possible_to_disable_elpy_minibuffer_output/
    ;; Original value was when-shell-not-visible  (201912)
    (setq elpy-shell-echo-output nil)

    ;; https://github.com/jorgenschaefer/elpy/issues/1416   (201912)
    (setq elpy-eldoc-show-current-function nil)

    (outline-minor-mode t)  ;; (201912)
    (flymake-mode nil)  ;; (201912) 記入漏れ
    )

elpy-config の結果は以下。

    Elpy Configuration

    Virtualenv........: None
    RPC Python........: 3.7.3 (/home/hogehoge/.pyenv/shims/python)
    Interactive Python: python (/home/hogehoge/.pyenv/shims/python)
    Emacs.............: 26.1
    Elpy..............: 1.18.0
    Jedi..............: 0.15.1
    Rope..............: 0.14.0
    Autopep8..........: 1.4.4
    Yapf..............: 0.29.0
    Black.............: 19.3b0
    Syntax checker....: pylint (/home/hogehoge/.pyenv/shims/pylint)
  • elpy-module-company が上手く使えているのかは不明。それなりに使えていると思う。

  • shell buffer、TEST、Djangoは使ってない。

  • C-c C-r r (elpy-refactor) は rope を使うらしいが、理解できてない。

    リファクタリング (refactoring) とは、コンピュータプログラミングにお いて、プログラムの外部から見た動作を変えずにソースコードの内部構造を 整理することである。wikipedia

  • flymake は flychek のキーバインドを使う。

    elpyのキーバインドは、flycheckに対応していないようだ。

  • カーソル移動は普通。

    カーソルのブロック単位での移動は c-up/down(at the line head), right/left

  • 対象領域の移動させるのは M-up/down (elpy-nav-move-line-or-region-up/down)

    インデントは M-left/right (elpy-nav-indent-shift-left/right)

  • searchは、 counsel-git-grepdeadgrep を主に使うので、elpyの機能は使ってない?

    • c-c c-f (elpy-find-file: Find a file in the current project)
    • C-c C-s (elpy-rgrep-symbol)
    • M-TAB (elpy-company-backend)
  • naviは、 counsel-gtags を使ってるので、elpyの機能はほとんど使ってない。

    • M-. / M-* (elpy-goto-definition) (pop-tag-mark)
    • C-x 4 M-. (elpy-goto-definition-other-window)
    • C-c C-o (elpy-occur-definitions) imenu-list より見易い。
  • C-c C-d (elpy-doc) try and find the documentation for that object

  • C-c C-r f (elpy-format-code)

  • C-c C-r i (elpy-importmagic-fixup) は使えてない。

  • C-c C-e (elpy-multiedit-python-symbol-at-point)

    うまく動かない。occur を使えばよさそう。

importmagic, py-isort

import関係は、このふたつ。 importmagic は便利そうなんだが使えてない。 結局、 py-isort を叩いている。

   ;;  止め。リアルタイムで動くのは、遅くなるから。(201912)
   ;;(use-package importmagic :ensure t
   ;; :defer t
   ;; :diminish importmagic-mode
   ;; :after python-mode
   ;; :config
   ;; (add-hook 'python-mode-hook 'importmagic-mode))

   (use-package py-isort :ensure t
    :defer t
    :after python-mode
   )

highlight-indent-guides(201908up)

インデントガイドは、highlight-indent-guidesを使っている。 インデントガイドは必要だ。
elpy で使ってるやつにすればよかったかもと思ったが、 他でも使うと思うので、汎用性のあるやつとして選んだのだと思う。

(use-package highlight-indent-guides :ensure t
 :diminish highlight-indent-guides-mode
 :hook
  (prog-mode . highlight-indent-guides-mode)
  (rst-mode . highlight-indent-guides-mode)
 :config
  (setq highlight-indent-guides-method 'column)  ;; fill,column,character
  (setq highlight-indent-guides-auto-enabled t)  ;; automatically calculate faces.
)

まだ使えてないものが多いのだが、 一応、使えているような気になれてるので、 よし、としておこう。

0 件のコメント:

コメントを投稿

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...