今回は、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-grep 、 deadgrep を主に使うので、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.
)
まだ使えてないものが多いのだが、
一応、使えているような気になれてるので、
よし、としておこう。