Doom Emacs 中对 golang 的完整 IDE 功能支持
Full IDE features support for golang in Doom Emacs
我是 vim 多年的用户,最近开始玩 emacs,在尝试过 Spacemacs 和 Prelude 之后,Doom Emacs 是我最终的选择。这些天我正在使用 (go +lsp) 和 (lsp) 模块配置 golang 开发,Doom 的所有开箱即用功能都令人印象深刻,感谢 hlissner 的出色工作。
现在我对以下基本功能很满意:
自动完成
- 飞检
- 片段
- 其他 go-mode 功能
但是为了提高工作效率,我想要更多 IDE 类似的功能,例如:
- 导航:到目前为止我只找到了 counse-imenu,通过它我可以在当前缓冲区中 select 符号(未按 method/function/var/const/interface 分组的候选人等等),但我怎么能做这样的事情:
- 在项目中查找符号
- 在项目中查找接口
- 在项目中查找结构
- 在项目中查找方法
- 查找导出的函数,可能在指定的包中
- 在源代码和相关测试之间切换回来并强制执行file/method
- 等等...
- 对 generate/operate 代码进行更复杂的操作:片段和 go-gen-test 很有帮助,但是否可以执行以下操作:
- 在不同的范围内生成未声明的method/field/function/package的代码操作,现在看来它只能生成变量。 (这是基于 lsp 后端支持吗?我找到了 java 的视频,但没找到)
- 如果我指定要为 Struct 实现的接口,则自动生成方法模板
- 从结构中删除方法
- 如果我删除 function/method
,则自动删除相关 test/bench 函数
有人可以帮我解决这个问题吗?任何 experiences/tips 都表示赞赏。
欢迎加入!
我自己不是围棋程序员,所以这些大多是第二手帐户,但 Doom 的 :lang go
模块提供了您所要求的大部分内容。我建议使用 gopls
langserver。为此:
- Enable these modules:
:lang (go +lsp)
:tools lsp
:editor snippets
(应默认启用)
- 通过您的 OS' 包管理器安装
gopls
(iirc 它随 Go 1.12+ 一起提供)。
- 运行
~/.emacs.d/bin/doom sync
以确保 Doom 与这些更改正确同步。
你应该可以开始了。这里有一些你应该知道的有用的(以邪恶为中心的)键绑定:
- 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
-> re运行 上次测试
- SPC m t a
+go/test-all
-> 运行 所有测试
- SPC m t s
+go/test-single
-> 运行 点测试
- SPC m t n
+go/test-nested
-> 运行 下面的测试
您会找到更全面的键绑定列表 in the :lang go module(请注意,SPC
是 Doom 的领导者密钥,SPC m
是其本地领导者密钥。对于非恶意用户,它们分别是 C-c
和 C-c l
。
snippets 模块自带 a snippets library. You can find our modest go snippets here,您可以将自己的添加到 ~/.doom.d/snippets/go-mode/
。
我也建议你visit the :lang go
readme。它需要更新,关于 gopls 你需要多少它,我不是一个很好的资源,但也许它可以帮助解决一些极端情况。
希望对您有所帮助!
我是 vim 多年的用户,最近开始玩 emacs,在尝试过 Spacemacs 和 Prelude 之后,Doom Emacs 是我最终的选择。这些天我正在使用 (go +lsp) 和 (lsp) 模块配置 golang 开发,Doom 的所有开箱即用功能都令人印象深刻,感谢 hlissner 的出色工作。
现在我对以下基本功能很满意:
自动完成
- 飞检
- 片段
- 其他 go-mode 功能
但是为了提高工作效率,我想要更多 IDE 类似的功能,例如:
- 导航:到目前为止我只找到了 counse-imenu,通过它我可以在当前缓冲区中 select 符号(未按 method/function/var/const/interface 分组的候选人等等),但我怎么能做这样的事情:
- 在项目中查找符号
- 在项目中查找接口
- 在项目中查找结构
- 在项目中查找方法
- 查找导出的函数,可能在指定的包中
- 在源代码和相关测试之间切换回来并强制执行file/method
- 等等...
- 对 generate/operate 代码进行更复杂的操作:片段和 go-gen-test 很有帮助,但是否可以执行以下操作:
- 在不同的范围内生成未声明的method/field/function/package的代码操作,现在看来它只能生成变量。 (这是基于 lsp 后端支持吗?我找到了 java 的视频,但没找到)
- 如果我指定要为 Struct 实现的接口,则自动生成方法模板
- 从结构中删除方法
- 如果我删除 function/method ,则自动删除相关 test/bench 函数
有人可以帮我解决这个问题吗?任何 experiences/tips 都表示赞赏。
欢迎加入!
我自己不是围棋程序员,所以这些大多是第二手帐户,但 Doom 的 :lang go
模块提供了您所要求的大部分内容。我建议使用 gopls
langserver。为此:
- Enable these modules:
:lang (go +lsp)
:tools lsp
:editor snippets
(应默认启用)
- 通过您的 OS' 包管理器安装
gopls
(iirc 它随 Go 1.12+ 一起提供)。 - 运行
~/.emacs.d/bin/doom sync
以确保 Doom 与这些更改正确同步。
你应该可以开始了。这里有一些你应该知道的有用的(以邪恶为中心的)键绑定:
- 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
-> re运行 上次测试 - SPC m t a
+go/test-all
-> 运行 所有测试 - SPC m t s
+go/test-single
-> 运行 点测试 - SPC m t n
+go/test-nested
-> 运行 下面的测试
您会找到更全面的键绑定列表 in the :lang go module(请注意,SPC
是 Doom 的领导者密钥,SPC m
是其本地领导者密钥。对于非恶意用户,它们分别是 C-c
和 C-c l
。
snippets 模块自带 a snippets library. You can find our modest go snippets here,您可以将自己的添加到 ~/.doom.d/snippets/go-mode/
。
我也建议你visit the :lang go
readme。它需要更新,关于 gopls 你需要多少它,我不是一个很好的资源,但也许它可以帮助解决一些极端情况。
希望对您有所帮助!