ruby 各种编辑器吐槽(转)

vim 高亮文件种类非常丰富, 键盘操作设计非常爱护手指, 可惜和操作系统的默认文本编辑习惯不一样, 在命令行用不了某些 cmd 键的绑定, 它是模式编辑器, 但模式判定和编辑的文档内容无关, 另外没有自带的 debug 接口也是缺点之一. vimscript 虽然简单但还是三天不用就会忘...

emacs 是最早支持 context 和 mode 的编辑器之一, 命令都有对应函数的, 没有 vim 那种绑了键那个东西就不再是那个东西的顾虑. 有 etags 跳转浏览, 结构化编辑 (haskell 包), 二相渲染等高端能力. 对 latex 的编辑支持最完善. 但键盘操作有点费手指, 用的包多了载入速度就会略慢. elisp 和很多 lisp 方言一样: 括号多...

这里顺便吐槽一下括号省不掉的根本原因: 换行没有语义, 没有带运算符优先级的中缀表达式 (可以用 infix macro 但还是略难受), clojure 可以把一些圆括号转换成方括号花括号什么的, 但是括号总量几乎没变.

vimscript 和 elisp 都不是通用编程语言, 没有广泛的库支持...


emacs 影响了很多编辑器, 例如 scintilla. scite, notepad++, ultraedit, komodo, code::block ... 都是基于 scintilla 的, notepad++之类就是在 scintilla 外面包了层皮而已... 很多基于 qt / wxwidget / gtk / fox 的编辑器/IDE也都用了 scintilla. scintilla 的 split buffer (文本存储) 和 line marker (增量着色和 lexer 状态) 就是参照 emacs 设计的. 但 scintilla 基于 cocoa 的版本是收费的, 基于 gtk 的版本在 mac 上基本没有可用性...

scintilla 各种语法高亮和括号配对引擎是用 c++ 裸写的, 源代码中有 20 多个像 lexRuby.cxx 的文件就是 scintilla 的词法分析引擎, 每语言一个, 巨复杂, 其分析只有状态没有栈, 所以像下面的 ruby 代码两个圆括号在 scite 的衍生物里是能配对上的:

( "#{ ) }"

另一个受 emacs 影响很大的编辑器是 eclipse, 插件机制 osgi 什么的蛋疼死... 不过专门为了文本编辑设计的编译器 ecj 值得一看.


gedit 和 jedit 感觉是为了相应平台而设计的, 没感受到任何的新意...

textmate 是近年来唯一感觉有创新的编辑器

  • 点击 txmt:// 链接可以打开文件, ci / airbrake / github 上用这个特别爽
  • 插件主要通过输出 html 来完成 gui
  • 在脚本里通过 dialog 命令可以在 textmate 中弹出 interface builder 写好的 nib 对话框, 还能获得数据绑定, 这个视频简直神了...
  • 着色上用了 oniguruma (支持 peg 的正则引擎), 语法配置强于 scintilla, 例如 textmate 就知道上面的括号不是一对. 值得一提的是 James Edward Grey 2 世写的 ruby bundle 对 ruby 语法下了很多功夫.
  • snippet / 编辑器命令对语法作用域敏感, 例如同一个按键在字符串和非字符串内可以有不同含义

但 textmate 还有些问题:

  • 中文输入修了挺久了还是有问题
  • 最近着色速度好像又慢了...
  • 插件全都是 xml, 自定义管理麻烦
  • 不支持大小写通用的自动完成 (我在修改 golang 的自动完成时 fork 了一份 dialog2 加了往回改写文本的代码, 但是在 textmate2 又不行了 >_<)

sublime 除了跨平台外和 textmate 没有本质不同, sublime 上的 ruby bundle 就是一字不改拷的 textmate bundle ... json 配置已经胜于 xml 配置了, 改成 yaml 配置就完美了.


rubymine 和 netbeans 特色是用了 "抽象执行" 的技巧去做动态语言的自动完成: 整个 ruby 标准库都拷了一份, 摘空方法体载入了用 repl 的方式去取. 但是 swing 的界面实在难看和各种卡, 而且用到某些有趣的写法就会出 bug... 但这个技巧也不是它们首创的, 很早之前有一个编辑器 rIDE 就这么做了还能逐行 debug.

很多 IDE 都是用二相着色的方案: 第一遍用比较快的词法分析器做粗粗的着色, 第二遍在 idle 时用比较慢的语法分析器做精细的着色. 例如 eclipse java 里等一会才会把静态方法加黑, netbeans ruby 里等一会才会区分局部变量和方法调用, xcode oc 里等一会才会把已定义方法名着上颜色, visual studio c++ 里等一会才把 #if macro 的不运行选择支变灰... 二相着色是实现复杂, 付出很多收获却很少的功能, 文本编辑器基本没有支持二相着色的...


相关推荐