用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是用他们写过代码的,用在工作上的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真的用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。
Atom 唯一的槽点,就是“卡”,不过那是去年的情况了,1.0以后版本性能数次大提升,虽然比起sublime/vsc之类不算流畅,但是同时打开编辑若干数千行的文件,一点压力没有。如今让你感觉慢的地方主要是启动loading时间(然而也大大短于eclipse, idea),使用的时候我并没有觉得它比其他编辑器慢再哪里。而文本编辑器的快,保障了基础使用的情况下,更重要的是“让你工作更快更有效率”。下面说几处为什么 Atom比其他都更有效率:
这无疑团结了一大班 Vim过来的用户,Sublime虽然也兼容VIM模式,但是Sublime再 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL模式,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上sublime的作者经常神秘消失,最稳定的2.x版本已经三年没有更新,这些问题一直得不到修正。
由于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 = 1
var y = 2
var z = 3
console.log(‘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写过插件,给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 path = expand(‘%:p:h’)
let name = expand(‘%:t:r’)
或者
let name = expand(‘%<‘)
而在 Atom 里我们用atom自己的功能直接取出路径来,然后用node.js的path模块进行切割:
var fullpath =atom.workspace.getActiveTextEditor().getPath();
var filename = path.basename(fullpath);
var filepath = path.dirname(fullpath);
就问大家一下?哪段代码更友好一看就明白?你更愿意用按照哪段代码进行插件开发?是上面的VimScript?还是下面的 javascript ?
结论是很清晰的,Atom的 javascript开发插件更浅显易懂,即便没文档,你看看别人怎么写的自己也会写,同时灵活性大大高于VmScript,各种事件处理回调,javascript天生擅长做这些事情,还有第二行,第三行,我们用到了 node.js 的 path模块,进行文件路径切割。这样的写法,再VimScript 里面基本是无法想象的。
Vim是强大,但是毕竟是30年前的东西了,即便最熟练的 Vimer 也都承认 VimScript 的晦涩难懂,阻碍了很多人为其开发插件,而学习给Atom开发插件,只需要学习javascript,学习了javascript你可以用在很多地方。不像VimScript那样只能用在Vim里面,而正式因为其晦涩,VimScript都纷纷支持内嵌 python的写法:
python << EOF
import random
print random.randint(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 + Node.JS,而整个Atom的界面,你可以理解成就是一颗 HTML 的 DOM 树结构,这意味着你可以这样:
var div = document.createElement(“div”);
div.innerText = “abc”;
atom.workspace.addBottomPanel(div);
就可以简单的在 atom 里面增加一个显示对象,这意味着再给div加个 html的 onclick就可以实现GUI交互,界面上的对象随便写点html代码就可以控制效果,意味着你可以使用 jQuery 来为atom增加新面板,意味着你只需要写一个简单的 .css 文件就可以把 Atom 整个编辑器的外观给修改了。这在 Vim/Emacs 中是几乎不可想象的事情,sublime基本就别提了。
大量的前端开发技术和 Node.JS 基础模块供你任意使用,正是由于近年 Chromium / node.js 系列技术的成熟,和 Atom / Visual Studio Code 这类基于前端技术的客户端软件的成功,让我看到了客户端(桌面+移动)软件开发的新方向。
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 比它强啊?
举个最简单的例子,minimap,就是 sublime那种大家喜欢的文档缩略图,这个现代编辑器必备的功能,谁能用 Vim/Emacs 实现一下看看?Atom 可以衍生出 Visual Studio Code 这样漂亮的编辑器,Vim/Emacs能衍生么?Atom可以随便用各种先进的前端技术,不当可以嵌 Terminal我甚至可以再 Atom 嵌入一个 js版本的 DOSBOX 玩老游戏《命令与征服》:
https://archive.org/details/softwarelibrary_msdos_games
Play DOS games online
当然这样并没有任何卯用,但是如果我再 Atom里面内嵌一个浏览器,方便的实时预览html/css的效果呢?或者 Atom 里面内嵌一个 Markdown Previewer ,实时查看 Markdown 的效果呢?请问 Vim/Emacs 里怎么实现法?
只想说明,如今,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慢是因为使用了 JavaScript/Coffee 等 Web 技术,所以先天慢,其实这是个误区,即便使用 Web 技术它也还能快很多,同时再慢可以往C++层的 Electron 挪啊,这也是这几个版本优化的一些方向,基于 Atom 开发的 Visual Studio Code 可以那么流畅, Atom 性能优化空间还很大,了不起多参考下自己的儿子,同样开源的 Visual Studio Code怎么做的。
同时 Atom编辑器1.0版本以来性能得到了很大的提升,主要是两个方面,一方面是js层的各种渲染优化,控件优化,延迟绘制,延迟加载,只绘制当前需要的东西等,另外一方面是将一些核心数据结构移动到 Electron 的 C++层,如今1.54版本性能较去年版本已经有了本质区别,运行时加载是慢些(但也比eclipse快很多),实际使用并没觉得不如别的编辑器,况且,js层的优化和C层的优化未来还有很大的空间可以进步。
不过我不太喜欢 Visual Studio Code 使用 Typed Script 进行开发,用点标准技术不行么,Atom使用 JavaScript/Coffee 写的多爽,如今 Atom 正在准备慢慢的切换到 JavaScript 的新标准 ES6 上。其次 Visual Studio Code 的社区如今还不是特别活跃,扩展也少,发布一年多只有差不多300+个扩展,远不如 Atom 的情况,因此暂时不打算深入展开 Visual Studio Code来说了。
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 继续下去,但非桌面环境的话,q
怎么取消末尾空白行自动剔除?— 禁用自带 whitespace 插件即可。
怎么将TAB从空格改为真TAB?— 设置->Tab Mode 从 Soft 改为 Hard,同时将长度设置为4
如何取消括号补全?— 设置->Packages->禁用 Bracket 插件即可。
我从 sublime 过来,如何增加文档缩略图 minimap?— 设置->Install->安装 MiniMap 即可
如何启用Vim模式?— 设置->Install->VimMode
如何禁止按回车实现自动补全(有时想换行但是变成使用补全了)?— 设置->Packages->Autocomplete Plus->将Tab+Enter改为Tab only
我是 C/C++ 开发者,如何一键编译一键执行代码?— 安利下我自己写的插件:Atom有什么优秀插件? – 韦易笑的回答
我是前端开发者,用惯了 Sublime的 Emmet,Atom下怎么办?— 也有 Emmet。
国内有时无法自动下载安装 package怎么办?— 等三五分钟重试,有些cdn的ip (amazon) 被gfw掉了,或者全局代理翻墙,或者直接从github上clone到 ~/.atom/packages下手动安装即可。
。。。。。。
我在 Vim插入模式下习惯 inoremap C-HJKL来上下左右移动,十分方便,可到了Atom里该怎么办?— File -> Open Your Keymap,按照注释设置你的新的键位,如:’alt-j’: ‘core:move-down’。
我再 Vim下面喜欢设置各种indent,各种smart tab,tab expand再Atom里面怎么设置?— Settings 第一个面板就有。
我再 Vim 下面喜欢把大写的 HJKL 设置成 5h, 5j, 5k, 5l,这样按住shift实现快速移动,请问Atom怎么设置?— 你可能需要自己写点js代码了,不过这在vim里面也是不对的用法,你把J这个粘合两行的命令给覆盖了,行间移动我喜欢用vim的CTRL_U, CTRL_D来滚动半页,行内快速移动,我喜欢5w,或者直接fx。
我再 Vim中喜欢使用 Taglist/Tagbar 来进行索引,来到 Atom 有没有类似的插件?— 请使用:symbols-tree-view 代替之,而且不依赖ctags,实时分析当前文件内容,超级漂亮,使用ctrl-alt-o切换是否显示。其实内置功能 CMD-R (osx的键位,win下查一下,内置插件symbol-view)可以查看当前代码的函数列表,点击也可以跳转过去,同样也不依赖ctags,轻量级使用的话,内置这个足够了。
我从 Vim过来,如何实现Vim的 YouCompleteMe超级补全插件?— 安装 autocomplete-clang 或者 YouCompleteMe 插件即可。不过 Atom 本身内置的补全就已经很强大了,你可以先试试,况且Atom用这些东西还不像vim用 YCM那样还需要编译个带python的版本,还要编译clang一半天那么麻烦。
我在 Vim中喜欢用 vim-multiply-cursors 做批量操作,Atom怎么弄?— multi-cursor-plus
我再 Vim中写python,过来 Atom 下找不到顺手的工具了怎么办?
— 你可以查看:autocomplete-python
。。。。。
这段会不断更新补充,关于各种编辑器过来的人的习惯,喜欢折腾的Vim用户,Atom给大家足够折腾的空间,用不着刻意把 Atom 装扮成一个100%的vim,随着时间的推移用 Atom的方式使用Atom能让你获得更高的效率。
简单用一下的话,这样就可以了:
左边是 Atom再带的 Tree View,可以用来管理项目或者直接管理文件,右边是taglist/tagbar 的代替者:symbol-tree-view,中间文件分两边同时编辑两个文件,上面分tab,按cmd+数字直接跳转,左右两边panel设置快捷键组合切换,下面的Atom Shell Commands调用编译器编译工程或者单个项目,编译器的错误输出可以根据正则匹配出对应出错的文件名和行号,快速跳转。
用了autocomplete-python插件来补全python,其他语言的话,系统自带的autocomplete-plus以经足够我用了,十分喜欢YCM的人,autocomplete-clang可以满足你们。
注:Atom是通用编辑器,真的写java我还是会用eclipse这种针对语言级别的IDE来调试安卓或者管理模拟器,但是其他语言,我现在都完全切换Atom了。