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 上用这个特别爽但 textmate 还有些问题:
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 的不运行选择支变灰... 二相着色是实现复杂, 付出很多收获却很少的功能, 文本编辑器基本没有支持二相着色的...