首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用了VS Code、IDEA等十几款编辑器后,我总结出优秀编辑器的特质

本文最初发布于phaazon.net网站,经原作者授权由InfoQ中文站翻译并分享。

最近,我一直在尝试各种编辑器,花了不少时间配置和使用它们。主要有:

  • neovim:我日常的主力编辑器,几乎所有项目都会用它。
  • IntelliJIDEA:用来对付Java代码库。
  • VS Code:我主要用于Rust、TOML和Markdown中。
  • emacs:我很喜欢在Haskell和Rust代码库(以及YAML/Markdown/TOML)上使用它。
  • DOOM Emacs:以前见同事用过它(UI的“统一”感和顺滑体验给我留下深刻的印象),所以我尝试了一下。
  • atom:GitHub的编辑推荐,主要用于Rust、Haskell等。

本文主要谈论个人对这些编辑器和该领域现状的看法(不喜勿喷)。我使用vim,尤其是neovim已有十多年。首先,我会解释一下自己目前的工作流程、我对编辑器看重哪些方面。当然,文章仅是一家之言,不代表其他人的情况。

一款强大的编辑器应该具备哪些要素

键盘布局

我是法国人。我用的键盘布局可以快速输入法语并进行编程。其实,我用英语输入的次数更多,也许应该选择其他键盘布局,但现在用的这个体验很不错,所以一直用它。

这个键盘布局叫bépo。它要求我用所有手指打字,并且键盘上的每个键都被分配了一个指头。这样可以加强肌肉记忆并减轻手腕疼痛(当我在键盘上打字时手腕几乎不动)。打字准确和舒适的附加好处就是打字很快(我的打字速度为每分钟120到130个单词)。

不过,我认为编程时,速度并不重要,所以这里最重要的部分是舒适度:无论输入速度如何,手腕都不会动。

模态编辑器

模态编辑器之所以这么好用是有很多原因的。

首先,我很讨厌被迫使用鼠标来完成某些明明用键盘就能搞定的事。例如,我在自己的机器上运行应用程序只需用alt d,程序名称(自动完成会补足程序名称)并按回车。所有这些全都用键盘完成。这种方法是针对firefox、kdenlive等程序的。至于终端应用程序,我只需要在终端中输入并自动完成即可。

简言之,我认为用鼠标在编辑器中的光标周围移动太麻烦了,尤其是我们大多数时间都在写代码(即敲键盘),因此,用鼠标移动意味着要多次在键盘和鼠标之间切换。也许你不在乎,这对你来说很酷,但对我而言,这确实是很可怕的体验。

另外,非模态的现代编辑器通常使用箭头键来移动光标,但这些箭头键要么在你键盘很远的位置,要么就没有单独的按键,而要用组合键来代替。

这就是模态编辑器的第一个好处。它们更聪明地使用键盘来实现简单而常用的功能,例如四处移动。

第二个好处是它们还有非模态编辑器的模式(即正常模式),你会有一个完整的键盘/很多按键来绑定常用的许多鼠标动作。你可以将编辑器划分为几个缓冲区、在缓冲区间移动、跳转到段落开头、搜索和替换、将动作注册为宏并重播它们,等等。

所有这些甚至都不用挪动手腕。如果你习惯用鼠标,那么这里的学习曲线会很陡峭,但一旦你克服了心理障碍,我觉得再回去用鼠标就会非常不适应了。

我喜欢四处移动

程序员在编程时有几种风格:

  • 在模态编辑器中使用箭头按键或h j k l移动,看光标在文档中的移动方式就能看出来。通常他们会按住一个键,直到光标到达目标行,然后再按下另一个键,直到光标到达给目标列,最后再细调光标位置。
  • 使用鼠标,直接点击想要放置光标的位置。
  • 使用相对数字。这是第一种风格的增强版本:他们通常使用相对数字来定位要快速跳转的目标行,这样就不必按上/下方向键了。他们会查看代码行的行数,输入目标数字就跳转过去了。接着使用vim中的典型动作,例如$(转到行尾)、f(转到在f之后键入的下一个字符的第一个匹配项,例如f(将使光标移至下一个(上)、%(转到匹配的定界符)或w(转到下一个单词的开头)/b(转到上一个单词的开头)等,在一个代码行上快速移动(这种方法也可以跨行工作)。

绝大多数程序员都属于这几种风格之一,但实际上,我自己是个异类。我使用h j k l和第三组中描述的vim的所有动作(我用的动作还要多很多),但这都取决于我需要移动的距离。如果我的光标位于一个单词上,并且我想移至与我的光标在同一行上非常接近的另一个单词的开头,那么如果相隔三个单词,我将只输入www(或者3w)。如果距离较长,我会使用一个名为[EasyMotion]的工具。

Easymotion确实是一个很棒的工具。它有几种模式,具体取决于你要执行的移动类型:

  • 按行:此模式允许你跳至当前(或所有打开的)缓冲区中的任何行。
  • 按单词:此模式允许你跳转到当前(或所有打开的)缓冲区中的任何“单词”。
  • 按字符:如果单词模式无法跳转到特殊的运算符或字符(因为无法识别为单词),则可以使用此模式跳转到当前缓冲区(或所有打开的缓冲区)中的任何字符。
  • 它还有其他一些模式,但是我从来没有真正为它们找到对应的用例。

我习惯的做法是将三种模式映射到<leader>l<leader>w><leader>c上。

在我的当前缓冲区中键入SPC l会发生:

键入任何高亮显示的字符将使我的光标跳至该字符。对于单词也是如此,命令是SPC w

对于字符模式,输入SPC c后我必须按另一个字符(我想跳到的字符)。假设我们要跳转到一个#(不是单词的一部分),则输入:SPC c #:

这种移动方式初看上去并不直观,但一旦习惯就离不开它了。

其他模态技巧

对模态编辑而言,以下是我希望编辑器具备的功能列表,当然不止这些:

  • C-iC-o:这些使我可以跳转到缓冲区中的某个文件/某个位置,然后返回到C-o之前我所在的位置,或者输入C-i再跳过去。
  • 宏和寄存器:我可以指定单个按键将内容粘贴到不同的寄存器(如剪贴板)中。例如,我可以使用"tyit寄存器中添加一些行("是动作触发,t是寄存器编号,yi是首尾字母,(是匹配值),然后用"tp剪切这部分内容。宏可以通过指定按键来实现更强大的编辑控制,q关键字是触发键(例如qa会将之后的按键动作注册到a宏上),然后使用@a重播该宏即可。
  • 所有基本的vim移动方法,例如d(删除)、y(复制)、c(更改),t(转到要搜索的字符之前的字符),(转到另一个定界符),等等。以及更复杂的文本操作,例如“让我们更改此函数参数列表中的内容,并用(定界”:ci(

总之,编辑代码时我们需要模态功能。

编辑器

下面就具体讲讲前面提到的那些编辑器。我会对它们发表自己的看法,根据我的编程习惯给出它们的优缺点评价。

neovim

我目前使用neovim的TUI版本,因为到目前为止,这带给我最稳定、最快、最简单的neovim体验。我尝试过多个GUI版本,但没有找到想要的东西——主要原因是它们几乎都使用Web™技术,这对我来说是不可接受的。我应该详细说明一下最后一点的原因。

为什么不使用Web技术:

  • 在计算机上编辑内容与Web技术无关。其他许多事情都适合用Web技术,但在很多层面上,在编辑器中运行复杂的JavaScript VM/CSS引擎并不是什么好事情(性能是第一个麻烦)。
  • 大多数时候,基于Web技术的编辑器需要花费很多时间,甚至VS Code都是如此——我的日常编辑器是neovim,它能在23ms内加载差不多50个已安装的软件包(你可以使用:profile进行分析以获得这个数值)。而coc.nvim大约需要12ms。
  • 脚本。用JavaScript或CoffeeScript编写脚本对我来说很难。
  • npm是有史以来写得最糟糕的软件之一。请不要再让我用它。

我的neovim设置

这里,我介绍用的几个插件。我认为大家应该了解这些知识,不要还是把vim/neovim当成是过时的编辑器。事实并非如此。

  • ryanoasis/vim-devicons 添加许多unicode图标以便其他包使用,以提供更时尚、更性感的界面体验。
  • sainnhe/sonokai 我正在使用的颜色方案。它与DOOM Emacs很像,只是对比度略低。
  • neovimhaskell/haskell-vim neovim的Haskell语法支持。
  • rust-lang/rust.vim neovim的Rust语法支持。
  • plasticboy/vim-markdown neovim的Markdown支持。neovim已经为Markdown提供了很好的默认支持,但是这个软件包有一些很酷的功能,例如折叠。因为我经常使用折叠,所以很喜欢用它。
  • mzlogin/vim-markdown-toc 一个非常酷的软件包,提供了一种在Markdown缓冲区中创建目录的方法,并让neovim在编辑标头时自动更新section。
  • tikhomirov/vim-glsl neovim的GLSL语法支持。
  • cespare/vim-toml neovim的TOML语法支持。
  • ElmCast/elm-vim neovim的Elm语法支持。
  • idris-hackers/idris-vim neovim的idris语法支持。
  • posva/vim-vue neovim的Vue.js语法支持。
  • baskerville/vim-sxhkdrc neovim的sxhkd支持。
  • norcalli/nvim-colorizer.lua 一个超酷的扩展,可以自动更改包含十六进制值文本的背景颜色,例如#f8324F或#42cf69。
  • airblade/vim-gitgutter 我安装的最好的插件之一。它提供了在编辑git版本文件时在缓冲区中看到的标志(添加、修改、删除等):它能做的事情还有很多,甚至可以预览hunk,在编辑器内部暂存或丢弃它们,对我来说太好用了。
  • tpope/vim-fugitive 为neovim提供git中你喜欢的所有功能,包括diff、解决合并冲突、编写提交消息等。但是我还不太明白这个插件在一般情况下如何处理fixup和squashing问题,因此,我仍然倾向于使用命令行。
  • rhysd/git-messenger.vim 这是一个blame-at-cursor工具。其实,它也没那么有用,因为fugitive已经有了一个git blame窗口,能用commit注释每一个代码行。有时我会用这个,但也可能会放弃它。
  • tveskag/nvim-blame-line 在代码行的右侧内联一个git blame。很像VS Code中的默认git插件。
  • junegunn/fzf.vim 如果你只想安装一个插件,那留下来的肯定是它。它有许多功能:打开文件、git文件、缓冲区、rip-grepping、搜索历史记录、命令、颜色方案等等。顾名思义,它使用fzf作为后端,因此你会得到非常酷的模糊搜索体验(其他编辑器很少有这么棒的搜索——例如,你可以键入一些内容,然后放一个空格并再次输入,就能快速匹配结果了)。
  • machakann/vim-highlightedyank 很有意思的包:它能高亮显示你拖动的线条/对象以获得更好的视觉反馈。neovim默认竟然没有这个功能。
  • liuchengxu/vista.vim 我经常使用这个包来获取符号树,但我现在不太满意它的输出,可能也会抛弃它。
  • neoclide/coc.nvim 它是neovim目前最好的自动完成引擎。我也用过其他选项,例如ale,但这个包是王牌。它为你提供了多种语言的LSP补全。它有一个集成的市场,可安装新的LSP服务器和集成,它甚至还支持一些完全不相关的东西(有点奇怪,我认为这些应该是独立的插件),例如coc-explorer(它是 NERD Tree的替代),coc-snippets等。
  • tpope/vim注释 轻松注释/取消注释行,而无需自己插入注释符号。
  • liuchengxu/vim-which-key 就像emacs的which-key,但适用于neovim。正确设置后,它将为你提供一个可行的键绑定的可视列表。我认为它没什么用(或许有人安装的插件带很多键绑定,就会喜欢它吧),但是它看起来很酷。
  • itchyny/lightline.vim 看起来很酷的状态行。
  • SirVer/ultisnips snippet支持。ultisnips的代码片段引擎能力很强,例如通过shell、viml、python等进行插值。
  • honza/vim-snippets 常用语言和文件格式的snippet集。
  • junegunn/vim-easy-align 一个非常简洁的插件,只需点击几下即可轻松对齐文本/表格。
  • liuchengxu/vim-clap 它有一个现代化、快速的用户界面,在其中统一所有可能的搜索/模糊查找器源。不幸的是这个插件在我这里还不够稳定,因此我还在继续使用fzf。
  • easymotion/vim-easymotion

neovim的优点

  • 它很快。真的是立即启动。无论我使用的是哪种终端(即使我当前使用的是Alacritty),移动、滚动等操作都会很流畅。
  • neovim的插件和效果确实很棒。我非常喜欢vim-gitgutter;我也很喜欢着色器插件。目前为止,coc.nvim一直很好用(大部分情况下)。EasyMotion简直是我的情人。fzf太快了,快如闪电。
  • neovim的社区对他们的工作充满热情,新版本添加了许多非常酷的功能,我们很快将它们引入新的插件中,例如弹出/浮动窗口/用于linter注释的虚拟文本等。
  • 它是轻量级的:你的内存不至于不堪重负。
  • 我还没提过vim/neovim的杀手级功能:help页面。我认为没有其他软件可以提供如此出色的帮助页面。真的,请尝试一下。你想知道如何配置coc.nvim吗?只需键入:help coc-nvim即可。
  • 带有插件管理器(我个人使用vim-plug,还有其他很多选项),它们能让你的生活变得更加轻松。

neovim的缺点

  • 尽管我喜欢TUI的速度(到目前为止,我确实还没见过更快的编辑器),但TUI对我来说,还是很烂。例如,如果你将一个窗口分成两个缓冲区,则你想要调用的垂直“标记”“边缘”都是实际的Unicode字符。终端的工作机制可以忽略那些字符,但仍会给人很笨的感觉。如果你想要minimap或某些文本周围的细边框,或者想要稍微复杂一些的视觉反馈,基本上都是做不到的。
  • neovim的GUI……不符合我的期望。它们大多数都是基于Web技术的,因此对我来说不是很好的选项。其他基于Qt的客户端感觉有些过时了。也有人想要做些新的GUI,但他们还没有准备就绪。
  • coc.nvim有时会感觉很奇怪,容易出问题。例如在编辑Java时,尝试跳至符号的定义(或只是向上查找符号)时,它经常会超时,体验很差。
  • 在编辑器运行时更​​改我的颜色方案是在浪费时间,而且会造出来很多损坏的语法高亮模式bug。真可惜!

IntelliJIDEA

这个编辑器,我只能简单谈一谈,因为我才开始在工作中使用它(社区版)。我用的是原始版本,几乎没有修改。我只用它编辑Java。

IntelliJIDEA的优点

它对Java的支持确实很完美。它能为你做很多事情,其中​​一些真的给我留下深刻印象:

  • 允许我在函数内选择代码块的重构机制,要求编辑器“将其移至专用函数中”。其实,所有编辑器都可以做到这一点,但令我印象深刻的是,IntelliJIDEA能找出需要捕获的变量并将其作为函数的参数,然后在替换要移动的块时自动传递它们。真的很整洁。
  • 查找符号、查找实现的函数、继承的类、超类……速度都快如闪电,并且都可以很好地呈现给你,我喜欢。
  • 语法高亮很不错。我特别喜欢var声明以及将参数传递给函数时的内联类型说明。

IntelliJIDEA的缺点

  • 我正在使用社区版,它仅支持Java和其他一些配置语言。你没有profiler这样的东西,将来要是能加进来就太好了!
  • 尽管编辑器的异步部分令人印象深刻,但有时它会时不时索引项目,如果你使用的是笔记本电脑,那就做好电脑全速运行的准备吧!风扇会发出地狱般的声音,机器会迅速变热。
  • 我尝试了Vim集成,但无法正确地与bépo键盘映射搭配使用。我无法重新映射某些运动和/或模式开关,结果只能遗憾地禁用它。
  • 没有Vim支持,即使编辑器有很多快捷键,你还是要用鼠标来执行一些非常基本的任务。

VS Code

这个编辑器是很重要的,因为它是微软的编辑工具。大家似乎都很喜欢VS Code,我也能感同身受。它的UI流畅、快速——要知道这可是基于Web的编辑器。LSP支持显然是很专业而完美的。它有很多社区插件、主题和集成。就算它是基于Web的,总的来说,我也一直很喜欢它。

VS Code的优点

  • 编辑器/UI的流畅度。
  • 语言支持很专业,并且用它编辑代码感觉很可靠。
  • 数以百万计的插件。
  • 大型社区和今天的大多数人都在用它,所以我想如果你遇到什么麻烦,随便问一下应该就能得到答案。

VS Code的缺点

  • 毕竟,它还是用Web技术编写的。在所有基于Web的编辑器中,它是最快的,但如果你习惯使用vim/neovim,就很难满意它的速度了。
  • vim集成不够好/无法正常工作(我尝试将h映射到c,请记住我用的是bépo键盘布局)。总之就是没法用。

emacs和DOOM emacs

我最近一直在使用emacs(原始版本),因为我看到一位同事在使用DOOM emacs,就开始尝试了。这两款编辑器放在一起介绍,因为它们非常像。在我看来,emacs和DOOM emacs的关系可以用一个词来概括:团结。我不知道他们是怎么做到的,但是所有插件互相之间都融合得很好。我使用ivy界面做自动完成和模糊搜索,一切都做得很好。UI非常漂亮,主题很棒(我喜欢默认的深色主题DOOM One),编辑器非常快——当然还是比neovim慢,尤其是在滚动时,但总比基于Web的编辑器快得多。

emacs/DOOM emacs的优点

  • 一旦设置正确(更好的默认设置等),这个编辑器就会给人很现代化的感觉(就像你在VS Code/atom中体验的一样)。它很流畅且设计精良。
  • Evil模式(Vim模式)对我而言是最好用的(当然,除了vim和neovim本身)。它们涵盖了几乎所有内容,甚至还支持EasyMotion!
  • 你可以使用Lisp编写/配置脚本,这真是太好了!Lisp是一种老派的精英,它已经存在很长时间,并且仍然给人新潮的印象。我很喜欢这一点。
  • 如果你使用的是DOOM emacs,那么就能免费获得许多小实惠。它的模块方法效果很好,并提供了一种非常新颖的方式来启用/禁用功能。社区有大量资源可以帮你学习使用DOOM emacs,即使你不打算使用emacs或DOOM emacs,我也强烈建议你看一看。例如,我就是通过这种方式发现了我现在在neovim中使用的which-key。
  • LSP集成非常好用。它会为你下载服务器,如果你打开的文件从来没有连接过服务器,它会礼貌地询问你是否想要这样做。
  • 总的来说,emacs和DOOM emacs比vim或neovim等编辑器更具交互性,我认为这种方法更好用。
  • 它使用gtk作为Linux上的主后端。我觉得这一点很值得一提,因为它不是基于Web的!
  • Magit是一个很棒的工具。
  • Org-mode也确实很棒,虽然我觉得它对我来说太大了。
  • daemon模式很厉害,我认为所有编辑器都应该有这种东西。它允许你启动一个emacs实例并将emacsclient连接到它,从而彻底避免了加载时间。非常厉害,非常有用!

emacs/DOOM emacs的缺点

  • 浏览大量代码时会出现卡顿,有时让人感到很不爽,特别是当你习惯用vim/neovim的话。大多数时候,这应该没什么问题,但是请记住,在emacs中滚动一直是一个问题。
  • 尽管这甚至可以看作是一个优点,但我认为emacs的所有出色插件让它膨胀得太厉害了,这对我来说是个问题。例如,Org-mode是一个很棒的软件,如果它是一个独立的应用程序就好了,能让更多的人受益。开始使用emacs,意味着你的计算机要运行emacs以及emacs中的所有应用程序。它甚至有一个IRC插件和一个电子邮件阅读器插件!
  • 我不确定这是怎么回事,但是LSP服务器感觉……同步吗?首次打开文件时,LSP服务器启动,你需要等待几秒钟才能进入文件。我真的不知道这是否是因为配置的原因,但总之感觉不爽。
  • emacs的默认设置确实非常糟糕。而且为了让整个过程像DOOM emacs一样舒心,你需要花费大量时间阅读文档并调整配置。我很喜欢这样做,但到头来……为什么emacs不从一开始就设置好这些默认值呢?这是出于历史原因,然后现在没有人在乎吗?

atom

最后来谈GitHub的编辑器atom。我记得我首次运行atom时的第一反应是:“这个编辑器真漂亮。”默认的颜色方案One是大家都熟悉的通用颜色方案。在许多不同的编辑器中都有这个方案的fork。

对我来说,atom看起来很像VS Code,但是前者的UI比较漂亮——与VS Code相比,我更喜欢atom的UI。它的UI流畅且非常干净。从LSP集成到Markdown预览和Vim模式,你都可以找到许多扩展/插件/主题。

atom的优点

  • 对我来说,atom的杀手级功能是它能告诉你,你正在按下的按键绑定了(或清除了)哪些命令。很容易调试键绑定问题,我希望有更多的编辑器有同样的体验。其他编辑器也有类似的功能,但不如键绑定的echo模式那么好用。
  • 它的主题非常酷,整体的打字体验/自动完成过程非常可靠且一致。
  • 有很多可玩的插件。

atom的缺点

  • Vim模式。它对我来说并不完整,因为它也不能很好地支持我的bépo键盘布局。更糟糕的是,他们在alt-gr上有一个怪异的错误(他们在配置中称其为altgraph),无法正确识别它。有时它可以工作,但我从不记得要解决此问题所必须采取的步骤,而且在大多数情况下,我花了很多时间只为这么一个非常基础的功能而已。
  • 太慢了,你能感觉到Web世界的恶意!
  • 有时,编辑器更新后插件会损坏,然后你就少了一个功能。我在使用其他基于Web的软件(例如GNOME桌面环境)时观察到这个问题,这让我越来越怀疑这种技术选择。

总结

当开始编程时,我记得见过有人谈论IDE/编辑器之战。如今,由于我尝试了许多编辑器,因此可以说并不存在所谓的编辑器战争。所有编辑器都有自己的缺点,选择合适的编辑器往往取决于个人习惯和经验。我是键盘爱好者(我自己做键盘),而且我真的很喜欢打字——不一定是代码,因此emacs和vim在那时是很明显的选项(我实际上是从emacs开始编码的)。几年后,我开始使用vim和neovim。一年前,我又开始尝试emacs,想要看看它发生了什么变化。结果我发现它多出来这么多有趣的事情!

我喜欢测试编辑器,是因为每个编辑器都至少有一个同行没有的杀手级功能:

  • vim和neovim具有模态编辑功能,并且速度很快。几十年来,它们一直是模态编辑的首选编辑器,并且所有运动、宏、命令和助记符在这两种编辑器中都是实现最好的。
  • 对我来说,IntelliJIDEA有着最好的Java体验,并有令人印象深刻(非常有用!)的重构功能。它并不是提高你生产力的必要选项,但它会让你在使用Java代码库时感到轻松自在,我真的希望在我使用的编辑器中有这么一个插件!
  • VS Code有最佳的LSP实现,并且它的社区是最大的。如果你喜欢基于Web的编辑器,那就不要浪费时间再寻觅了:它就是适合你的编辑器。
  • emacs和DOOM emacs具有流畅、统一的界面,其中包含许多出色的插件和应用程序。你会非常中意Org-mode、Magit和其他许多插件!
  • atom具有用于键绑定的echo模式,用于主题和语法高亮显示的默认值也很棒,并且是市面上最友好的编辑器之一。

在所有这些编辑器上花了几周时间后,我对vim/neovim有了一些新看法:我觉得并不一定就要用它们,尤其是我用上了emacs/DOOM emacs的Evil模式。在我看来,一个好的Neovim客户端可能是像emacs这样的gtk应用程序:流畅、统一、具有出色的默认设置和对neovim功能的全面支持,以及对gtk浮动窗口和弹出窗口的支持(因为它是neovim原生支持的,在TUI中感觉有点麻烦)。我们有了很多不错的插件,可用于git(fugitive/vim-gitgutter)、自动完成和语法高亮显示(coc.nvim/vim-lsp/vim-treesitter)。我唯一缺少的是一个出色的GUI,它可以利用我们在TUI中要做的“hacks”来提供弹窗、“气泡”之类的东西。一旦有了好用的Neovim GUI,我想这就会是我最喜欢的编辑器了。

在那之前,我会一直坚持使用neovim TUI,因为它与我想要的东西非常接近。我希望本文能对vim/neovim爱好者提供一些参考,帮助大家了解现代编辑器的方方面面。这里我说的是Vim爱好者,但不是所有人。

我们寻觅的东西都是不一样的,而这个美好的世界有这么多编辑器可供选择,这才是关键。

它们并不适合每个人,但每个人都有自己的最佳选项。

原文链接:

https://phaazon.net/blog/editors-in-2020

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/pkZHoPlHOc4NBls66v6d
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券