V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjsxwc
V2EX  ›  程序员

doom-emacs 搭建 golang 开发环境

  •  
  •   zjsxwc ·
    zjsxwc · 2021-01-06 11:41:49 +08:00 · 1674 次点击
    这是一个创建于 1410 天前的主题,其中的信息可能已经有所发展或是发生改变。

    安装 doom-emacs

    我是 manjaro 系统,参考 https://github.com/hlissner/doom-emacs/#install

    pacman -S git emacs ripgrep
    pacman -S fd
    git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
    ~/.emacs.d/bin/doom install
    

    安装 gopls 这个 golang 语言服务器

    pacman -S gopls
    

    配置 doom-emacs

    修改 ~/.doom.d/init.el (参考 https://emacs-lsp.github.io/lsp-mode/page/installation/

    ;;; 添加中国源
    (setq package-archives '(("gnu" . "http://mirrors.ustc.edu.cn/elpa/gnu/")
                             ("melpa" . "http://mirrors.ustc.edu.cn/elpa/melpa/")
                             ("melpa-stable" . "http://mirrors.ustc.edu.cn/elpa/melpa-stable/")
                             ("org" . "http://mirrors.ustc.edu.cn/elpa/org/")))
    
    (doom! :input
    ...
           :tools
           lsp  ;打开支持 gopls 的 lsp 协议的三方包依赖
    ...
           :lang
           (go +lsp)  ;对于 go 语言使用 lsp 协议
    
    

    更新 doom-emacs 的三方包

    ~/.emacs.d/bin/doom sync
    

    对 go-mode 钩子 lsp-mode 并使用 gopls 作为 lsp-server,修改文件~/.doom.d/config.el 最后添加

    (setq lsp-gopls-staticcheck t)
    (setq lsp-eldoc-render-all t)
    (setq lsp-gopls-complete-unimported t)
    
    (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))
    

    使用方式

    doom-emacs 使用 vim 快捷键编辑单个文件,使用 emacs 快捷键编辑整个项目,还能使用 emacs 庞大的 elisp 插件库。

    默认 go-mode 会以go.mod 文件所在文件为一个项目(所以每个 go 项目必须先执行go mod init xxx,来创建一个项目,如果有.gitgo.mod 同时存在会在第一次打开的时候询问以哪个项目为准,一般输入 i 就是一 go.mod 所在目录项目为准),但 gopls 会把 go-src 当作三方依赖,所以可以从我们当前代码跳到标准库代码定义中。

    使用 <空格> + c 就可以唤出菜单进行对 golang symbol 语义上跳转,

    比如 <空格> + c + d 会跳到 symbol 定义处, <空格> + c + D 会跳到使用 symbol 处(当然这个是我当前的版本快捷键,如果版本更新还是要看菜单显示出的快捷键)。

    使用 <空格> + b 就可以唤出菜单进行进行 navigation,比如 <空格> + b + [ 就是回跳上一个页面,<空格> + b + ]就是回跳下一个页面。

    使用 <空格> + s 就是全局搜索

    使用 <空格> + p 就是项目管理

    使用 <ctrl> + x + <ctrl> + c 就是退出 emacs

    使用 <alt> + x 就是执行 emacs 三方插件提供的函数

    第 1 条附言  ·  2022-08-29 10:38:39 +08:00
    最新 rls 已经被 rust-analyzer 取代所以我们从 github 源代码安装最新 rust-analyzer

    cd ~/.doom.d
    git clone https://github.com/rust-analyzer/rust-analyzer.git
    cd rust-analyzer
    cargo xtask install --server
    第 2 条附言  ·  2022-08-29 10:39:46 +08:00
    上面的 append 弄错了,不是 golang 的,而是 rust 的,请忽略
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1227 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:21 · PVG 02:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.