vscode 写 go 连最基础的补全功能都做得这么差的吗

147 天前
 BeautifulSoap

一直用的都是 goland/idea 写 go ,体验了下用 vsocde 开发 go ,结果发现怎么连最基础的补全功能都这么差

有点无法理解说 vscode 写 go 的体验和 goland 差不多的是认真的吗。。。。。

下面是一个简单到不能再简单的的例子,如果是我用 vscode 姿势不对,希望有人能指出问题所在

go mod 初始化好项目用 vsocde 打开(确保 gopls 的 lsp 已经正确运行),写一个 utils 包 utils/utils.go,内容如下:

package utils

func ThisIsMyHelperFunction() string {
	return "hello"

}

关掉这个文件的标签页,打开 main.go ,输入 ThisIsMy,我自然期待补全会给出对应的函数候补,结果 vscode 根本跳不出任何候补。不是,vscode 这么离谱的吗

然后我发现,把utils.go 文件作为非活动标签页打开在边上,然后再输 ThisIsMy ,这次候补里出现了,但是它只是作为一个纯字符串出现,vscode 甚至都无法识别出它是个函数,tab 上去之后 ctrl + . 甚至都没法正常导包,提示不存在定义

然后翻了半天 vscode 官网,才发现说明有这一句

As you type in a Go file, you can see IntelliSense providing you with suggested completions. This even works for members in current, imported, and not yet imported packages. Just type any package name followed by ., and you will get suggestions for the corresponding package members.

不是,你的意思是我要用一个类型 or 函数之类的,必须从所属的包开始输入吗?一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊。。。。。。

而与之相对的,在 goland/idea 中写 go 项目,我只要输入 ThisIs 就能跳出对应内容,tab 后就直接完成了补全+添加包前缀+自动 import 。我曾经以为这种功能甚至是基础到不能再基础的功能,结果没想到。。。。

9213 次点击
所在节点    Visual Studio Code
97 条回复
maxwellz
147 天前
用 cursor 吧
kdwnil
147 天前
没出现补全是因为 utils 这个包没被 main.go 导入,导入了以后就能正常补全了
LeeEnzo
147 天前
这跟 vscode 没关系,code 就是个编辑器又不是 IDE
体验不好时 Go 插件的锅,Go 插件是 Go Team 做的
Vegetable
147 天前
谁知道你要给包起什么别名?这功能是 gopls 提供的,是 golang 的官方工具,别和 vscode 绑定吧
peteretep
147 天前
老生常谈了,
vscode = 编辑器+增强
<<=
jetbrains = ide + 增强
BeautifulSoap
147 天前
@kdwnil 那么请问,当第一次在 main.go 中使用 utils 的时候怎么导入 utils ?手动移动到文件代码最上面 输入 `import "xxxx/utils"`?还是按照文档说的,通过输入包名+ . 来引用?

于是问题就回到了我帖子里说的

> 一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊。。。。。。
Trim21
147 天前
go 的 lsp 是 golang 自己写的...

所以盲猜这里也是为了代码写起来简单才选择这么实现的。这么做的话就不用搜索当前 go.mod 列出的全部包的导出符号,只需要搜索当前已经导入的包里存在的符号就可以了。
lepig
147 天前
他只是个编辑器,别为难他了

话说,一直用不习惯 vscode ,还是 JB 好用。开箱即用,不用配这个配那个,省心。
内存大点就大点吧,老了,折腾不动了
bruce0
147 天前
我也是用不惯 vscode(也可能是我不会用) 写 go 一直用 goland,写 cpp 用 clion,但是 jb 家的远程开发太弱鸡,我想用 vscode 远程到 Debian 上写 cpp,但是一直没弄好环境,体验有点差,clangd 装了,提示不太行,想要断点 debug,好像还要自己写一个配置文件, 被 ide 惯坏了🤣
kdwnil
147 天前
@BeautifulSoap #6 就按照文档的来,第一次输 包名+. ,只有第一次需要,之后这个文件调用这个包底下的所有 变量/常量/函数... 都能正常补全了

……当然啦如果这点就忍不了,我也不建议继续用 vsc 写 go ,不然到项目稍微大了点等 gopls 那超长的缓存耗时的时候 op 你更忍不了(你猜我现在为什么那么有空在回 v2 ?)
BeautifulSoap
147 天前
@LeeEnzo
@Vegetable
@lepig
在 v 站看到不止一两次说 vscode 开发 go 体验和 goland 差不多,不知道 goland 有什么优势的了。虽然不是你们说的,但对于这些评论很想吐槽,总不能吹的时候说 vscode 开发 go 体验好,一旦遇到问题了就直接切割给 gopls 吧
jay2049
147 天前
@Trim21 怎么 v2 也能抓到你
BeautifulSoap
147 天前
@kdwnil 所以问题还是那个啊,我现在的开发体验如下了:要用一个东西,输入名称发现没有补全,然后全局文本搜索,找到它属于哪个包,然后再 `包名.函数名` 导入。尤其一个文件里用到一堆包的时候。我要不停去全局搜
woodfizky
147 天前
要不然为啥 JetBrains 是收费的呢?
不过 JetBrains 有时候会过度设计。
比如你说的这种自动补全,我用的 Pycharm ,新版本,自动补全甚至能帮我在没 import 对应包的时候,自动帮我 import 那个包,然后我发现错了,手动删掉那个包的话,自动添加的 import 语句是不会帮我再删掉的。

虽然 ctrl + alt + o 能自动帮我优化 imports 吧,但是有时候忘记了,commit 的时候带着一个没用过的 import 语句,就很难受,有时候那个 import 的文件有问题还会报错。
concernedz
147 天前
我也用不惯啊,但是为了用 cursor 硬是继续使用,快捷键装插件好适应,但很多挑战,接口实现都找不到,很难受
coolcoffee
147 天前
vscode 轻的代价是懒,就像写 html 的 emmet tab 按键补全,只有刚写完那会按 tab 键会自动生成标签,光标移走再回来又变成了 tab 符号的输入。

像 Jetbrain 系每个项目打开都要索引一遍, 内存管够所以才有像 ElasticSearch 全文搜索毫秒级别的响应。
concernedz
147 天前
@concernedz 挑战->跳转
mainjzb
147 天前
从 goland 跳到 vscode 大概 2 年了,总体来说确实差不多,有些小问题习惯了。(毕竟免费啊~
楼主说的这个问题确实存在,研究了 10 分钟没有解决方案
平时使用我没感受到,因为我习惯于记住“包名” 而不是“函数名”
在楼主这种情况下,我会直接输入 utils. 等待提示后,在提示框里选一个函数。
或者更名明确的情况下,比如要切割字符串,那我会输入 stings.sp 然后按下“Tab 键”
(不需要在文件头里手动导入包

总结来说确实记住了包名。(但是我想,比起函数名,包名应该更少吧
woodfizky
147 天前
#14 另外 JetBrains 远程开发好像确实不如 VSCode ,这点反而有点不应该。
concernedz
147 天前
真的想找一个,有 goland 丰富的功能的 AI 编辑器,jb 家的 git 又好用,偏偏 ai 时代他不争气,用了很多插件,tab 补全离 cursor 差太多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1123995

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX