vscode 写 go 连最基础的补全功能都做得这么差的吗
一直用的都是 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 。我曾经以为这种功能甚至是基础到不能再基础的功能,结果没想到。。。。
纠正大家一个误解,goland/idea 的这种补全不需要记住完整名字,只需要模糊记得几个关键字就能完成模糊补全。比如上面例子我直接输入 ThisFunc 也能补全出所有符合条件的条目,如图
这种补全下,我要用一个东西,只要模糊记得它的几个关键字就行,根本不需要去记住它到底在哪个鬼才知道的犄角旮旯的包里,记忆的心智负担非常低
然后关于楼下很多说 vscode 只是个编辑器+这都是 gopls 的问题的回复,其实是有道理的。但问题是我已经在 v 站看到不知道多少次说 vscode 平替 goland 的了,体验和 goland 差不多的了
说真的,你不能只有在吹 vscode 的时候才说它完全能平替 goland ,一遇到问题(尤其是补全这么基础直接影响体验的地方)就直接切割是 gopls 的锅+我只是个编辑器为什么对我这么多要求嘤嘤嘤
用 cursor 吧
没出现补全是因为 utils 这个包没被 main.go 导入,导入了以后就能正常补全了
这跟 vscode 没关系,code 就是个编辑器又不是 IDE
体验不好时 Go 插件的锅,Go 插件是 Go Team 做的
谁知道你要给包起什么别名?这功能是 gopls 提供的,是 golang 的官方工具,别和 vscode 绑定吧
老生常谈了,
vscode = 编辑器+增强
<<=
jetbrains = ide + 增强
那么请问,当第一次在 main.go 中使用 utils 的时候怎么导入 utils ?手动移动到文件代码最上面 输入 import "xxxx/utils"
?还是按照文档说的,通过输入包名+ . 来引用?
于是问题就回到了我帖子里说的
一个项目复杂起来,那么多目录那么多包谁能清楚记得要用的东西在哪个包啊。。。。。。
go 的 lsp 是 golang 自己写的...
所以盲猜这里也是为了代码写起来简单才选择这么实现的。这么做的话就不用搜索当前 go.mod 列出的全部包的导出符号,只需要搜索当前已经导入的包里存在的符号就可以了。
他只是个编辑器,别为难他了
话说,一直用不习惯 vscode ,还是 JB 好用。开箱即用,不用配这个配那个,省心。
内存大点就大点吧,老了,折腾不动了
我也是用不惯 vscode(也可能是我不会用) 写 go 一直用 goland,写 cpp 用 clion,但是 jb 家的远程开发太弱鸡,我想用 vscode 远程到 Debian 上写 cpp,但是一直没弄好环境,体验有点差,clangd 装了,提示不太行,想要断点 debug,好像还要自己写一个配置文件, 被 ide 惯坏了🤣
#6 就按照文档的来,第一次输 包名+. ,只有第一次需要,之后这个文件调用这个包底下的所有 变量/常量/函数... 都能正常补全了
……当然啦如果这点就忍不了,我也不建议继续用 vsc 写 go ,不然到项目稍微大了点等 gopls 那超长的缓存耗时的时候 op 你更忍不了(你猜我现在为什么那么有空在回 v2 ?)
在 v 站看到不止一两次说 vscode 开发 go 体验和 goland 差不多,不知道 goland 有什么优势的了。虽然不是你们说的,但对于这些评论很想吐槽,总不能吹的时候说 vscode 开发 go 体验好,一旦遇到问题了就直接切割给 gopls 吧
怎么 v2 也能抓到你
所以问题还是那个啊,我现在的开发体验如下了:要用一个东西,输入名称发现没有补全,然后全局文本搜索,找到它属于哪个包,然后再 包名.函数名
导入。尤其一个文件里用到一堆包的时候。我要不停去全局搜
要不然为啥 JetBrains 是收费的呢?
不过 JetBrains 有时候会过度设计。
比如你说的这种自动补全,我用的 Pycharm ,新版本,自动补全甚至能帮我在没 import 对应包的时候,自动帮我 import 那个包,然后我发现错了,手动删掉那个包的话,自动添加的 import 语句是不会帮我再删掉的。
虽然 ctrl + alt + o 能自动帮我优化 imports 吧,但是有时候忘记了,commit 的时候带着一个没用过的 import 语句,就很难受,有时候那个 import 的文件有问题还会报错。
我也用不惯啊,但是为了用 cursor 硬是继续使用,快捷键装插件好适应,但很多挑战,接口实现都找不到,很难受
vscode 轻的代价是懒,就像写 html 的 emmet tab 按键补全,只有刚写完那会按 tab 键会自动生成标签,光标移走再回来又变成了 tab 符号的输入。
像 Jetbrain 系每个项目打开都要索引一遍, 内存管够所以才有像 ElasticSearch 全文搜索毫秒级别的响应。
挑战->跳转
从 goland 跳到 vscode 大概 2 年了,总体来说确实差不多,有些小问题习惯了。(毕竟免费啊~
楼主说的这个问题确实存在,研究了 10 分钟没有解决方案
平时使用我没感受到,因为我习惯于记住“包名” 而不是“函数名”
在楼主这种情况下,我会直接输入 utils. 等待提示后,在提示框里选一个函数。
或者更名明确的情况下,比如要切割字符串,那我会输入 stings.sp 然后按下“Tab 键”
(不需要在文件头里手动导入包
总结来说确实记住了包名。(但是我想,比起函数名,包名应该更少吧
#14 另外 JetBrains 远程开发好像确实不如 VSCode ,这点反而有点不应该。
真的想找一个,有 goland 丰富的功能的 AI 编辑器,jb 家的 git 又好用,偏偏 ai 时代他不争气,用了很多插件,tab 补全离 cursor 差太多了
不同的 LSP 实现不一样,比如我用 clangd 写 cpp ,就经常帮我 xjb include
#13 这个就各有取舍了,我个人选择 vsc 开发主要是要用 vsc-remote ,jetbrains 的远程开发什么情况大家都懂。另外跟站里很多人不同,我其实不太喜欢 jb 的 git 功能,太复杂了,不如 vsc 一路点加号。另外 jb 今年也不给开源项目续开源授权我也没得用。
不过说实话这些跟 go 开发关系都扯远了
#16 光标移动后 tab 就应该是输入制表符,你说的其实是 ctrl+space 重新唤起 intellisense ,在这个状态下 tab 才是补全功能(输入字母时自动切换到这个状态)。否则的话你想插入制表符时变成补全,岂不是更反直觉?
我选择使用 idea 配合其他语言的插件,少安装几个 App 也能实现 90% 的功能了( Python 、Go 都是这么玩的)。
v2 还有人说他是秦始皇呢
做的不算差吧,反正我就用 gopl 开发,没用过 golang 。可能是因为你降级体验。
你 golang 这方面效率确实高,工具那不是看人嘛,cursor 某些方面效率不是爆你 golang 。
你记不住包名却记得住精确的函数名么,项目大了你的模糊函数名太多了呢,还有解析项目耗时和内存消耗,都是要权衡的,这是 gopl 的决定,作为 go 开发者觉得免费的 gopl 并不是不能用。
哥, 创建一个 mod 文件吧。 就有了。
我最近几年一直 vscode ,感觉还好吧。
以前 goland 也用了一年。没发现有啥特别大差别。
找 symbol 不需要文本搜索,可以使用 ctrl+t 开启工作区符号搜索。
我正在做 lualsp ,vscode 不背这个锅,这是 lsp 实现问题,jb 家付费的功能更完善合情合理。
不是,vscode 就是个编辑器,就跟 vim 似的,不是 ide ,功能都靠插件扩展,这也能怪 vscode ??
这个功能实现非常简单,遍历所有 function 符号就行了,不做纯属开发者的取舍问题,你可以花点时间分叉一个更符合 goland 使用习惯的 lsp 。
vscode 整 python golang 都还不错,整 cpp 比较麻烦,体验一般。
你说 vscode 就是编辑器,我表示不同意。
我觉得需要思考重新唤起 intellisense 就是在偷懒,对于我是想要光标在某个位置产生的预期行为是一致的。
就像现在 vscode 还是没办法做到编辑 xml 、html 标签流畅的成对修改,这个十年前的 JB IDE 就已经能支持了。哦不对,现在 vscode 编辑 xml 是会提示再多按一次回车,但是如果删标签名字就不会提示,需要手动改两次。
只能说 goland 好用。
你直接写 utils. 就会自动导入包,或者写个 u 就会列出一堆候选,直接写没导入的包的函数名谁懂啊。。。
第一次先要 import 包,敲 ut->回车->敲.Th->回车
后面就可以直接敲函数名了
jb 家的远程开发扶不起的刘阿斗我也气啊。其实 jb 的 git 功能我从来不用的,一直都感觉非常不直观提交日志也感觉非常乱,只有处理冲突的时候我才觉得好用。平时我都是用的 lazygit 好处就是无论再哪个服务器上都能直接用不依赖 gui ,然后要做更复杂的 rebase 之类操作的时候切到 fork 的 gui
gopls 有这个直接写函数,然后提示都有哪些包有这个函数,选择后自动导入包的功能的。我用 helix+gopls 就可以这样。
不知道你的 vscode 哪里出问题了,我记得 vscode 能正常提示来着。
人收费那么多年肯定牛逼的地方,只是现在 jb 家 ai 功能跟不上,相对而言这点小瑕疵 ai 功能能节省更多时间。
#14
commit 的时候会自动 optimize
其实 goland 这一套习惯了的话记函数名、类型名会比记包名心智负担更低点
因为变量、函数等名称基本都是按照功能命名的,当要用到对应的东西的时候,只要回忆起几个关键字就能直接候补出需要的东西
以我这个帖子为例,我只要直接模糊地输入 ThisFunc ,就能直接候补就出 ThisIsMyHelperFunction
哪怕我都不记得这个函数完整叫什么
更实际点的就是我写了个 DumpAllMembers 函数,然后想用,那么我只要输入 DumpMem 就能靠着关键字把要的东西 import 进来了
啊原来 goland 的补全可以这样,我一直用 vscode 可能已经习惯以包名开头了。
工具而已,这个功能他有,那个功能她有,你为什么要在他和她都看不到的论坛吐槽?
“必须从所属的包开始输入吗?”
啊,我用 goland 也是这样的
“在 v 站看到不止一两次说 vscode 开发 go 体验和 goland 差不多”
没人这样说吧,goland 综合实力吊打 vscode 这是不争的事实
vsc + ai 才有一战之力,不然就 goland
吹的时候就是完全可替代
问题摆脸上了就是“就是个编辑器”是吧
当然“必须从所属的包导入”,vsc 只是一个编辑器。
需要装对应插件的吧,你用光秃秃的 VSC 自然好用不到哪里去
你要的这些功能,vscode 的一个分支 cursor 都能满足
如果是 goland ,直接输入方法名字,会模糊匹配符合条件的,回车之后会自动加入 import ,这个很好用,因为我只需要知道包名或者方法名其中之一就可以快速找到他。
去试了一下,确实不行,顺便提一下 ts 的 intellisense 是会建议所有已导出函数的,甚至连依赖模块中的也会一并列出,补全后自动添加导入。
这个应该是扩展/语言服务器自己的选择,至于为什么 go 就必须先写一次包名而 ts 能做到,我建议直接到官方扩展 repo 提 issue: github.com/golang/vscode-go 看看到底是扩展还是语言服务器问题,能不能改进
楼主我倾向于认为是你得姿势不对.
我说错了. 当我没说. 楼主你得对的.
难怪用 goland 感觉比 vscode 卡,原来是要支持无视包空间全局联想函数名,有得有失嘛
vscode+github copilot plugin 写 go 还是很舒服的
#33
"editor.linkedEditing": true,
可以开启成对修改
像我这种 go+py 的项目好像只有 vscode 是能一起写的了。。。不过现在的 ai 插件索引项目文件夹后,提示对我来说还是凑合够用了
算了吧,当时就是因为 goland bug 太多,还特别能吃内存才换成 vscode 的。
cursor 吧
我记得说是 goland 用的自己的 language server ,不使用 gopls ?
反正我也是 vscode(cursor)写 go 的时候提示啥的太慢了,回去继续用 goland 的
没想到 apt 是推荐的,是不是老人喜欢用 apt-get ? mp.weixin.qq.com/s/pGIP4cZR1b01fMGwTVsYIw debian 默认不…
NAS 全盘加密后删除密钥,就可以实现秒删大量数据( TB PB 级别)的可能。唯一缺点是 随着算力提升比如 30 年后 10 分钟暴力破解,所以删密钥仅适合有时效性的数据。 …
这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— L…