Emacs の Golang 環境まわりがいろいろ変わってて gocode が動かなかったり Flycheckの設定が変わってたりしてた。
会社の人から VScode を勧められたけど Emacs 使いはそんなことでは負けないんだからね!😢
前提
- macOS mojave
- anyenv で goenv 入れて go13.x インストール済み
- 要望として下記ができればいいかな
- 構文チェック
- 補完
- 保存時に gofmt
go のパッケージをインストール
$ go get -u golang.org/x/tools/cmd/gopls $ go get golang.org/x/tools/cmd/goimports
M-x package-list-packages
でインストール
- go-mode
- lsp-mode
- company
- company-lsp
- lsp-ui
- exec-path-from-shell
.zshrc
export PATH="$HOME/.anyenv/bin:$PATH" eval "$(anyenv init - zsh)" export PATH="$GOROOT/bin:$PATH" export PATH="$PATH:$GOPATH/bin"
init.el
なぜか exec-path-from-shell-copy-envs
を2回読み込まないと goimports
動かない。
- 追記2019-11-22
goimports
がコード書いてるとなんかうざくなるので使うのやめた。helm-occur
で関数とか絞り込むと便利なことに気づいた。行数増えると探すのツラくなるので。
(exec-path-from-shell-initialize) ;; golang (progn (let ((envs '("GOROOT" "GOPATH" "PATH"))) (exec-path-from-shell-copy-envs envs)) (add-hook 'go-mode-hook (lambda () (setq indent-tabs-mode t) ;; (setq gofmt-command "goimports") (add-hook 'before-save-hook 'gofmt-before-save) (define-key go-mode-map (kbd "M-.") 'xref-find-definitions) (let ((govet (flycheck-checker-get 'go-vet 'command))) (when (equal (cadr govet) "tool") (setf (cdr govet) (cddr govet)))) )) (add-hook 'go-mode-hook #'lsp-deferred) (eval-after-load 'go-mode '(progn (exec-path-from-shell-copy-envs '("GOROOT" "GOPATH" "PATH")) (define-key go-mode-map (kbd "C-c C-j") 'helm-occur) )) )
感想
いろいろ挙動おかしくなったりするから go を書くなら VScode をオススメしたい(使ったことないけど)