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

161 天前
 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 。我曾经以为这种功能甚至是基础到不能再基础的功能,结果没想到。。。。

9329 次点击
所在节点    Visual Studio Code
97 条回复
Meld
161 天前
BeautifulSoap
161 天前
@woniu7 其实 goland 这一套习惯了的话记函数名、类型名会比记包名心智负担更低点
因为变量、函数等名称基本都是按照功能命名的,当要用到对应的东西的时候,只要回忆起几个关键字就能直接候补出需要的东西
以我这个帖子为例,我只要直接模糊地输入 ThisFunc ,就能直接候补就出 `ThisIsMyHelperFunction` 哪怕我都不记得这个函数完整叫什么
更实际点的就是我写了个 DumpAllMembers 函数,然后想用,那么我只要输入 DumpMem 就能靠着关键字把要的东西 import 进来了
quqiu
161 天前
啊原来 goland 的补全可以这样,我一直用 vscode 可能已经习惯以包名开头了。
MYDB
161 天前
工具而已,这个功能他有,那个功能她有,你为什么要在他和她都看不到的论坛吐槽?
iyaozhen
161 天前
“必须从所属的包开始输入吗?”
啊,我用 goland 也是这样的

“在 v 站看到不止一两次说 vscode 开发 go 体验和 goland 差不多”
没人这样说吧,goland 综合实力吊打 vscode 这是不争的事实
codersdp1
161 天前
vsc + ai 才有一战之力,不然就 goland
Leviathann
161 天前
吹的时候就是完全可替代

问题摆脸上了就是“就是个编辑器”是吧
kevinxzhao
161 天前
当然“必须从所属的包导入”,vsc 只是一个编辑器。
hxy100
161 天前
需要装对应插件的吧,你用光秃秃的 VSC 自然好用不到哪里去
LawlietZ
161 天前
你要的这些功能,vscode 的一个分支 cursor 都能满足
z1829909
161 天前
@yulon 如果是 goland ,直接输入方法名字,会模糊匹配符合条件的,回车之后会自动加入 import ,这个很好用,因为我只需要知道包名或者方法名其中之一就可以快速找到他。
UnluckyNinja
161 天前
去试了一下,确实不行,顺便提一下 ts 的 intellisense 是会建议所有已导出函数的,甚至连依赖模块中的也会一并列出,补全后自动添加导入。

这个应该是扩展/语言服务器自己的选择,至于为什么 go 就必须先写一次包名而 ts 能做到,我建议直接到官方扩展 repo 提 issue: https://github.com/golang/vscode-go 看看到底是扩展还是语言服务器问题,能不能改进
chaleaochexist
161 天前
楼主我倾向于认为是你得姿势不对.

![]( https://files.catbox.moe/3xsgo6.png)
chaleaochexist
161 天前
@chaleaochexist 我说错了. 当我没说. 楼主你得对的.
lovelylain
161 天前
难怪用 goland 感觉比 vscode 卡,原来是要支持无视包空间全局联想函数名,有得有失嘛
haaro
161 天前
vscode+github copilot plugin 写 go 还是很舒服的
caiqichang
161 天前
@coolcoffee #33
"editor.linkedEditing": true,
可以开启成对修改
Biem
161 天前
像我这种 go+py 的项目好像只有 vscode 是能一起写的了。。。不过现在的 ai 插件索引项目文件夹后,提示对我来说还是凑合够用了
DefoliationM
161 天前
算了吧,当时就是因为 goland bug 太多,还特别能吃内存才换成 vscode 的。
donk68
161 天前
cursor 吧

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

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

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

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

© 2021 V2EX