Archive

Archive for March, 2016

ATOM 同 Vim/Emacs/Sublime 的深度比较

March 16th, 2016 4 comments

用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是工作上用他们写过代码的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。

Atom 唯一的槽点就是“卡”,不过那是去年的情况了,1.0后性能数次大提升,比起sublime/vsc之类虽不算流畅,但同时编辑20个数千行的文件没有压力。如今让人感觉慢的地方主要是启动loading(也大大短于eclipse, idea),使用时并没察觉它比其他编辑器慢再哪。而文本编辑器的快慢,更重要的是“让你工作更快更有效率”。下面说说为何 Atom比其他更有效率:

兼容VIM模式

这无疑团结了一大班 Vim过来的用户,Sublime虽然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上其作者经常神秘消失,最稳定的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区进行,不会移动到任何主键盘以外的区域,更别说用鼠标、触摸板。

Read more…

Categories: 随笔 Tags:

Atom 编辑器的插件开发

March 14th, 2016 No comments

老王卖瓜,自卖自夸,Atom 比较方便的地方是可以用 javascript/coffee 给 Atom写插件,并且写起来很简单,我刚按说明给 Atom 写了一个插件:
atom-shell-commands

用户自定义 Shell 命令,类似 NotePad++ 中的 “Run Commands”,EditPlus/UltraEdit里面的”User Tool”,以及 GEdit 中的 “External Tool” 和 TextMate 里的 “Shell Command”。

1. 用户可以自定义工具,并且配置到 Atom 中,比如一键调用编译器,一键运行,
2. 输出结果会显示再底部的 bottom panel 中
3. 点击错误输出可以跳转到对应有错误的文件上去
4. 自定义正则表达式匹配错误输出中包含的文件名和行号。
5. 全平台支持,再 Mac/Ubuntu/Windows 下充分的测试过。

初始化时,再你的用户配置中(Atom File->Open Your Config或者 ~/.atom/config.cson),写入类似:

  "atom-shell-commands":
    commands: [
      {
        name: "compile"
        command: "d:/dev/mingw/bin/gcc"
        arguments: [
          "{FileName}"
          "-o"
          "{FileNameNoExt}.exe"
        ]
        options:
          cwd: "{FileDir}"
          keymap: 'ctrl-2'
      }
    ]

的配置,就会创建一条名为 “atom-shell-commands:compile” 的命令,你可以通过 command palette来运行它或者使用快捷键 ctrl-2来直接运行。同时再 Atom 的 packages 目录下面的”Atom Shell Commands” 目录项下面也会多出一个名为“compile” 的命令。

注意,cson格式靠缩进来判断层次,同时 list 需要将 [ 和 key 写在同一行(commands,arguments),否则会被判断成字典。

靠,上面的代码缩进帖过来以后被弄没了,具体可以看:https://atom.io/packages/atom-shell-commands 上面的格式,CSON是靠缩进来判断层次的,同时注意:commands: [ 后面的中括号要和 commands写在一行,后面的 arguments也一样,cson的 list 需要把 [ 和 key 写在一行,否则会被判断为字典。

每条命令可以通过如下字段来表示:

name: 名字(必填)
command: 可执行路径(必填)
arguments: 参数(选填)
options: 扩展参数用来配置当前工作路径,文件是否保存,快捷键,环境变量等 (选填)

所有配置支持如下宏:

{FileName} 当前正在编辑的文件名(不包括路径)
{FilePath} 包含全路径的文件名
{FileNameNoExt} 没有路径和扩展名的文件名
{FileExt} 文件扩展名
{FileDir} 文件路径
{ProjectDir} 工程路径(如果有工程的话)
{ProjectRel} 文件相对于工程的路径(如果有工程的话)
{CurRow} 当前行
{CurCol} 当前列
{CurLineText} 当前行的文本
{CurSelected} 当前选中文本

有了这些宏,你几乎可以做任何事情,比如到工程目录下调用make或者cmake,或者仅仅编译单个文件不必理会负责的工程,或者调用 ant去跑 build.xml,或者调用 java来运行编译出来的.class,调用python来运行当前脚本,或者当前目录下执行下 grep 关键字并且把grep的结果显示再下面的 bottom panel,打开帮助文档跳转到你选中的API上,或者对当前文件调用 svn diff,把结果输出到 bottom panel。

比如:调用 gcc / cl 一键调用编译功能

 

比如:一键运行

比如:一键运行(打开独立窗口运行)

具体见项目主页:
atom-shell-commands

Categories: 随笔 Tags: