emacs golang配置

emacs golang开发

背景

最近搞go project,发现之前配置的gocode已经很久没有维护,报panic错误了,而官方的意思也是建议使用 支持lsp的gopls,集成跳转、补全等操作

了解gopls

了解lsp-mode

https://emacs-lsp.github.io/lsp-mode/ lsp全称Language Server Protocol, lsp-mode相当于是lsp对于多语言的支持,可以配合emacs里面常用的比如company等实现跳转,补全等逻辑,最终实现类似ide的一些效果 相当于一个语言的接口,接口之上可以进行各种操作 核心功能 https://emacs-lsp.github.io/lsp-mode/page/main-features/

了解lsp-ui

https://emacs-lsp.github.io/lsp-ui/ 丰富lsp-mode的一些显示的,比如flycheck和放大镜等等

配置

install gopls

1
go get golang.org/x/tools/gopls@latest

这里有篇文档,更加详细 https://github.com/golang/tools/blob/master/gopls/doc/emacs.md 如果没时间可以忽略

install lsp-mode

配置部分 有一些应该没用了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    (use-package go-mode
      :ensure t
      :mode (("\\.go\\'" . go-mode))
      ;;:hook ((before-save . gofmt-before-save))
      :config
      ;;(setq gofmt-command "goimports")
      (add-hook 'go-mode-hook '(lambda()
                                 (set (make-local-variable 'company-backends)'(company-go))
                                 (company-mode)))

      (add-hook 'go-mode-hook #'lsp-go-install-save-hooks)
      (add-hook 'go-mode-hook 'lsp-deferred)
      (add-hook 'go-mode-hook #'yas-minor-mode)
      (use-package lsp-mode
        :ensure t
        :config
        (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))
        (use-package lsp-ui
          :ensure t)
        )
      ;; Set up before-save hooks to format buffer and add/delete imports.
      (use-package company-go
        :ensure t
        )
      (use-package go-eldoc
        :ensure t
        :hook (go-mode . go-eldoc-setup)
        )
      (use-package go-guru
        :ensure t
        :hook (go-mode . go-guru-hl-identifier-mode)
        )
      (use-package go-rename
        :ensure t)
      )
    (provide 'init-go)

然后打开新go文件看是否提示导入project