2019年2月23日土曜日

Emacsの補完で使ってるcompany見直し?[201907]

Debian上のエディタに、emacs(26.1)をメインに使用している。 まあ、vimが周辺をサポートしているのだが。

org-modeでメモが主用途。それと、少し長めのpythonスクリプト。 素人なので、コピペ基本の設定。

最近、expandregion, smartparens, yasnippet, companyが うまく機能してないように感じ始めている。

なので、まず補完のcompanyを見直してみた。のだったが。

package managerは、use-package。ivy-mode + company 環境。

まず、eclipse,c,c++はやらないので、以下のようにbackendを変更しようとした。

;; https://github.com/company-mode/company-mode/issues/407 + others
(setq company-backends
  '(company-ispell
    company-yasnippet
    (company-dabbrev-code company-gtags company-keywords) 
    ;   grouping分らん、 withとかなんとか
    ;   company-keywords   ; keywords by company default
    ;   company-bbdb       ; database for mail address......
    ;   company-gtags      ; あまり使用感がない?
    company-files          ; files & directory
    company-capf           ; completion-at-point-functions
    ;company-dabbrev-code  ; dabbrev for code
    ;company-oddmuse   ; WikiWiki engine Oddmuse such as emacswiki.org
    ;company-abbrev    ; 静的略称展開
    company-dabbrev    ; 動的略称展開
))

だが、この設定はglobal-modeで有効になるようだが、 company-webでは反映されなかった。ようだ。 company-safe-backendsを使っているようで、 こいつは触らない方が良いみたい。

This variable may be risky if used as a file-local variable.

ただ既に、ispellが含まれてたりする。 標準に含まれてないbackendを使おうとする場合、 その作法というか、色々あるのかもしれない。あくまで想像だが。

なので、 パッケージに含まれる company-ispellconpany-yasnippetcompany-backend に 追加して、company-other-backend を指定する方法にしてみた。

;; C-h v company-backends から
;; ‘company-begin-backend’ can be used to start a specific backend,
;; ‘company-other-backend’ will skip to the next matching backend in the list.

現状、以下。

(use-package company :ensure t
 :diminish company-mode 
 :bind (
   ("C-c y /" . company-yasnippet) ;; [201907]
   ;; backend 切り替えできないので
  ; :map company-mode-map ; 通常 On なので注意 
  :map company-active-map ; 選択している最中
   ("M-p" . nil)  ; ミスタッチ予防
   ("M-n" . nil)
   ([tab] . company-complete-common-or-cycle)
   ("C-n" . company-select-next)
   ("C-p" . company-select-previous)
   ("C-o" . company-other-backend)
   ;; 他のbackend候補を表示させる。firsrがispellだから。
   ;; firstを変更するキーバインドが欲しいかも 
   ("C-v" . company-next-page) 
   ("M-v" . company-previous-page)
   ("C-s" . company-filter-candidates) ;; flx みたいに絞りこめる。
  :map company-search-map  ; company-filter-candidatesでの設定かと。
   ("C-p" . company-select-previous) 
   ("C-n" . company-select-next)
   ;("C-o" . company-other-backend) ; ダメ、機能しない。
   ; これが使えると嬉しいかも。
 )        
 :init (global-company-mode) 
 :config     
  ; optionの設定  
  (setq company-show-numbers nil
        ;; company-auto-expand t (20190410)
        company-auto-complete nil ;; (20190410)
        ;; company-transformers '(
        ;;    company-sort-by-occurrence
        ;;    company-sort-by-backend-importance
        ;; );; Original value was nil  
        company-transformers nil ;; set nil for speed up
        company-selection-wrap-around t 
        company-idle-delay 0.1
        completion-ignore-case t
        company-dabbrev-downcase nil
        company-dabbrev-other-buffers t
        ; use only buffers with same major-mode for company-dabbrev
        ; company-minimum-prefix-length 3 ; 2文字ならyasnippetを直接
        company-minimum-prefix-length 1   ; C-o で他の候補になるから。
        company-selection-weap-around t
        company-tooltip-align-annotations t  ; align to the right border
        ;; company-sort-by-occurrence t (20190410)
        company-tooltip-limit 10)

  (add-to-list 'company-backends 'company-yasnippet) 
  (add-to-list 'company-backends 'company-ispell)

  ; start backend
  (setq company-begin-backend 'company-ispell) 
  ; 普段はメモとかだからispellにしておく。
  ;   elpy-mode : firstはispellではない。companyを使ってない?
  ;   web-mode  : firstはispellのまま。

  ; skip to the next matching backend in the list.
  (setq company-other-backend '(company-etags company-eclim company-bbdd
                                company-xcode company-cmake company-oddmuse))

  ; たまにhtmlを直接編集するからcompany-webを追加。
  ; company-safe-backendsに追加されるが、company-web-htmlはリストにない。
  ; [201907] うまく動いてないので、一旦削除。
  ;
  ;(use-package company-web :ensure t
  ; :config 
  ; (add-hook 'web-mode-hook 
  ;   (lambda ()
  ;      (add-to-list (make-local-variable 'company-backends) 
  ;                   'company-nxml) 
  ;      (add-to-list (make-local-variable 'company-backends)
  ;                   'company-web-html)
  ;      (add-to-list (make-local-variable 'company-backends)
  ;                   'company-css)
  ;      )) 
  ; )

  ; company-prescient レスポンスがかなり低下するので止め 20190414
  ; company-flx       うまく動かない。company-filter-candidatesでよしとする。

  ; custom face  ;; T510の貧相な発色にあわせてる。
  (set-face-attribute 'company-tooltip nil
          :foreground "black" :background "gray75")
  (set-face-attribute 'company-tooltip-common nil
          :foreground "black" :background "gray55")
  (set-face-attribute 'company-tooltip-common-selection nil
          :foreground "white" :background "DodgerBlue4") 
  (set-face-attribute 'company-tooltip-selection nil                                       
          :foreground "black" :background "DodgerBlue3")
  (set-face-attribute 'company-preview nil 
          :foreground "gray90" :background "RoyalBlue4" :underline t)
  (set-face-attribute 'company-preview-common nil
          :foreground "white" :background "DodgerBlue4" :underline t) 
  (set-face-attribute 'company-scrollbar-fg nil
          :background "orange") 
  (set-face-attribute 'company-scrollbar-bg nil
          :background "gray40")
)

pythonには、elpyを使っている。elpy-modeでは elpy-module-companyが勝手に設定してくれるようで (https://github.com/jorgenschaefer/elpy/issues/1397)、 jedi-coreをemacs側にインストして、必要なpythonのモジュールをインストして環境を整えれば、まあ動いているようだ。

とりあえず、少しは良くなったみたい。

しかし、私には難しすぎるし時間がかかった。 smartparenとか、他にも調べたいのがあるが、ハードル高い。 しばらくこれで様子見か。

[201907] : 上記の設定は、デフォの設定であって、 modeに応じて変更させる時は、localな設定にするのかも、と試してみる。

(use-package company-web :ensure t
 :after company
 :hook (
    (web-mode . (lambda () (add-to-list (make-local-variable 'company-safe-backends) '(company-web-html . "WEB"))))
    (css-mode . (lambda () (add-to-list (make-local-variable 'company-safe-backends) '(company-css . "CSS"))))
  )
)

ompany-safe-backends には追加されるようなので、一応継続。
調べながら使うのが基本なので、 問題にならなかったのだろう。ちゃんと調べないと、と反省。
GTAGS が無いとエラーになるので、面倒でも作成しないといけない。
きっと、設定方法があるのだろうけど。

0 件のコメント:

コメントを投稿

麻のボディタオル

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