之前一直使用的是 gocode (https://github.com/nsf/gocode
), 后來項目不維護(hù)了讓用 https://github.com/mdempsky/gocode, 然后這個項目又不維護(hù)了做盅,讓用 https://github.com/stamblerre/gocode缤削, 然后這個項目也不維護(hù)了,都一齊推薦使用 gopls.
gopls 的介紹見 https://github.com/golang/tools/blob/master/gopls/README.md吹榴, 從地址中看出亭敢,這是一個 golang 官方tools 庫中的項目。應(yīng)該以后不會再換了图筹。不過從介紹上看帅刀,還處在 alpha 階段让腹,尚不穩(wěn)定。2020 年上半年會發(fā)布穩(wěn)定版扣溺。
gopls 是官方的 Language Server 實現(xiàn)骇窍,功能有補全,跳轉(zhuǎn)定義锥余,查找引用腹纳,鼠標(biāo)懸停提示,可以拋棄 godef, gocode 相關(guān)的工具了驱犹。
安裝
go get golang.org/x/tools/gopls@latest
大概率會出現(xiàn) go: cannot use path@version syntax in GOPATH mode 的錯誤嘲恍,有就執(zhí)行下面命令安裝:
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-, 這兩個常用的定義跳轉(zhuǎn)跳回默認(rèn)是綁定了佃牛,不需要再額外配置。