2021年8月29日日曜日

Emacs の lsp の設定、なう。

Emacs に LSP を入れてみて、そう、4ヶ月ほどになるだろうか。 まあ、私の使い方なら、それなりかと思えるようになったので、 一区切りという意味で、晒してみる。

  • 環境は、Debian(bullseye)+emacs(27.1)。ivy + company。
  • lsp は、 python と shell で使用。将来の希望で、rustも入れている。
  • lsp は lsp-mode で、python のクライアントは、lsp-pylsp。 shell は bash-language-server。
  • lsp-pyls から lsp-pylsp になる時期だったらしく、戸惑った記憶あり。
  • flymake ではなく、flycheck。設定は lsp まかせ。 この flycheck が、なんか馴染めない。 きっと使い方が分ってないのだと思うが放置状態。
  • 補完は、lsp ではなく、company を直接使ってる、はず。 cpmpany-ispell がうまく動かせなかったのが理由。そのうち、再挑戦しよう。
  • フォールディングは、origami。
  • indent、整形は、auto で動くやつは使わない。 python では使わないものだ、とか、どこかで見た記憶。
  • lsp-ui-peak は、一応設定してあるというレベル。
;; lsp-mode

(leaf lsp-mode :ensure t
  :url "https://github.com/emacs-lsp/lsp-mode"
  :hook (
         (python-mode-hook . lsp-deferred)
         (rust-mode-hook . lsp-deferred) ;; rust-analyzer(次に学ぶとしたら、)
         (sh-mode-hook . lsp-deferred)   ;; yarn global add bash-language-server
         ;; (haskell-mode . lsp-deferred)      ;;
         ;; To defer LSP server startup (and DidOpen notifications) until the buffer is visible
         ;; you can use lsp-deferred instead of lsp:
         (lsp-mode-hook . lsp-enable-which-key-integration) ;; Adds to `which-key-mode'
         (lsp-mode-hook . (lambda () (ggtags-mode -1))) ;; デフォでは使わないようにする [2021-06-12]
         )
  :custom (
           (add-to-list 'lsp-disabled-clients 'pyls)
           ;; debug
           (lsp-log-io             . nil)  ;; print all messages to and from the language server to ~*lsp-log*~.
           (lsp-print-performance  . nil)
           (lsp-server-trace       . nil)  ;; Request trace mode on the language server.
           ;; general
           (lsp-auto-guess-root . t)  ;; original nil
           ;;   Automatically guess the project root using projectile/project.
           ;;   Do *not* use this setting unless you are familiar with ‘lsp-mode’
           ;;   internals and you are sure that all of your projects are
           ;;   following ‘projectile’/‘project.el’ conventions.
           (lsp-message-project-root-warning . t)

           (lsp-auto-configure . t)  ;;
           ;;   "Auto configure `lsp-mode' main features.
           ;; When set to t `lsp-mode' will auto-configure
           ;;   completion, code-actions, breadcrumb, flycheck, flymake, imenu, symbol highlighting,
           ;;   lenses, links, and so on.

           (lsp-headerline-breadcrumb-enable . t)
           ;; (lsp-headerline-breadcrumb-segments . '(project file symbols))
           ;;
           ;; (lsp-document-sync-method . nil)  ;; original nil  'incremental
           ;; (lsp-document-sync-method . 'lsp-sync-incremental)  ;; original nil  'inclemental は変更された
           ;;
           (lsp-eldoc-render-all . nil)
           ;; ミニバッファでの関数情報
           ;;   nil: シグニチャだけ,   t: doc-string 本体を表示する
           ;;
           (lsp-idle-delay . 0.5)
           (lsp-response-timeout     . 5)
           ;; (lsp-enable-snippet       . t)     ;; original t
           (lsp-enable-folding       . t)     ;; original t
           (lsp-enable-indentation   . t)
           ;;
           (lsp-completion-enable . nil)  ;; original t
           (lsp-completion-provider . :none)
           ;; (lsp-completion-provider . :capf)  ;;
           ;; (lsp-prefer-capf . t)  ;;  use ‘lsp-completion-provider’ instead.
           ;; (lsp-completion-no-cache . t)  ;;
           ;; (lsp-completion-enable-additional-text-edit  . t)
           (lsp-completion-show-detail . nil)
           ;; (lsp-completion-show-kind . nil)

           ;; (lsp-diagnostics-provider . :auto) ;; default :auto
           (lsp-diagnostics-provider . :flycheck)
           ;;
           ;; (lsp-inhibit-message . t)
           ;; (create-lockfiles . nil)
           (lsp-file-watch-threshold . nil)
           ;;
           (lsp-enable-symbol-highlighting . t)
           (lsp-signature-render-documentation . nil)
           )
  :commands (lsp lsp-deferred)
  ;; :commands (lsp)
  :config
  ;; .venv, .mypy_cache を watch 対象から外す
  ;;    https://qiita.com/slotport/items/0e9cb2a875fe85bc1735
  (dolist (dir '(
                 "[/\\\\]\\.venv$"
                 "[/\\\\]\\.mypy_cache$"
                 "[/\\\\]__pycache__$"
                 "[/\\\\]_archives$"
                 "[/\\\\]_logs$"
                 ))
    (push dir lsp-file-watch-ignored))

  ;;
  (leaf lsp-ui :ensure t
    :custom
    ;; lsp-ui-doc
    (lsp-ui-doc-enable . t)            ;; original t
    (lsp-ui-doc-header . nil)          ;; original nil
    ;; (lsp-ui-doc-use-childframe . t)
    (lsp-ui-doc-delay  . 1.5)
    (lsp-ui-doc-include-signature . t)   ;; original nil
    (lsp-ui-doc-position . 'top)         ;; top bottom at-point
    (lsp-ui-doc-alignment . 'frame)
    ;;   "How to align the doc.
    ;;    only takes effect when `lsp-ui-doc-position' is 'top or 'bottom."
    ;; (lsp-ui-doc-border . "orange")
    ;; (lsp-ui-doc-border (face-foreground 'default))
    (lsp-ui-doc-use-childframe . t)      ;; require 26
    ;;(lsp-ui-doc-max-width . 70)
    ;;(lsp-ui-doc-max-height . 20)
    (lsp-ui-doc-use-webkit . nil)
    (lsp-eldoc-enable-hover . nil)  ;; mini-buffer への表示

    ;; disable cursor hover (keep mouse hover)
    (lsp-ui-doc-show-with-cursor . nil)
    ;; disable mouse hover (keep cursor hover)
    (lsp-ui-doc-show-with-mouse . nil)

    ;; lsp-ui-flycheck  ;; autoload ?
    (lsp-ui-flycheck-enable . t)

    (lsp-lens-enable . t)

    ;; lsp-ui-sideline
    ;;    Show informations of the symbols on the current line.
    ;;    It also show flycheck diagnostics and LSP code actions
    ;;
    (lsp-ui-sideline-update-mode . 'line)  ;; line or point
    (lsp-ui-sideline-enable . t)
    (lsp-ui-sideline-show-symbol . t)
    (lsp-ui-sideline-show-code-actions . t)
    (lsp-ui-sideline-show-hover . nil)
    (lsp-ui-sideline-show-diagnostics . t)
    (lsp-ui-sideline-ignore-duplicate . t)
    (lsp-ui-sideline-code-actions-prefix . "")
    (lsp-ui-sideline-delay . 0.5)
    ;;
    ;; lsp-ui-imenu
    (lsp-ui-imenu-enable . t)
    (lsp-ui-imenu-kind-position . 'top)
    ;;     (setq lsp-ui-imenu-colors `(,(face-foreground 'font-lock-keyword-face)
    ;;                                 ,(face-foreground 'font-lock-string-face)
    ;;                                 ,(face-foreground 'font-lock-constant-face)
    ;;                                 ,(face-foreground 'font-lock-variable-name-face)))
    ;;
    ;; lsp-ui-peek
    ;;   like Visual studio peak function.
    (lsp-ui-peek-enable . t)
    (lsp-ui-peek-show-directory . t)
    (lsp-ui-peek-always-show . t)
    ;; (lsp-ui-peek-list-width . 60)
    ;; (lsp-ui-peek-peek-height . 20)
    (lsp-ui-peek-fontify . 'on-demand) ;; never, on-demand, or always
    )

  (leaf lsp-ivy :ensure t :require t
    :url "https://github.com/emacs-lsp/lsp-ivy"
    :doc "interface to the workspace symbol functionality"
    :after ivy
    :commands lsp-ivy-workspace-symbol
    )

  (leaf lsp-origami :ensure t :require t
    :url "https://github.com/emacs-lsp/lsp-origami"
    :hook lsp-after-open-hook
    ;; :after origami-minor-mode
    :commands lsp-origami-try-enable
    )
  ;;
  )

lsp は使えていると思うのだが、快適になったかというと、はて?というのが本音。 それに、lsp は反応が遅いという感触がある。

本筋ではないだろうけど、 ファイルサイズを小さく分けることで、少し改善できてるように思う。 これまで、700-800行は気にしなかったのだが、 最近は300-500になるように変更したりしている。

たまに freeze 状態になる問題があるので、 これに比べれば、些細なことかも。

最近の garbage collection に関する設定。

(setq gc-cons-threshold (* 256 1024 1024))
(setq read-process-output-max (* 8 1024 1024))

2021年8月27日金曜日

Emacs の python-mode. なう。

もう、イヤというほど見直してるので、 「なう」にした。で、少し落ち着いてきたと感じているので、 区切りということで、アップ。(どうせ、すぐ変更だろうけど)

あくまで、初心者が「落ち着いてきた」と感じたレベル。 使いこなしているはずもない。

  • 環境は、Debian(bullseye)+emacs(27.1)。
  • project ディレクトリ配下に 作業毎にサブディレクトを作成している。
  • projectilel, pipenv を使いはじめた。
  • python-mode は、elpa から(buildin でない)取得したものを使用。
  • lsp は lsp-mode で、python のクライアントは、lsp-pylsp。
  • tag jump は、lsp から xref を使う。時々探せない時があるので、そんな時は、gtags。
  • flymake ではなく、flycheck。設定は lsp まかせ。
  • 補完は、lsp ではなく、company を直接使ってる、はず。
  • python-shell は使ってない。 画面が狭いし、shell のツールがうまく使えてないから。 必要な場合は、i3-wm の WS を切り替えて、terminal で作業。 たまに、pop-shell を使ってるかも。
  • フォールディングは、origami。使いこなせてない。 私は narrow-to-defun でよいかも。
  • indent は、auto で動くやつは使わない。 python では使わないものだと、どこかで見た記憶がある。 black を時々マニュアルで起動して、整形している。
  • lsp-ui-peak は、画面が大きければ便利かもと思う。 私の場合は、taq jump で行き来すれば大差ないのでは、と感じている。
(leaf python-mode :ensure t
  :mode ("\\.py\\'")
  :interpreter ("python")
  :mode-hydra (python-mode
               (:separator "-" :quit-key "q" :title "python(pylsp)-mode")
               ("LSP-UI"
                (("C" lsp "LSP cue")
                 ("R" lsp-restart-workspace "restart workspace")
                 ("L" lsp-lens-mode "Lens mode")
                 ("H" lsp-describe-session "describe-session")
                 )
                ;; document ;; Show object documentation at point
                "LSP doc, flycheck"
                (("D" lsp-ui-doc-enable "toggle")
                 ("dd" lsp-describe-thing-at-point "describe ap")
                 ("ds" lsp-ui-doc-show "show doc")
                 ("dh" lsp-ui-doc-glance "hide doc")
                 ;; flycheck
                 ("cc" lsp "Ceck")
                 ("cl" lsp-ui-flycheck-list "list" :exit t)
                 )
                "Peak"
                (("P" lsp-ui-peek-enable "toggle")
                 ("pd" lsp-ui-peek-find-definitions "definitions" :exit t)
                 ("pr" lsp-ui-peek-find-references  "references" :exit t)
                 ("pi" lsp-ui-peek-find-implementation "implement" :exit t)
                 ("pb" lsp-ui-peek-jump-backward "back")
                 ("pf" lsp-ui-peek-jump-forward "forwa")
                 )
                "Xref"
                (("xd" xref-find-definitions "find def" :exit t)
                 ("xr" xref-find-references "find ref" :exit t)
                 ("xw" xref-find-definitions-other-window "find def OW" :exit t)
                 ("xnl" xref-next-line "next line")
                 ("xng" xref-next-group "next group")
                 )
                ;; ("s" lsp-signature-help)
                "LSP others"
                (("f" lsp-format-buffer "lsp format")
                 ("d" lsp-describe-thing-at-point "describe ap")
                 ("r" lsp-rename "lsp rename" :exit t)
                 ("m" lsp-ui-imenu "ui-imenu" :exit t)
                 )
                ;;
                "Origami"
                (("oO" origami-mode "origami-mode")  ;;
                 ("o:" origami-recursively-toggle-node "recursively toggle")
                 ("oa" origami-toggle-all-nodes        "toggle all node")
                 ("ot" origami-toggle-node             "toggle node")
                 ("oo" origami-show-only-node          "show only current")
                 ("ou" origami-undo                    "undo")
                 ("or" origami-redo                    "redo")
                 ("oR" origami-reset                   "reset")
                 )
                )
               )
  :custom
  (py-company-pycomplete-p . nil)
  ;;
  :config
  ;;
  (python-mode)
  (flymake-mode nil)
  (setq auto-complete-mode nil)
  ;;
  (setq electric-indent-local-mode nil)
  (setq py-smart-indentation nil)      ;; new  ver. 6.2.4
  (setq python-indent-guess-indent-offset-verbose nil)
  ;; Non-nil means to emit a warning when indentation guessing fails.

  ;; (leaf py-isort :ensure t)

  ;;(leaf python-docstring :ensure t
  ;;  :config
  ;;  (python-docstring-install)
  ;;  )

  (setq flycheck-python-flake8-executable "~/.pyenv/shims/flake8")
  ;; (setq flycheck-flake8rc (concat (getenv "HOME") "/.flake8"))

  (setq flycheck-python-pylint-executable "~/.pyenv/shims/pylint")
  ;; (setq flycheck-pylintrc  (concat (getenv "HOME") "/.config/pylintrc"))

  (setq flycheck-python-mypy-executable "~/.pyenv/shims/mypy")
  ;; (setq flycheck-python-mypy-ini (concat (getenv "HOME") "/.mypy.ini"))
  ;;
  :defer-config
  (setq auto-complete-mode -1)

  (leaf pyvenv :ensure t :require t)
  (leaf pipenv :ensure t :require t
    :init
    ;; (setq
    ;;  pipenv-projectile-after-switch-function #'pipenv-projectile-after-switch-extended)
    (setq pipenv-with-flycheck nil)
    )
  ;;
  (leaf python-environment :ensure t :require t
    :doc "Required by: jedi-core"
    )

  (leaf company-jedi :ensure t :require t
    :init
    (leaf jedi-core :ensure t :require t
      :commands (jedi:setup)
      :hook
      (python-mode-hook . (lambda ()
                            (jedi:setup)
                            (set (make-local-variable 'company-backends)
                                 '(company-jedi company-dabbrev-code company-ispell))))
      :config
      (setq jedi:tooltip-method nil)  ;; pos-tip and/or popup, nil is minibuffer
      (setq jedi:complete-on-dot t)
      (setq jedi:use-shortcuts nil) ;; M-. and M-,
      )
    )

  (leaf lsp-pylsp :ensure nil :require t
    :doc "Fork of the python-language-server project."
    :config
    (setq lsp-pylsp-plugins-black-enabled t)
    (setq lsp-pylsp-plugins-pylint-enabled t)
    ;;(setq lsp-pylsp-plugins-flake8-enabled t)
    )

  )

2021年8月15日日曜日

Emacsの補完で使ってるcompany見直し2?

Debian上のemacs は 27.1 になっている。 org-mode でのメモ書きと python が主用途。

vim も、未だに併用。

前回のアップから2年。いつまでも初心者なのは残念だが、 使い続けられているのだから、と自分を褒めてあげるのだ。

package managerは、leaf.el になっているが、ivy-mode + company は変らず。 今は、 lsp 環境を追加している最中といったところ。

で、補完で使っている company の現状はというと、

company-backends を、make-local-variable でモード毎に指定するようにしたことと、 色のカスタマイズを、テーマまかせにしたこと、が変更点か。

company-backends の設定は、対象モード側で指定した方が正解なのかも、 というのが今の感想で、python の設定で苦労したような記憶が残っている。

まあ、なんとか使えているのでは、と思っているが、正解がわからん。

(leaf company :ensure t :require t
  :url "https://github.com/company-mode/company-mode"
  :doc "http://company-mode.github.io"
  :blackout t
  :hook ((text-mode-hook python-mode-hook emacs-lisp-mode-hook)
         ;; (text-mode-hook)  他は各モードの方で設定
         (plantuml-mode-hook . (lambda ()
                                 (set (make-local-variable 'company-backends)
                                      '(company-yasnippet company-dabbrev))))
         (emacs-lisp-mode-hook . (lambda ()
                                   (set (make-local-variable 'company-backends)
                                        '(company-semantic company-files company-elisp company-dabbrev-code))))
         (org-mode-hook . (lambda ()
                            (set (make-local-variable 'company-backends)
                                 '(company-ispell company-dabbrev company-yasnippet company-files))))
         )
  :bind ((company-active-map  ;; enabled during an active completion
          ("M-p")
          ("M-n")
          ("<tab>" . company-quit)
          ("C-n" . company-select-next)
          ("C-p" . company-select-previous)
          ("C-o" . company-other-backend)
          ("C-v" . company-next-page)
          ("M-v" . company-previous-page)
          ("C-s" . company-filter-candidates))
         (company-search-map  ;; incrementally searching the completion candidates
          ("C-p" . company-select-previous)
          ("C-n" . company-select-next)
          ("M-v" . company-previous-page)
          ("C-v" . company-next-page))
         )
  :config
  (setq auto-complete-mode nil) ;; required by jedi-2019
  (setq company-idle-delay 0.1) ;; defailt 0.5
  (setq company-show-numbers nil)
  (setq company-selection-wrap-around t)  ;; 候補の最後の次は先頭に戻る
  (setq company-minimum-prefix-length 1)  ;; original 3
  ;; (setq completion-ignore-case t)      ;; not company, c-source
  (setq company-dabbrev-downcase nil)
  (setq company-dabbrev-other-buffers nil) ;; 少しでも反応よくしたい
  (setq company-dabbrev-code-other-buffers nil)  ;;
  (setq company-dabbrev-code-everywhere t)     ;;  include comments and strings.
  ;; (setq company-dabbrev-ignore-buffers "\\`\\'")
  ;; (setq company-tooltip-align-annotations nil)  ;; default nil
  (setq company-tooltip-limit 8)
  (setq company-require-match 'never)    ;; If enabled, disallow non-matching input.

  (leaf company-posframe :ensure t :require t
    :blackout t
    :config
    (setq company-posframe-mode 1)
    )
  ;;
  (defun company-quit nil
    "Insert any selected completion and quit completing.
     https://gist.github.com/rswgnu/85ca5c69bb26551f3f27500855893dbe#file-rsw-company-config-el"
    (interactive)
    (when (and company-selection-changed company--manual-action
               (boundp 'company-tng--overlay)
               company-tng--overlay)
      (company--insert-candidate
       (nth company-selection company-candidates)))
    (company-cancel))

  :defer-config
  ;; counsel-gtags を使うので、止め
  ;; (leaf company-gtags :ensure nil :require t)

  ;; for web (not use now)
  (leaf company-web :ensure t :disabled t
    :url "https://github.com/osv/company-web"
    :doc "Company-web support integration with emmet-mode and emmet-preview and
        add some advices to make C-g and RET keys work properly."
    :init
    (leaf web-completion-data :ensure t :require t)
    )
  ;;
  (leaf company-prescient :ensure t :require t :disabled nil
    :url "https://github.com/raxod502/prescient.el"
    :config
    (company-prescient-mode t))
  ;;
  ;; 画面が狭いし、反応がよくないので、やめ。
  (leaf company-quickhelp :ensure t :disabled t
    :url "https://github.com/expez/company-quickhelp"
    :doc "documentation popup for company"
    :bind (company-active-map ("M-h" . company-quickhelp-manual-begin))
    :require t
    :config
    (setq company-quickhelp-delay 0.8) ;; original 0.5
    (setq company-quickhelp-mode t)
    )
  )

python については、 python-mode 設定の :defer-config 内(以下)で指定。

:defer-config
(setq auto-complete-mode -1)

(leaf pyvenv :ensure t :require t)
(leaf pipenv :ensure t :require t
  :init
  (setq pipenv-with-flycheck nil)
  )
;;
(leaf python-environment :ensure t :require t
  :doc "Required by: jedi-core"
  )

(leaf company-jedi :ensure t :require t
  :init
  (leaf jedi-core :ensure t :require t
    :commands (jedi:setup)
    :hook
    (python-mode-hook . (lambda ()
                          (jedi:setup)
                          (set (make-local-variable 'company-backends)
                               '(company-jedi company-dabbrev-code company-ispell))))
    :config
    (setq jedi:tooltip-method nil)  ;; pos-tip and/or popup, nil is minibuffer
    (setq jedi:complete-on-dot t)
    (setq jedi:use-shortcuts nil) ;; M-. and M-,
    )
  )

(leaf lsp-pylsp :ensure nil :require t
  :doc "Fork of the python-language-server project."
  )

しかし、私のマシン遅い、と、よく感じるようになっている。

ThinkPad T510 は、もう部品の入手が困難になっているので、 そろそろ次マシンと思うのだが、中古市場が高騰してる?のか、 安価な新品もスコープに入ってきそうなのが、なんとなく残念。

麻のボディタオル

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