2022年9月19日月曜日

Emacsの補完で使ってるcompanyの見直し?(202209)

company について前回晒してから、はや 1 年。この間に lsp を導入したり、ivy から consult へも変更したりしてるので、 再確認の機会になればと晒してみる。

主な変更は、 company-backends の設定を、対象モード側ではなく、 company のフックで統一したこと。だけだった。

環境は、 Debian の 5.10.140-1 Bullesye で、emacs は 27.1 。 org-mode でのメモ書きと 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)
         ;; backends は ここで設定するのがよさそう
         (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))))
         (rst-mode-hook . (lambda ()
                            (set (make-local-variable 'company-backends)
                                 '(company-ispell company-dabbrev company-yasnippet company-files))))
         (python-mode-hook . (lambda ()
                               (set (make-local-variable 'company-backends)
                                     '(company-jedi company-dabbrev-code company-ispell company-yasnippet))))
         (html-mode-hook . (lambda ()
                             (set (make-local-variable 'company-backends)
                                  '(company-capf company-web-html company-dabbrev-code company-yasnippet company-files company-ispell))))
         (nxml-mode-hook . (lambda ()
                             (set (make-local-variable 'company-backends)
                                  '(company-capf company-nxml company-dabbrev-code company-yasnippet company-files company-ispell))))
         (css-mode-hook . (lambda ()
                            (set (make-local-variable 'company-backends)
                                 '(company-capf company-css company-dabbrev-code company-yasnippet company-files company-ispell))))
         ;; company-gtags
         )
  :bind (
         ;; ("<tab>" . company-indent-or-complete-common)
         (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)
          ;; lsp-mode で時々うまく機能しないことがある
          ("C-v" . company-next-page)
          ("M-v" . company-previous-page)
          ("C-s" . company-filter-candidates))
         (company-search-map  ;; incrementally searching the completion candidates
          ("<tab>" . company-quit)
          ("C-p" . company-select-previous)
          ("C-n" . company-select-next)
          ("C-v" . company-next-page)
          ("M-v" . company-previous-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-default company-minimum-prefix-length 1) ;; original 3

  ;; (setq completion-ignore-case t)      ;; c-source

  (setq company-dabbrev-downcase nil)
  ;; (setq company-dabbrev-other-buffers nil) ;; 少しでも反応よくしたい
  (setq company-dabbrev-other-buffers t) ;; If t, all buffers with major modes 間違えていた(221019)
  (setq company-dabbrev-code-other-buffers 'code)  ;; 間違えていた(221019)
  (setq company-dabbrev-code-everywhere t)     ;;  include comments and strings.
  ;; (setq company-dabbrev-ignore-buffers "\\`\\'")

  ;; (setq company-eclim-auto-save nil)   ;; for eclipse
  ;; (setq company-tooltip-align-annotations nil)  ;; default nil
  (setq company-tooltip-limit 8)
  (setq company-require-match 'never)    ;; If enabled, disallow non-matching input.

  (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
  ;; (leaf company-gtags :ensure nil :require t)
  ;; (setq company-gtags-insert-arguments t)  ;; original t

  ;; for web

  (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-jedi :ensure t
    :after (python-mode)
    :init
    (leaf python-environment :ensure t :require t
      :doc "Required by: jedi-core"
      )
    (leaf jedi-core :ensure t :require t
      ;; :custom (
      ;;   (jedi:environment-root        . "~/.pyenv/versions/3.9.10/bin/python3")
      ;; )
      :commands (jedi:setup)
      ;; :config
      ;; (setq jedi:server-command (list (executable-find "jediepcserver")))
      )  ;; ends jedi-core

   :config
    (setq jedi:tooltip-method nil)  ;; pos-tip and/or popup, nil is minibuffer
    (setq-local jedi:complete-on-dot t)
    (setq-local jedi:use-shortcuts nil) ;; M-. and M-,

    )  ;; ends company-jedi. _____

  ;; start a specific backend.
  ;; (setq company-begin-backend 'company-ispell)

  (leaf company-prescient :ensure t :require t :disabled nil
    :url "https://github.com/raxod502/prescient.el"
    :config
    (company-prescient-mode t))

  ;; skip to the next matching backend in the backend list.
  ;;  [2021-05-07] (setq company-other-backend '(company-eclim company-bbdd company-cmake company-files company-oddmuse))

  ;; lsp-ui-doc があるので、company-quickhelp を不要とする。

  )

なんか、冗長になっているのではと思ってしまう。 もっと、シンプルにならないものかと思うが、ハードル高そう。 どこかに良きサンプルはないだろうか。

vim も、未だ使っている。が、その出番は少なくなってるように思う。 最近設定をいじった記憶がないと、思っていたが、 vim-tiny と neovim を aliase で使い分けるようしてた。

emacs を使う時は、少し構えているのかもしれない。

まあ、なんとなく使えているので、よしとしよう。

0 件のコメント:

コメントを投稿

Emacs の lsp の設定、なう(202310)

前回さらしてから、さらに1年。そう、3年めになる。 が、今回は一段と自信がない。 環境は、 Debian GNU/Linux 12 (bookworm) + emacs(29.1)。consult + company。 embark は未だに使ってない。 用途は、メモ と ...