flycheck に移行

flymake は重いし、警告が多いと Emacs 毎ハングアップするので、
flycheck に移行しました。

基本設定

;;; flycheck
(setq lsp-prefer-flymake nil)
(defun tnoda/turn-on-flycheck-mode ()
  (flycheck-mode 1))
(add-hook 'python-mode-hook 'tnoda/turn-on-flycheck-mode)

これだけです。
flake8 は別途インストールして、パスが通ってるディレクトリに置いてください。
特に設定は必要なくて flycheck がパスから探して flake8 を実行してくれます。

しかし flymake が動いてしまうので python-mode-hook で息の根を止めますw

(add-hook 'python-mode-hook
          #'(lambda ()
             (setq indent-tabs-mode nil)
             (which-function-mode 1)
             (setq indent-level 4)
             (setq python-indent 4)
             (setq tab-width 4)
             (elpy-enable)
             (elpy-mode)
             (flymake-mode 0) ; ←これ
             ))

また、python-mode 用に (which-function-mode 1) をしないとカーソル位置の関数/メソッド名が表示されないので、これも pyhon-mode-hook に書いておくと良いです。

いろいろと flycheck 使っている方の設定を拝借していますがwww
次は追加の設定です。警告は「◆」、エラーは「✕」を左端の部分に表示します。
ここってなんて呼ぶんだろうw わかりませんw

(define-fringe-bitmap 'my-flycheck-fringe-indicator
  (vector #b00000000
          #b00000000
          #b00000000
          #b00000000
          #b00000000
          #b00001000
          #b00011100
          #b00111110
          #b01111111
          #b00111110
          #b00011100
          #b00001000
          #b00000000
          #b00000000
          #b00000000
          #b00000000
          #b00000000))

(define-fringe-bitmap 'my-flycheck-fringe-indicator2
  (vector #b00000000
          #b00000000
          #b00000000
          #b00000000
          #b01000001
          #b01100011
          #b00110110
          #b00011100
          #b00011100
          #b00011100
          #b00110110
          #b01100011
          #b01000001
          #b00000000
          #b00000000
          #b00000000
          #b00000000))

(flycheck-define-error-level 'error
  :overlay-category 'flycheck-error-overlay
  :fringe-bitmap 'my-flycheck-fringe-indicator2
  :fringe-face 'flycheck-fringe-error)

(flycheck-define-error-level 'warning
  :overlay-category 'flycheck-warning-overlay
  :fringe-bitmap 'my-flycheck-fringe-indicator
  :fringe-face 'flycheck-fringe-warning)

(flycheck-define-error-level 'info
  :overlay-category 'flycheck-info-overlay
  :fringe-bitmap 'my-flycheck-fringe-indicator
  :fringe-face 'flycheck-fringe-info)

(set-face-foreground 'flycheck-fringe-error "red")
(set-face-foreground 'flycheck-fringe-warning "orange2")
(set-face-foreground 'flycheck-fringe-info "lightblue")

最後は、これも追加設定ですが、警告・エラー部分の表示の仕方を変更します。

(set-face-attribute 'flycheck-error nil :foreground "red" :bold t :underline '(:color "red"))
(set-face-attribute 'flycheck-warning nil :foreground "red" :bold t :underline '(:color "red"))

しかし、警告表示がおかしくなっているようなので表示しません。