Doom Emacs支持Golang完整的集成开发环境特性

5
我多年来一直是vim用户,最近开始尝试使用emacs,在试用了Spacemacs和Prelude之后,我选择了Doom Emacs。这些天我正在使用(go + lsp)和(lsp)模块配置golang开发,Doom的开箱即用功能令人印象深刻,感谢hlissner出色的工作。
现在,我对基本功能非常满意,例如:
- 自动完成 - 代码检查 - 代码片段 - 其他go-mode功能
但为了提高生产力,我希望有更多类似IDE的功能,比如:
- 导航:到目前为止,我只找到了counsel-imenu,可以在当前缓冲区中选择符号(候选项未按方法/函数/变量/常量/接口分组),但我该如何做以下事情:
查找项目中的符号
查找项目中的接口
查找项目中的结构体
查找项目中的方法
查找导出的函数,可能在指定的包中
在源代码和相关测试文件/方法之间来回切换
- 更复杂的操作生成/操作代码:代码片段和go-gen-test非常有帮助,但是否可以执行以下操作:
在不同范围内生成未声明的方法/字段/函数/包的代码操作,现在似乎只能生成变量。(这是否基于lsp后端支持?我找到了一个java视频,但找不到go的视频)
如果我为一个结构体指定了要实现的接口,是否可以自动生成方法模板?
从结构体中删除方法
如果我删除一个函数/方法,是否可以自动删除相关的测试/基准函数?
请问有人能帮帮我吗?欢迎分享经验/技巧。

1
emacs.stackexchange.com/tags/elisp/info(适用于StackOverflow)。 - Drew
1个回答

26

欢迎加入!

我本人不是 Go 程序员,所以这些大多数都是二手信息,但 Doom 的 :lang go 模块提供了你所需的大部分功能。我建议使用 gopls langserver。操作如下:

  1. 启用这些模块
    • :lang (go +lsp)
    • :tools lsp
    • :editor snippets(默认应该已启用)
  2. 通过操作系统的软件包管理器安装 gopls(如果我没记错的话,它随 Go 1.12+ 一起发布)。
  3. 运行 ~/.emacs.d/bin/doom sync,确保 Doom 已正确同步这些更改。

这样就可以了。以下是一些有用的(evil centric)快捷键:

  • gd +lookup/definition -> 跳转到光标处符号的定义
  • gD +lookup/references -> 跳转到光标处符号的引用
  • K +lookup/documentation -> 查看光标处符号的文档
  • SPC c a lsp-execute-code-action -> 执行任意代码动作(应包括自动生成所需内容)。
  • SPC m h d go-guru-describe -> 描述这个
  • SPC m h v go-guru-freevars -> 列出自由变量
  • SPC m h i go-guru-implements -> 包类型的实现关系
  • SPC m h p go-guru-peers -> 列出通道的同级
  • SPC m h P go-guru-pointsto -> 这指向什么
  • SPC m h r go-guru-referrers -> 列出对象的引用
  • SPC m h c go-guru-callers -> 显示此函数的调用者
  • SPC m h C go-guru-callees -> 显示此函数的被调用者
  • SPC m t t +go/test-rerun -> 重新运行上一个测试
  • SPC m t a +go/test-all -> 运行所有测试
  • SPC m t s +go/test-single -> 运行光标处的测试
  • SPC m t n +go/test-nested -> 运行以下测试

在:lang go模块中,您会找到更全面的键绑定列表(请注意,SPC是Doom的leader键,SPC m是它的localleader键。 对于非邪恶模式用户,这些分别是C-cC-c l)。

snippets模块带有代码片段库。你可以在这里找到我们谦虚的go代码片段here,并且你可以将自己的代码片段添加到~/.doom.d/snippets/go-mode/
我还建议你访问:lang go readme。它需要更新,而我对你在使用gopls时需要多少了解不是很好,但也许有一些边角案例它可以帮助覆盖。
希望这可以帮助!

谢谢您的回复。您能否给我一些关于我的问题中“导航”部分的提示?或者其他语言中执行类似操作所需的常见软件包/工具是什么? - shizhz
我目前正在尝试设置相同的事情。看起来我已经安装了所有东西,但是 SPC-m 本地领袖似乎不存在。我使用了错误的本地领袖吗?当我输入 SPC-m 时,我得到 SPC-m 未定义 的消息。 - jmkoni
更新(以防其他人遇到相同问题):在 config.el 文件中,我设置了 (setq doom-localleader-key "m")SPC-m 仍然无效。但我可以使用 m t s 命令,因此问题已解决。 - jmkoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接