emacs 中go的自动补全

之前一直使用的是 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-, 这两个常用的定义跳转跳回默认是绑定了,不需要再额外配置。


发表评论

您的电子邮箱地址不会被公开。