
著名的代码编辑器:Microsoft Visual Studio Code、Github Atom、Sublime text、Adobe Brackets
最推荐的一种:Atom
推荐理由:
链接:如何评价 GitHub 发布的文本编辑器 Atom?
作者:韦易笑
用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是工作上用他们写过代码的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。
Atom 唯一的槽点就是“卡”,不过那是去年的情况了,10后性能数次大提升,比起sublime/vsc之类虽不算流畅,但同时编辑20个数千行的文件没有压力。如今让人感觉慢的地方主要是启动loading(也大大短于eclipse, idea),使用时并没察觉它比其他编辑器慢再哪。而文本编辑器的快慢,更重要的是“让你工作更快更有效率”。下面说说为何 Atom比其他更有效率:
兼容VIM模式
这无疑团结了一大班 Vim过来的用户,Sublime虽然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上其作者经常神秘消失,最稳定的2x版本已三年没有更新,这些问题一直得不到修正。
由于Atom的定制程度直追 Vim/Emacs,它的vim模式能够使用插件来实现,而不像sublime必须builtin,Atom的VIM模式除了官方实现外还有很多用户实现,各有所长,你不喜欢可以换,Sublime就傻逼了,觉得builtin的不行,你就没办法了,而且作者不更新你也没办法。
Atom里的Vim模式并不是强制的,你可以用也可以不用,这样入门用户也不会觉得困难,但是如果你用惯Vim的话,使用Vim模式可以取得更好的效率,我觉得Vim/Atom-VimMode能够提升效率的地方有以下三方面:
1 手指不离开主键盘区:
所有功能皆能在主键盘区完成,不用去按方向键,不用把手挪去按Home/End,更不用动鼠标。就像咏春中强调中线理论,认为一切动作围绕中轴线开展,守护自己中轴线的同时攻击别人的中轴线。Vim/Atom-VimMode中,双手不但从不离开主键盘,并且八根手指随时守护再HOME位(ASDF, JKL;)有动作就移动,然后马上归位。
2 细粒度微 *** 作:
星际/dota玩的好,微 *** 基本功,微 *** 又快又精确,Vim/Atom-VimMode一样,比如:
if (xxxx) {}
很多人编码时习惯“成对编码”,写了申请资源的代码,先把释放资源写了,写了左括号,先把右括号给补充完,当你写完第二行代码时,需要用到“再1-2行中间插入一行”,此时你的光标停留在第二行,传统编辑器你需要:按上箭头移动光标到第一行 -> 按END键去到第一行末尾 -> 按回车插入一行,mac下的END键还需要用CMD+右来组合出来,而Vim/Atom-VimMode中,你只需要shift+o即可,手指完全不离开主键盘区,不用像传统编辑器那样,右手先移动到箭头区又移动到HOME的小键盘区,再移动回主键盘区这么麻烦,类似还有:
使用o直接再下一行插入,避免 END/回车
使用I再行首插入,避免移动半天光标。
向前/后移动一个单词到单词头、尾。
快速更改当前单词,用/来快速搜索移动光标。
dd+p来快速移动代码块,取代shift+方向键半天。
shift-j 来两行合并成一行,代替 HOME, back 若干次。
。。。
你再编辑代码的时候,90%的情况可以直接一步完成,这就叫细粒度微 *** ,而且整个过程手都不需要离开主键盘,不像传统编辑器那样,若干笨重的 *** 作组合再一起, *** 作不够细步骤多的同时手还要再:主键盘区,方向键区,扩展键区 来回移动,效率奇低。而Vim/Atom-VimMode下,手指随时守护在home区(ASDF JKL;),所有微 *** 都是围绕HOME区进行,不会移动到任何主键盘以外的区域,更别说用鼠标、触摸板。
3 批量 *** 作:
比如要给下面代码每行后面加一个分号:
var x = 1var y = 2var z = 3consolelog('result is ' + (x + y + z)toString())
一般做法是:移动光标到行末->END->分号->移动光标到下一行,Vim里面不需要移动光标到行末,只需循环敲入:“A;<ESC>j” 即可,本来 *** 作就少很多。这还不是最少 *** 作,更少 *** 作是利用Vim里面的句号“”功能重复上一次 *** 作,即第一行“A;”补充了一个分号后,第二行只需要按一下""即可重复,于是最后 *** 作变为:
第一行:A;<ESC>
后面所有行:J
超级爽快的 *** 作,这样的 *** 作还很多,你还可以单条命令对一万行代码重复上述步骤,或者把c代码拷贝到go里面先一句话把所有分号给删除了。Vim下面的名言:绝不重复。
总之如果你熟悉 VIM模式,用 Atom能感到完全自由的方式,随心所欲的书写代码,而不是被书写这件事情费脑筋,解放大脑完全用于思考而不用于打字。但是同时对不习惯VIM的人照样友好,或者对想使用VIM的便利却又痛恨VIM这个软件的简陋的人带来了福音。
脊椎记忆
“同样动作重复300次,肌肉就会有记忆,而一个动作重复600次,脊椎就会有记忆”
-- 李小龙
编辑器就是关于脊柱记忆的东西,所以多投入一些时间去了解你使用的编辑器,掌握他们的各种快捷 *** 作和高级功能是一个能让你事半功倍的好主意。
格斗游戏玩的好的人有很多,下等高手靠熟练,中等高手靠反应,上等高手靠意识。更熟练的掌握你的编辑器,让更多日常工作固化成记忆记录再你的脊椎上,使用的时候,脊椎这枚协处理器就能完成代码编写,一个 *** 作,刚一想到,脊椎就自动执行出来了,小脑腾出空间来组织判断,大脑腾出空间来思考更重要的东西,就像你走路,你不用思考迈腿那么自然,别人一拳过来,你潜意识一动,一连串动作就出去了,一只飞蛾飞过来,你潜意识的闭上眼睛保护眼部,这就是脊椎记忆,如果还要经过大脑绕一圈,反应慢不说,大脑这颗cpu都用在这些琐事上了,思考的时间自然少了不少。
所以从内到外的了解你的编辑器,并且熟练掌握他们,是对你提高工作效率的最佳投资,Atom的全平台支持,开放源代码,深度可定制等三个特点,比起其他闭源的,平台支持不全的,扩展少的编辑器来说能让你有不同层面的了解机会,同时为你提供足够的空间。
深度可定制系统
Vim/Emacs的精髓在于:“可以调教”,本来不顺手的东西,只要容易调教,假以时日,都会慢慢变得越来越顺手,越来越“懂你”,越来越“贴心”,以至于后面大家都离不开它了。而 Atom 也同样是一款容易被你调教的编辑器。先前给vim写过插件,给sublime写过插件,如今给Atom写过插件,横向对比下来,几个结论:
插件能做事情多少:Atom > Vim >> sublime
插件开发学习门槛:Vim > Atom > sublime
插件开发文档丰富:Atom > sublime >> Vim
Atom 的定制化程度远远高过sublime之类(不用实际看法,看看双方开发文档即可),直追 Vim / Emacs,sublime的大部分定制无外乎改改json,插件能做的事情相当有限。
Atom 的定制化系统主要有三方面:
1 细致:
设计之初就考虑的事情,方方面面都能定制,见官方文档,以及插件:vim-mode,minimap (稍微了解下这两个类似的功能再 Atom 和 sublime的实现就能知道 sublime被甩了多少条街了)。可以细粒度的控制编辑器内所有行为,小到移动一下光标,删除当前一个字符,大到打开一个面板,比如 “core:more-up” 可以向上移动一行光标,“window:focus-pane-on-left” 可以把焦点设置到左边的面板,atom内核和大量第一方第三方packages 都是以命令的方式把基础功能提供出来,你可以随意互相调用或者设置热键。
除去命令外的API层面,几乎每个部件每个像素点都可控,比如这样的插件你永远无法再 Vim / Emacs / Sublime 下面见得到:activate-power-mode。
2 直观:
由于使用 javascript/coffee进行开发,但 javascript/coffee是属于即便你没写过他们,读都能读得懂,VimScript就不一样了,虽然也能做相同的事情,但实话实说,晦涩难写,比如我要取得当前文件的路径和文件名,在 VimScript里面需要这么写:
let l:path = expand('%:p:h')let l:name = expand('%:t:r') 或者 let l:name = expand('%<')
而在 Atom 里我们用atom自己的功能直接取出路径来,然后进行切割:
var fullpath =atomworkspacegetActiveTextEditor()getPath();var filename = pathbasename(fullpath);var filepath = pathdirname(fullpath);
就问大家一下?哪段代码更友好直观?你一眼就知道在做什么?你更愿意用按照哪段代码进行插件开发?是上面的VimScript?还是下面的 javascript ?
结论是很清晰的,Atom的 javascript开发插件更简单直观,即便没文档,看别人怎么写的自己也会了,同时灵活性大大高于VmScript,各种事件处理回调,javascript天生擅长做这些事情,还有第二行,第三行,我们用到了 nodejs 的 path模块,进行文件路径切割。这样的写法,再VimScript 里面基本是无法想象的。
Vim是强大,但是毕竟是30年前的东西了,即便最熟练的 Vimer 也都承认 VimScript 的晦涩难懂,阻碍了很多人为其开发插件。而给Atom开发插件,只需要掌握javascript,掌握 javascript的人很多,学习了javascript你也可以用在很多地方。不像VimScript那样只能用在Vim里面,而正因为其晦涩,Vim新版本开始支持内嵌 python的写法:
python << EOF
import random
print randomrandint(0,10)EOF
VimScript中 Python等动态的支持正是说明其开发维护者也承认 VimScript本身的古老,对比现代编程语言已经有些格格不入了,缺乏强大的描述能力,难以构建复杂的功能模块,才会去支持Python内嵌这样的写法。可大量的工作还是需要再Python之外完成,同时,并非所有平台自带的Vim都支持python,除了mac外,所有debian / ubuntu 发行版自带的Vim都不支持 Python。导致你想写一个通用的扩展还得判断下是否 has('python') 没有的话老老实实用 VimScript 去实现它,这不是折磨人么?
Sublime里面可以用原生 Python 写扩展,比 VimScript爽,但是 sublime 的插件能做的事情还不及VimScript的一半,所以怎么能指望他们能写出高端的功能来呢?
3 强大:
Atom的内核 Electron (原来的 Atom-shell)可以理解成:Chromium + NodeJS,而整个Atom的界面,你可以理解成就是一颗 HTML 的 DOM 树结构,这意味着你可以这样:
var div = documentcreateElement("div"); divinnerText = "abc"; atomworkspaceaddBottomPanel(div);
就可以简单的在 atom 里面增加一个显示对象,这意味着再给div加个 html的 onclick就可以实现GUI交互,界面上的对象随便写点html代码就可以控制效果,意味着你可以使用 jQuery 来为atom增加新面板,意味着你只需要写一个简单的 css 文件就可以把 Atom 整个编辑器的外观给修改了。这在 Vim/Emacs 中是几乎不可想象的事情,sublime基本就别提了。
大量的前端开发技术和 NodeJS 基础模块供你任意使用,正是由于近年 Chromium / nodejs 系列技术的成熟,和 Atom / Visual Studio Code 这类基于前端技术的客户端软件的成功,让我看到了客户端(桌面+移动)软件开发的新方向。
做VIM/Emacs不能做的事情
Vim/Emacs过去给人的映像是:几乎能做任何事情,确实如此,但毕竟是二三十年前的东西了,而他们一直坚挺到现在一方面是 *** 作便利,更重要的是这么长时间还没有出现一款又开源又具备同样 *** 作便利性和可扩展性的编辑器,所以Vimer, Emacser 们最乐意展示给别人看的就是他们又安装了什么插件,急于展示可以把 Vim / Emacs 装扮成了一个多像 IDE 的东西,而今天这个“可以做任何事情”的高度可定制特性已经被Atom所吸收并完全超越,就像 Atom 的开发blog:“ Introducing Atom” 上说的一样,对易用性和可展性 “决不妥协” :
We think we can do better Our goal is a zero-compromise combination of hackability and usability: an editor that will be welcoming to an elementary school student on their first day learning to code, but also a tool they won't outgrow as they develop into seasoned hackers
抛开易用性的这个 Atom 的明显优势不说,前面其实已说了不少 Atom 比 Vim/Emacs 更灵活强大的地方,可能有些人还有疑惑,不是说 Emacs “没有不能做的事情” 么?你看 Atom的面板里面可以嵌入一个 Terminal,Vim/Emacs一样可以嵌入啊,为何还说 Atom 比它强啊?
没错,Vim用久了会产生心理舒适区,多模式编辑使人神清气爽,命令化文本处理让你赏心悦目,但是受限于本身机制用久了会容易痛苦挣扎:虽然vim的各种扩展似乎什么事情都能做,但每个扩展却只能做到70分,总有那么30%的地方做不到位。所以用的时间长了,上半身爽的要死,下半身痛不欲生。。。。
Vim/Emacs即便大部分扩展功能也都可以称为“能用”,可几十年的历史包袱太沉,很多事情对他们来讲就是禁区,比如诡异的标签功能,容易误 *** 作的buffer/窗口切换,缺乏异步机制,编译时间长只有傻等着,无法跟Atom一样边读代码,边运行程序看结果,对照输出结果和源代码找问题,连实现个内嵌终端都用了若干年,还实现的那么别扭。。。。。。。。。
这类硬伤有许多,再举个最简单的例子,minimap,就是 sublime那种大家喜欢的文档缩略图,这个现代编辑器必备的功能,谁能用 Vim/Emacs 实现一下看看?Atom 可以衍生出 Visual Studio Code 这样漂亮的编辑器,Vim/Emacs能衍生么?Atom可以随便用各种先进的前端技术,不当可以嵌 Terminal我甚至可以再 Atom 嵌入一个 js版本的 DOSBOX 玩老游戏《命令与征服》:
>
Play DOS games online
当然这样并没有任何卯用,但是如果在 Atom里面内嵌一个浏览器,方便的实时预览html/css的效果呢?或者 Atom 里面内嵌一个 Markdown Previewer ,实时查看 Markdown 的效果呢?请问 Vim/Emacs 里怎么实现法?
Atom插件演示:markdown实时预览,左边写右边即时更新,100%兼容github的markdown语法
Atom插件演示:正则表达式图形化,鼠标移动上去自动显示
十分期待未来各种免费开源数学计算库同atom稍微集成下,就可以让你左边写一个等式,右边图表就能出来,是多麽爽的一种体验啊?
Atom插件演示:color picker,快捷键打开取色面板,取完后直接生成代码插入光标之后
Atom插件演示:代码中表示颜色的语句直接用该颜色上色,可以根据文件扩展名,对特定文件打开
短短两年的时间,这么多优秀的插件,只想说,如今 Atom 作为 Vim/Emacs 的继承者和超越者出现了,所以社区对 Atom 的反应也是热烈的,看看下面一组数据,截止今天(2016年3月15日),Atom共有扩展插件 3500+ 个,发布不到两年的时间,这是什么概念呢?
Sublime的插件(Stats - Package Control)大概 3500+个,但是sublime发布了5年的时间。
Emacs 的插件大概有2900个,可Emacs发布到今天已经过去 25+年的时间。
Vim 的各种插件虽然有9000个,但是Vi/Vim系列的历史长达 30+年,是atom的15倍。
这就叫社区的活跃度的区别,为什么短短两年那么多开发者先后给atom贡献了各种高质量的扩展,为什么大家对atom的热情那么高?为何好多人接触了atom一段时间后都深深的爱上了它?这是有原因的。
再谈性能优化
很多人错误的觉得 Atom慢是因为使用了 JavaScript/Coffee 等 Web 技术,所以先天慢,其实这是个误区,即便使用 Web 技术它也还能快很多,同时再慢可以往C++层的 Electron 挪啊,这也是这几个版本优化的一些方向,基于 Atom 开发的 Visual Studio Code 可以那么流畅, Atom 性能优化空间还很大,了不起多参考下自己的儿子,同样开源的 vscode怎么做的。
同时 Atom编辑器10版本以来性能得到了很大的提升,主要是两个方面,一方面是js层的各种渲染优化,控件优化,延迟绘制,延迟加载,只绘制当前需要的东西等,另外一方面是将一些核心数据结构移动到 Electron 的 C++层,如今154版本性能较去年版本已经有了本质区别,运行时加载是慢些(但也比eclipse快很多),实际使用并没觉得不如别的编辑器,况且,js层的优化和C层的优化未来还有很大的空间可以进步。
不过我不太喜欢 vscode 使用 Typed Script 进行开发,用点标准技术不行么,Atom使用 JavaScript/Coffee 写的多爽,如今 Atom 正在准备慢慢的切换到 JavaScript 的新标准 ES6 上。其次 vscode 快是快在“做的事情少”,主要是可扩展性方面的努力远不及 Atom,插件机制相对弱智,所以 vscode 的社区如今还不是特别活跃,扩展也少,发布一年多只有差不多300+个扩展,远不如 Atom 的情况,如果 vscode 还是按照现有结构开发下去,可能永远不会拥有 Atom的灵活度,这样再未来就无法拥有各种丰富多彩的插件。
再说开源免费
UltraEdit 单用户版本价格: 79 美刀
UltraEdit 服务器版价格: 229 美刀(多人登录同一台服务器的桌面使用),企业版更贵
EditPlus 单用户版价格: 35 美刀,而且还只有windows版本,
Sublime 单用户版价格:70 美刀
TextMate 单用户版价格:48 欧元,而且还只有mac版本。
这些都是钱啊,可能你会说可以免费试用或者破解啊,是的个人可以,但正常来说sublime这些试用指不能拿来搞生产不能拿来工作的,个人你用用可以,但国外人家守规矩,不会乱用,这意味着失去一大批为其开发扩展的国外开发者,同时站在公司考虑IT方案的角度,免费试用和破解将来都是潜在的麻烦,现在上百人的公司微软都会来收windows的钱了,版权问题越来越严肃,你得把这笔潜在费用考虑进去,同时这些闭源的或者单平台的东西,并不值得再上面花费过多精力和投资。
抛开扩展性问题和价格问题,我们再来看各个热门的免费编辑器的试用情况:
Notepad++:免费,开源,只能运行于windows
PSPad:免费,不开源,只能运行再 Windows
Gedit:免费,开源,只能跑再 GNome下,Ubuntu用用,Windows/mac版本简直是残缺的。
Programmer's Notepad : 免费开源,只能跑 Windows
Notepad2:免费bu不开源,只能跑 Windows
更关键的是:闭源的东西个人作者可能失去兴趣不再更新,商业公司的话,你需要一个功能,就只能无限期的等待他们发慈悲加入进去。而免费开源的很多其他编辑器除去平台兼容性问题外,更重要的时扩展性差。
而同时满足:免费+开放+强扩展性的编辑器如今就只出现过三个:Vim / Emacs / Atom。他们是真正属于使用者的编辑器,他们能变成使用者希望变成的样子。这些曾经出现过得收费的或者免费的编辑器,凭借着一两个自身独有的 “卖点”,再某些时间段内都曾经流行过,可就像流星一样一闪而过,如今他们都统统完成了自己的历史使命,新的一页可以翻开了。终端环境的话确实 Vim / Emacs 继续下去,但桌面环境的话,Atom将会继续向前,走出新的一步。
RAKsmart服务器速度:
RAKsmart美国服务器的速度是很快的,在国内平均ping值只有170ms左右,这相对于美国其他的服务器速度已经是很快的。
RAKsmart服务器稳定性:
1、美国服务器提供商RAKsmart采用全球顶级服务器软硬件技术,面向不同用户提供了多样化服务器配置:CPU从入门级的Atom到高端的E5系列,内存从2GB到128GB都有提供,而且可按照网站的需求随时升级相关资源。优质的服务器软硬件技术,再加上灵活升级的服务器配置,是保持网站稳定性的关键因素。
2、已经运营超过十年的RAKsmart美国机房位于加州地区,配置几十名专业服务器技术人员。美国RAKsmart机房采用的是CISCO等高端网络设备,恒温、恒湿,包括UPS电力系统、空调系统、布线系统、机架系统、消防系统、保安系统和接地系统。加州机房管理,服务器管理,故障排除,事务处理等都具备比较完善的方案和流程,确保服务器的稳定性。
CPU是ATOM N330,可以装32位的WIN7或装64位的WIN7。
ATOM N330支持64位运行,可以兼容64位的WIN7。
在计算机架构中,64位整数、内存地址或其他数据单元,是指它们最高达到64位(8字节)宽。此外,64位CPU和算术逻辑单元架构是以寄存器、内存总线或者数据总线的大小为基准。 64 位CPU在1960年代,便已存在于超级计算机,且早在1990年代,就有以 RISC 为基础的工作站和服务器。2003年才以 x86-64 和 64 位 PowerPC 处理器架构的形式引入到(在此之前是 32 位)个人计算机领域的主流。
ATOM N330:
atom D425 应该是支持win2000的,之前市面上大把多的山寨机SONY D425,很多用的都是这个组合。专业版没有试过,换个win2000的版本试试。MPU是Micro Processor Unit,微处理器,这么说吧,CPU是中央处理器(Central Processing Unit),它属于MPU。而显卡中的处理器GPU,也是MPU的一种。在比如声卡上、显示器里面的控制芯片,也叫MPU。使用JSON 转换工具详细解析:
这个处理过程包括将 IRI 转换为一个等价的 URL。在核心 Atom 词汇表中,icon、logo、uri、link 和 content 元素可以包含能被解除引用的 IRI,下面就对JSON 转换工具进行学习探讨。
初看起来,将 Atom 文档转换为 JSON 似乎非常简单。毕竟,Atom 只是一些 XML,并且有大量 XML 和 JSON 转换工具可用。然而,Atom 格式不仅仅是 XML 元素和属性的集合。
许多复杂的细节使得很难正确处理 Atom。本文将描述这些问题,并演示了一种由 Apache Abdera 项目实现的机制,该机制可以将 Atom 文档转换成 JSON 并生成易于理解、易于使用的完整内容。
在将一个 Atom 文档转换为JSON 转换工具 时,将获得大量富含信息的内容,并将其序列化为一种非常简单的形式。在难于解析和正确处理 XML 的环境中,您可以更加轻松地使用这种更简单的内容形式。
概述JSON定义法的相关使用技巧和说明
详细阐述JSON结构的格式说明特点
使用JSON数值结构说明介绍使用
大致讲述JSON异步的使用说明介绍
读者详细说明JSON 的使用与维护工作
这个过程面临的主要挑战是,确保重要数据和上下文不会在转换过程中丢失。以下章节将讨论转换 Atom 文档时的各个关键问题。假设读者至少对 Atom 和 JSON 有一个基本的了解。如果对它们都不熟悉,请在继续阅读之前查看一下本文末尾列出的 参考资料。
Atom 文档包含一个人类和计算机都能识别的混合信息集合。人类可读内容的恰当呈现,如条目标题、分类标签、链接标题、权限描述等等,依赖于一种在转换为 JSON 过程中必须正确保存的语言上下文。
xml:lang 是一种指定 Atom 文档所使用语言的机制。此属性可以出现在 Atom 文档中的任何位置,而且既可以被子元素继承,也可以被覆盖。xml:lang 属性的值是一个由 RFC 4646 定义的 “语言标记” ,名为 “Tags for Identifying Languag”。
这些标记提供关于文本编写所用语言、使用的脚本或编写系统的信息,以及地区性语言变化等。这类信息将影响用户代理呈现文本的方式。清单 1 所示的示例 Atom 提要演示了 xml:lang 在 Atom 文档中的用法,但是该示例没有实际意义。本系列已经用大量时间讨论了数据格式,这主要是因为几乎所有异步应用程序最终都要处理数据。如果掌握了发送和接收所有类型的数据的各种工具和技术。
并按照最适合每种数据类型的方式使用它们,那么就能够更精通 Ajax。在掌握 XML 和纯文本的基础上,再掌握JSON 转换工具,这样就能够在 JavaScript 中处理更复杂的数据结构。
本系列中的下一篇文章将讨论发送数据以外的问题,深入介绍服务器端程序如何接收和处理 JSON 转换工具的数据。还要讨论服务器端程序如何跨脚本和服务器端组件以 JSON 格式发送回数据,这样就可以将 XML、纯文本和 JSON 请求和响应混合在一起。这可以提供很大的灵活性,可以按照几乎任何组合结合使用所有这些工具。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)