之前一直使用的是 gocode (https://github.com/nsf/gocode
), 后来项目不维护了让用 https://github.com/mdempsky/gocode, 然后这个项目又不维护了,让用 https://github.com/stamblerre/gocode, 然后这个项目也不维护了,都一齐推荐使用 gopls.
gopls 的介绍见 https://github.com/golang/tools/blob/master/gopls/README.md, 从地址中看出,这是一个 golang 官方tools 库中的项目。应该以后不会再换了。不过从介绍上看,还处在 alpha 阶段,尚不稳定。2020 年上半年会发布稳定版。
gopls 是官方的 Language Server 实现,功能有补全,跳转定义,查找引用,鼠标悬停提示,可以抛弃 godef, gocode 相关的工具了。
安装
go get golang.org/x/tools/gopls@latest
大概率会出现 go: cannot use path@version syntax in GOPATH mode 的错误,有就执行下面命令安装:
GO111MODULE=on go get golang.org/x/tools/gopls@latest
GO111MODULE 是什么,就去看看 https://learnku.com/go/t/39086 。
配置 emacs
(use-package lsp-mode
:ensure t
:commands (lsp lsp-deferred)
:hook (go-mode . lsp-deferred))
;; Set up before-save hooks to format buffer and add/delete imports.
;; Make sure you don't have other gofmt/goimports hooks enabled.
(defun lsp-go-install-save-hooks ()
(add-hook 'before-save-hook #'lsp-format-buffer t t)
(add-hook 'before-save-hook #'lsp-organize-imports t t))
(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)
;; Optional - provides fancier overlays.
(use-package lsp-ui
:ensure t
:commands lsp-ui-mode)
;; Company mode is a standard completion package that works well with lsp-mode.
(use-package company
:ensure t
:config
;; Optionally enable completion-as-you-type behavior.
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 1))
;; Optional - provides snippet support.
(use-package yasnippet
:ensure t
:commands yas-minor-mode
:hook (go-mode . yas-minor-mode))
M-. 和 M-, 这两个常用的定义跳转跳回默认是绑定了,不需要再额外配置。