4
16
2014
62

Sublime Text 能做的,Vim 都能做到吗?

本文来自依云's Blog,转载请注明。

前两天突发奇想,想知道现在越来越流行的 Sublime Text 除了易于上手外,和 Vim 相比还有哪些独到的特性呢?

于是我在 SegmentFault 上提出了这么一个问题,最终的答案整理如下。括号中是项目数,由很简单的 Vim 命令统计或者目测完成。

Sublime Text 能做的,Vim 在不做任何配置、或仅作极少量的配置也能做到的(16):

ST: 随时保留文件的修改 / 自动保存。
Vim:
  1. 当意外退出时,默认在最后四秒内的最多200字符可能会丢失。这两个数值都是可以配置的。
  2. 设置 'autowriteall',在需要保存文件时会自动保存文件。
ST: 按 HTML 标签选择。
Vim: vit, vat, v2it 等。各种文本对象。
ST: CSS 的属性名称自动完成。
Vim: CSS 属性名称和值的智能补全。
ST: 会话保持。
Vim: :mksession 以及 :source。当然很容易配置成自动化的。
ST: 跨平台。
Vim: 把 ST 支持平台数平方一下。
ST: 变身:Vim 模式。
Vim: 变身:简易模式。
ST: 多文件搜索。
Vim: :vimgrep 命令。还有 grep.vimag.vim
ST: 在跳转框内使用 : 到达指定行。
Vim: 行号+G 或者 :行号(并回车)。
ST: 并列显示多个文件。
Vim: 不仅支持各种布局的多窗口,还支持多标签页。
ST: 界面干净。
Vim: guioptions 想去掉什么就去掉什么。
ST: 简易的编辑快捷键,如删除单词删除行头行尾。
Vim: daw, d^, d$,还想要什么?。
ST: 早期版本底部多出一个版面的空间,可以把代码最后的几千显示在窗口上半部分。
Vim: z. 把当前行放到窗口中间。Ctrl-E / Ctrl-Y 来滚动显示的行。
ST & Vim: 已拼单词提示/关键字补全。自动缩进。快捷键。命令行。

Sublime Text 能做的,Vim 在安装额外的插件或者适当配置后也能做到的(8):

ST: 快捷键切换注释。
Vim: 多个插件都可以,如 EnhCommentify
ST: 按照文件名称首字母搜索。
Vim: 多个插件都可以,如 LustyExplorer(按文件名子序列搜索)、Command-T(在当前目录下递归地搜索)。
ST: HTML片断快速插入。
Vim: neosnippet、snipMate 等。
ST: Livereload 插件,网页修改后可直接查看效果。
Vim: 使用 BufWritePost 事件通知浏览器刷新。或者直接使用 inotify 等技术监听文件更新。
ST: 侧栏管理项目目录。
Vim: 自带 netrw 插件、更强大的 NERD tree
ST: 多行移动。
Vim: 进可视模式d了再到需要的位置p就可以,不过还是有些麻烦。可以把以下配置复制到你的 vimrc 中:
" 上下移动一行文字
nmap <C-j> mz:m+<cr>`z
nmap <C-k> mz:m-2<cr>`z
vmap <C-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <C-k> :m'<-2<cr>`>my`<mzgv`yo`z
ST: 括号自动匹配。
Vim: 有几个插件。我不推荐使用这种功能。
ST & Vim: Zencoding。

Sublime Text 能做的,但是 Vim 还不能完全做到的(5):

ST: 多重光标选择,同时修改。
Vim: 列模式。正则替换。. 重复单个命令。使用宏来重复连续的多条命令。
ST: 简单全面的插件体系。
Vim: vim-addon-manager、Vundle、Bundle 等。
ST: UI 清亮。
Vim: 非 Windows 平台上的 GUI 版本也挺不错。Windows 版本的字体渲染很糟糕。
ST: 按名称搜索命令并执行。
Vim: 传统的命令行补全。
ST: 快。
Vim: 少装些插件,避免使用复杂的语法高亮。

Sublime Text 能做的,但是 Vim 还不能做到的(5):

ST: 代码地图 / Minimap。
Vim: 无。不过有好些人表示 taglist / tagbar 之类的比这个好看的缩略图更中用。
ST: 「经常友好地弹一个窗口,提醒用户付费。」
Vim: 默认在启动时会希望你给乌干达的儿童捐款。
ST: 「如果作者不幸挂掉,将会有一大波程序员陷入悲痛。」
Vim: 如果作者不幸挂掉,将会有一大波程序员尝试成为新的维护者。
ST: Linux 下的中文显示可能有问题,不支持输入法。
Vim: 如果其它程序中没有问题,那么在 Vim 中也不会有问题。
ST: 小巧。安装后大小:14277.00 KiB。
Vim: 带 GTK 2 图形界面、多种解释器支持的巨型版本安装后大小:28056.00 KiB。

后记

我当然是不会换用 Sublime Text,除非其出正式版本并对用户的数据表现出一个负责的态度

markdown 不支持描述性列表好讨厌啊,逼我用 Vim 的宏来修正么 :-( 以后这种复杂的内容还是部分用 HTML 吧,简单的部分用 markdown 写了再通过 Vim 的「filter」功能送给 markdown 好了。

本页用到了仅火狐 21+ 支持的 HTML 5 特性:Scoped CSS

Category: Vim | Tags: vim Sublime Text | Read Count: 20176
oracleyue 说:
Apr 17, 2014 06:40:15 AM

终于忍不住留言了,您老是我feedly关注的vimer里头最实战的一个了,之前也想对比下这两个,可惜实力不足啊。可惜不能@,还是加一个@Lainme,快来这里看~

Avatar_small
feng 说:
Apr 17, 2014 08:55:41 AM

我也如ls一样, 关注lZ.

对于sublime, 我其实用过大约半个月。 毕竟在用了大约四年的vim后, 已经不知道别的编辑器是什么样子了。对于那些特点就想试试。 但是在半个月之后, 我又回来了,sublime 支持一些API. 对于python 的支持也很好, 但是API比vim 还是不足的。 在过了一把瘾之后, 就感觉那些华丽的东西都是浮云, 效率才是第一位的

zhongwei 说:
Apr 17, 2014 09:52:20 AM

写 js 的时候用过一个周的 ST (VIM 的 jslint 支持我一直没装上,惭愧),完全看不出有什么可以替换掉 VIM 的地方。后来,宁愿在 VIM 里编辑完 js,在 console 里执行 jslint,都不想用 ST

cold 说:
Apr 17, 2014 09:56:42 AM

关于 "多重光标选择,同时修改", Vim 有个插件可以做 https://github.com/terryma/vim-multiple-cursors, 但是有点慢..

hunt 说:
Apr 17, 2014 10:08:38 AM

为这个点个讚好了~

Fwolf 说:
Apr 17, 2014 10:22:40 AM

原来你就是 SeF 上的那个依云啊,才联想到。

由于经常在 ssh 下工作,所以除了 Vim 之外的选择很少。

GUI 下,暂时用 Geany 凑合着,主要是临时用,简单快速小巧够用。

jiazhoulvke 说:
Apr 17, 2014 10:45:37 AM

我一直觉得那个代码地图是最无聊也最没用的功能,而且还要占那么大一块地方,我的vim向来都是把菜单栏、工具栏、滚动条全部禁用。

Wolfan 说:
Apr 17, 2014 11:24:30 AM

学习VIM学习时间要比St长。

尹良灿 说:
Apr 17, 2014 01:15:54 PM

最后简直是在黑嘛。。。

kent 说:
Apr 17, 2014 03:16:06 PM

还差一个比较啊,无插件简单配置和在不修改源代码前提下敞开了折腾这两种条件的下,什么是vim能做,但st不能的。你丫一定是偷懒,不写这节。写出来的文本会不会超过1m字节呢?

Yangff 说:
Apr 17, 2014 03:59:52 PM

sublime 当然支持输入法。。

Avatar_small
λ 说:
Apr 19, 2014 06:56:12 AM

没有 console 版本的编辑器恐怕不会让我留恋了,同时长期迷恋两种编辑器简直是折磨,就像同时长期使用两种浏览器。上面的最后一节有点黑啊……

话说你觉得我那个 Strictdown 语言怎么样,既然你曾经想过要创造新的标记语言,那 Strictdown 的缺点主要是有哪些呢?(不要说是相关应用少啊 Orz)

Avatar_small
依云 说:
Apr 19, 2014 04:04:13 PM

这必须省掉啊,不然就成 Vim 配置指导书啦~

Avatar_small
依云 说:
Apr 19, 2014 04:13:45 PM

选择很多的呀,Gentoo 的 app-editors 下有不少各种 vi 系和 Emacs 系,外加「另外的」。只是除了 Vim 和 GNU Emacs 外用户太少了。

Avatar_small
依云 说:
Apr 19, 2014 04:14:27 PM

推荐用 jshint2 哦——https://github.com/Shutnik/jshint2.vim

Avatar_small
依云 说:
Apr 19, 2014 04:15:30 PM

lainme 应该会看到,就是不知道会不会点过来看评论了 =w=

Avatar_small
依云 说:
Apr 19, 2014 04:17:59 PM

这个我好像很早以前试过,感觉除了直观之外没什么作用呢。

Avatar_small
依云 说:
Apr 19, 2014 04:26:02 PM

咦,原来你就是那个 like*3 的博主呀,一直没发现的说……

Strictdown 感觉就是个修改版的 markdown 啊。我想做的那个会使用类似 TeX 命令的语法,但是要简单一些,会使用一种中间语言并与 pandoc 对接,会完善考虑中文支持,最简单的比如合并行时不添加空格。
当然也会支持自定义命令什么的。另外我还想不允许修改版使用相同的名字发布,还不知道要怎么做。

Avatar_small
λ 说:
Apr 19, 2014 04:45:00 PM

经过短暂的邮件提醒无差别炮轰之后终于迎来了回复 = =;;

看来 Strictdown 好像还差了点什么,虽然转换工具已经有不少好功能,还是觉得语法上似乎要来一些改变……(以后再折腾)

之前看到 pandoc 是 Haskel 写的,让我伤心啊,看不懂真让人烦恼……类似 TeX 的语法既是说要大量使用反斜杠了吧,感觉是有点怪怪的,感觉可以直接嵌入 XML tag 。不过照我这么说,好像要把整篇文章看作是用某个 tag 包裹的,用自带特殊字符自动转义的 XML 衍生标记语言写的文档了。

Avatar_small
依云 说:
Apr 19, 2014 05:20:39 PM

pandoc 不是有个 JSON 格式么,直接用那个与 pandoc 通信好了。

XML 的结束标签占地方啊。用反斜线总比写着写着下划线和星号没了要好嘛。另外 TeX 那个反斜线据说能换成别的……

Avatar_small
λ 说:
Apr 19, 2014 05:57:06 PM

啊,竟然有这东西,说明文档找到了:
http://johnmacfarlane.net/pandoc/scripting.html
看来还是得搞定 Python 或 Haskel ,输出一大堆 JSON 内容来了解大概的表示方式。

这样的话就要看 pandoc 支持多少种元素了,看来也绝对够用了……看来我下一步是要让 Strictdown 配合 pandoc 了。

Fwolf 说:
Apr 21, 2014 10:15:21 AM

哈,那么多“另外的”我还都不知道呢。

但,排除掉图形界面的,排除掉 Emacs(我不会),
还得能满足日常使用的,恐怕就不多了。

Avatar_small
Jacky Liu 说:
Apr 22, 2014 03:47:33 AM

我也总结了一下,Vim 只有如下几个做不到的:

1. 不支持在不同窗口使用不同字体(否则可以做 code map)
2. 不支持多线程(必须另开一个后台 Vim 进程来模拟,效果还可以)
3. 不支持显示图片

还有两个做的不是很好的:

1. 不能很好地管理插件(变量、buffer、窗口、option 所有的资源都是公用的,不能避免插件打架)
2. 不能很好地作为其它程序的 UI(其实自己 hack 已经能做得很好了,只是有点支持会更好,比如做一个按键触发的下拉选单。)

其它应该没啥做不到的,其实最恨的也只有第一个而已。

Avatar_small
依云 说:
Apr 22, 2014 03:17:08 PM

「按键触发的下拉选单」这个是可以做到的呀,弄个菜单,在特定按键时把它弹出来就可以了。

Avatar_small
Jacky Liu 说:
Apr 22, 2014 04:31:15 PM

我说的是像补全列表那样的,在任何地方显示的下拉选单,内容也根据 buffer 的内容来决定。这个用 快捷键+input() 函数也可以,只是有点蠢,没那么 fancy。

另外请问一下,unicode 字符的显示宽度是字体定义决定的吗? Vim 里是否有办法控制呢?比如我用 courier 字体,'●'的显示宽度是两格,可是 '☻'却只有一格。更奇怪的是,下标字符里的 '₁₂₃₄'这些显示宽度两格,可是 '₅₆₇₈₉₀'这些只有一格,我想知道这是为什么。

Avatar_small
依云 说:
Apr 22, 2014 05:04:18 PM

菜单是可以根据内容动态改变的。

你这些字符在我的终端里都是显示为单个字符宽度,这里也一样 :-)

对于等宽字体,每个字符的宽度是定义死的。但是有一些字符是所谓的「东亚二义性宽度字符」,即在不同的上下文中可以有不同的宽度。详见 :h 'ambiwidth'。

Avatar_small
Jacky Liu 说:
Apr 22, 2014 05:30:41 PM

是了,我的 .vimrc 里头设了 set ambiwidth=double, 我都忘了,但是看来只能影响一部分字符,而且划分标准比较奇怪。网上说关键在 Vim 源码里的 mbyte.c 这个文件,你看如果我把内容改掉重新编译的话,是否能解决这个问题?

Avatar_small
Jacky Liu 说:
Apr 22, 2014 05:33:42 PM

你还在用 nerdtree 吗? nerdtree 很慢的,干嘛不用 python 自己写一个,我自己用的文件浏览插件去年又更新了,我可以把代码给你作参考。

Avatar_small
依云 说:
Apr 22, 2014 06:36:42 PM

是的,对上下标的分类很奇怪。你改吧,就是那个 ambiguous 结构体。

Avatar_small
依云 说:
Apr 22, 2014 06:37:38 PM

因为没时间写呀。NERDTree 我也只是偶尔使用的。倒是 VimExplorer 那种我比较喜欢。

Fwolf 说:
Apr 24, 2014 05:26:25 PM

强烈建议体验一下 CtrlP

https://github.com/kien/ctrlp.vim

比树形列表好用多了。

Avatar_small
依云 说:
Apr 25, 2014 03:46:31 PM

这个我记得我试过,就算没试过也试过类似的 command-t 啊 unite.vim 啊 LeaderF 之类的。我目前用的是 lusty-explorer + 修改过的 mru.vim,比较符合我的需求。

Avatar_small
Fermat618 说:
Apr 27, 2014 10:29:54 AM

Vim: UI效果差,鼠标支持差,编程接口差(有很多是提供命令接口,而不是函数)。

Avatar_small
依云 说:
Apr 27, 2014 04:50:43 PM

鼠标支持挺好的呀。

Avatar_small
Fermat618 说:
Apr 27, 2014 05:57:13 PM

鼠标支持的精髓,在上下文菜单。你回想一下,点过几次 gvim 的右键? gvim 的右键菜单,比 gimp 也强不了多少。你说人家没右键也不对,可每次点了都后悔。

Avatar_small
Fermat618 说:
Apr 27, 2014 05:58:35 PM

gvim 右键还是好一点,像复制粘贴, 拼写检查的时候,还有点用。gimp 那个,是每点一次骂一次娘。

Avatar_small
依云 说:
Apr 27, 2014 06:15:01 PM

想要更多的命令自己往上加。我几乎除了定位、选择和粘贴外从来不在 Vim 里用鼠标的,想不到对于处理纯文本鼠标还有什么方便的地方。

Avatar_small
Fermat618 说:
Apr 27, 2014 10:08:05 PM

在你眼中是纯文本,在我眼中是程序。

Avatar_small
Jacky Liu 说:
Apr 28, 2014 06:02:55 AM

何不用 VS,比 vim 高大上多了

Avatar_small
Fermat618 说:
Apr 28, 2014 09:50:07 AM

我平时不用 Windows, 也不写C++. 我现在用 jetbrains 的那些软件,那是真正理解程序的东西。

Avatar_small
λ 说:
Apr 28, 2014 04:51:57 PM

没搜到怎么修改 TeX 的特殊字符,估计是太底层了……

Avatar_small
λ 说:
Apr 29, 2014 04:01:04 PM

合并多行文本时不添加空格,对于以被分隔的两个单词那种特殊情况,会有点麻烦,VIM 的格式化不会给下一行前置一个空格,不过就算手动前置空格,那么对于纯英文的写作来看,就会出现奇怪的整体缩进效果了。这样便得设计新的语法来保留空格了。

Avatar_small
依云 说:
Apr 29, 2014 04:31:36 PM

是否自动添加空格可以通过判断连接之后两边的字符的类别来判断的嘛。

Avatar_small
λ 说:
Apr 29, 2014 04:41:10 PM

这样太粗暴了,有可能是这样的情况:

叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦 被除数 / 除数

叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦 被除数/除数

假如被 VIM 断行变成这样:

叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦 被除数
/ 除数

叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦叽哩呱啦 被除数
/除数

就让人头痛了……

荒野无灯 说:
May 20, 2014 11:33:33 PM

多重光标选择,同时修改,这个已经有插件实现了。
vim-multiple-cursors
基本上我的vimrc上面的所有功能性的东西都已经包括
目前用的vundle ,打算转neobundle后整理下发出来

荒野无灯 说:
May 20, 2014 11:34:27 PM

文件浏览和查找,推荐用neo大婶的unite.vim, 你值得拥有。

荒野无灯 说:
May 20, 2014 11:37:05 PM

liveReload 插件: https://github.com/flomotlik/vim-livereload

Avatar_small
依云 说:
May 21, 2014 03:57:04 PM

呃,这个功能竟然会有这么复杂,还要 +ruby 支持……

火狐的话,安装 mozrepl 然后在文件保存时用 netcat 发送点 js 过去就可以了。其实也可以不在 Vim 里弄,直接调 inotifywait 更通用彻底。还有个 Remote Control 扩展也是类似的功能。

尹良灿 说:
May 21, 2014 04:39:29 PM

自动刷新推荐这个,与编辑器跟浏览器都无关

https://github.com/WeijuNB/PyF5

Avatar_small
依云 说:
May 21, 2014 05:08:21 PM

一堆更奇怪的依赖……

荒野无灯 说:
May 21, 2014 05:10:33 PM

我表示我折腾半天没安装上。。。。各种报错。也许它不适合安装在我的Arch上面
放弃之

尹良灿 说:
May 21, 2014 05:20:26 PM

不是吧,( ̄_ ̄|||) 用 pip install 没任何问题啊。。。。

尹良灿 说:
May 21, 2014 05:26:47 PM

为什么这么说?= = 指它用的 Python 模块奇怪?

Avatar_small
依云 说:
May 21, 2014 06:05:23 PM

为什么要一堆 js 模块呀?

尹良灿 说:
May 21, 2014 06:32:53 PM

它的原理大概也像你说的是用 js 刷新的吧,用 Python 建立了个简单的 HTTP 服务器,有个 Web 介面可以添加项目的路径。看 README 还说有个 Markdown 编辑器的功能,不过我用不了,直接当普通文本显示了。

Avatar_small
依云 说:
May 21, 2014 07:41:44 PM

那它是在静态文件里插入了自己的脚本啦?

尹良灿 说:
May 21, 2014 08:22:42 PM

嗯。不过据说也支持动态网站的项目。

自由建客 说:
May 29, 2014 02:07:16 PM

那個僅對 gvim 有用,vim 必須同時要終端也支持,除了 xterm 有 -cjk 選項,未見其餘終端有。

荒野无灯 说:
May 31, 2014 01:48:50 PM

lusty-explorer 跟Nerd比有啥好处和不同?

Avatar_small
依云 说:
May 31, 2014 02:38:06 PM

用途不太一样。lusty-explorer 是找文件的,NERDTree 是显示文件列表的,找的时候还是凭眼睛。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com