Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

2020年度版 Emacs で Go言語用プログラミング設定(単語補完)

Emacs25 + lsp-mode + lsp-ui + company-lsp

ディストリビュージョンを変えたので、Emacs使ってGo言語の開発を作ろうとしたら、gocodeを利用したパッケージたちが動かない。
前は出来たはずだが・・なんか間違えたか??
自分の設定が悪いのか否か・・・と悩んだが、結局の所、gocodeがgo言語の新しい仕様にマッチしなくなっちゃった事が原因らしい。
んで、別の解決策が模索されているとのこと。

ネタ元 → 
Big Sky :: gocode やめます(そして Language Server へ)

パッケージの導入

MELPAでインストール

M-x package-list-packages

インストールしたパッケージ達
lsp-mode : language server protocolモード
company :単語補完ライブラリ
company-lsp : language server protocolモードの単語補完パッケージ
company-quickhelp :auto-completeで言うところのツールチップなウィンドウを表示するもの
flycheck :シンタックスチェック
lsp-ui :lsp-modeのUIをリッチにしてくれる
go-dlv :Go言語のソースをEmacsバッファ上でデバッグできるようになる

導入パッケージの設定

init.elに設定

;; company-modeによる単語補完
(when (require 'company nil t)

  (global-company-mode)                  ; 全バッファで有効にする

  (setq company-auto-expand t)           ; 1個目を自動的に補完
  (setq company-complete-on-edit t)      ; 文字を打っているときに自動的に補完ウィンドウを出す
  (setq company-idle-delay 0)            ; 遅延なしにすぐ表示
  (setq company-minimum-prefix-length 4) ; デフォルトは4
  (setq company-selection-wrap-around t) ; 候補の最後の次は先頭に戻る
  (setq completion-ignore-case t)
  (setq company-dabbrev-downcase nil)
  (setq company-transformers '(company-sort-by-backend-importance)) ;; ソート順


  (global-set-key (kbd "C-M-i") 'company-complete)
  (define-key company-active-map (kbd "C-n") 'company-select-next)               ;; C-n, C-pで補完候補を次/前の候補を選択
  (define-key company-active-map (kbd "C-p") 'company-select-previous)
  (define-key company-search-map (kbd "C-n") 'company-select-next)
  (define-key company-search-map (kbd "C-p") 'company-select-previous)
  (define-key company-active-map (kbd "C-s") 'company-filter-candidates)         ;; C-sで絞り込む
  (define-key company-active-map (kbd "C-i") 'company-complete-selection)        ;; TABで候補を設定
  (define-key company-active-map [tab] 'company-complete-selection)              ;; TABで候補を設定
  (define-key company-active-map (kbd "C-f") 'company-complete-selection)        ;; C-fで候補を設定
  (define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete)               ;; 各種メジャーモードでも C-M-iで company-modeの補完を使う

  ;; 未選択項目
  (set-face-attribute 'company-tooltip nil
                      :foreground "#36c6b0" :background "#244f36")
  ;; 未選択項目&一致文字
  (set-face-attribute 'company-tooltip-common nil
                      :foreground "white" :background "#244f36")
  ;; 選択項目
  (set-face-attribute 'company-tooltip-selection nil
                      :foreground "#a1ffcd" :background "#007771")
  ;; 選択項目&一致文字
  (set-face-attribute 'company-tooltip-common-selection nil
                      :foreground "white" :background "#007771")
  ;; スクロールバー
  (set-face-attribute 'company-scrollbar-fg nil
                      :background "#4cd0c1")
  ;; スクロールバー背景
  (set-face-attribute 'company-scrollbar-bg nil
                      :background "#002b37")

  ;; QuickHelp表示
  (company-quickhelp-mode t)
  )

(require 'lsp-mode)
(require 'lsp-ui)
(require 'company-lsp)
  

デバッガ設定

GDBのようにデバッグしたい。
当然ながらEmacsでできます。

;; 環境変数を引き継ぐ
(when (require 'exec-path-from-shell nil t)
  (exec-path-from-shell-initialize)
  (exec-path-from-shell-copy-envs '("PATH" "GOROOT" "GOPATH")))

;; Golang Debugger 有効
(require 'go-dlv)

Goのソースを開き、デバッグしたい関数の内側にカーソルを移動。
その後、M-x dlv-current-func を実行すると、デバッガが起動する。

※注意!!→メニューからEmacsを起動すると、.bashrcや.zshrcの環境変数設定が取り込まれない。
 exec-path-from-shell-XXX が必要なのはそのため。
 それでもうまく行かない場合は・・・メニューからではなくshellからEmacsを起動すると完璧。