Vim 学习卡和提鞋的问题

vimemacs1

题图由GraphSketcher(大名鼎鼎的Omni提供的免费开源产品)绘制。

Vim 这个系列很久没写了,今天从坑里捡起来,发现灰落了厚厚一层,抖掉灰尘,我决定续写 Vim 。在纸版《MacTalk·人生元编程》里我已经写了 Vim 缘起、模式、帮助、配置、概念、技巧和部分常用插件,手里有书的可以先看看那部分内容。今天准备写写 Vim 学习卡。

说到 Vim,常常让人想起 Emacs,在这个蓝色的星球上,在编辑器领域,永远存在两股暗黑势力,他们就是 Vim 党和 Emacs 党,这两股力量势如水火,分别守候着两大上古神器:Vim 和 Emacs……不停的有新人入会,也不停的有旧人出走,因为很多人发现这两大神器的学习曲线是如此陡峭和诡异,在没有发现神器的强大力量之前,这些人就离开了,去寻找 Eclipse 和 jetBrains 的庇护。但是永远会有一些人留下来,通过了艰难的考验,坚定的守护这两大神器……

以上是一种文艺的写法,真实的情况是:双方经常叫嚣 A 不配给 B 提鞋,B 甩了 A 几条街,到底是扔鞋还是扑街,就看谁的戾气更重了。古人云,文人相轻,其实技术领域也是一个德行,经常有人在人堆里喊一声「Perl 是世界上最好的语言,Ruby 不配给 Python 提鞋」,之后就是一群程序员争先恐后冲上去一顿群骂,等所有人口吐白沫笔走龙蛇的时候,发现原 PO 主早已转身离去专心致志的去写 Java 了,不带走一片 C# 代码。

对于这种技术争论,我的观点是:不提倡。

无论是夸,还是骂,您都得说到点子上,有理有利有节的文章永远胜过无谓的口舌之争,网络上的争论永远没有终点,成文成章才能流传。在这方面做的比较好的程序员,举两个例子:徐宥( http://blog.youxu.info )和王垠( http://www.yinwang.org ),倒不是这两个人的所以观点我都同意,而是他们写文章的态度非常值得赞赏。这两个人在「痛恨 Unix」领域还有过一次交锋,感兴趣的读者可以去他们的博客看看,可惜的是徐宥已经写的越来越少了……

今天的文章题图分别是 Vim 和 Emacs 的学习曲线,Vim 的曲线异常陡峭,但是当你度过了那一段艰难时候,就会领略到千帆竞发、百舸争流的美妙,并且从此天堑变通途。Emacs 则是初期似乎不过尔尔,但是学习愈深愈艰,而且还会出现回退,反复,360度大回环等匪夷所思的情况,到最后你终于明白,Emacs 原来是个伪装成编辑器的操作系统,满眼都是泪!

在互联网的江湖里流行着「唯快不破」的传说,一款互联网产品似乎不以迅雷不及掩耳盗铃之势做出来,江山美人就会白白拱手送人。圈地,出产品,拉用户,快干猛上,一抬头已经花团锦簇!当然,快的后果也可能是这块地压根没有江山美人,刨了半宿,其实是块盐碱地。在产品的成败上,都是以结果论英雄,所以,急性子成功了,当然唯快不破,慢公司赢了,那就是以慢打快,以柔克刚。

但是,「唯快不破」这个词,用来形容 Vim 却是最合适不过。我在之前的 Vim 系列中写过:

写过程序的人都知道,编程的时候双手大部分时间都放在键盘上,或编码、或插入、或移动、或定位、或查找,这种连续操作的时间和频率远远大于阅读、翻页、设置字体、摆弄样式等文案工作,而二者往往产生很多停顿和间隙,而编程时的停顿是非常影响编程效率的,所以 Vim 的设计理念就是通过模式的转换、命令的组合和数以万计的插件,保证程序员在编程的过程中,双手尽可能保留在键盘中央的区域,快如闪电的编辑文件,并且,不需要鼠标。

想做到快如闪电,就需要你记住四种模式切换(普通模式、插入模式、可视模式、命令模式)、大量的快捷键和命令,想通过死记硬背记住这些东西是不现实的,唯有长期坚持不懈的练习和使用才能达到随心所欲的地步,就像乔峰一般,任何平坦无奇的武功到了他的手里,均可化腐朽为神奇。难道就没有捷径和快速学习的方法么?

捷径真没有,方法可以有!今天就给大家说说如何通过 Vim 学习卡逐步实现从入门到精通。

所谓 Vim 学习卡,是用 Vimscript 编写的一个 Vim 脚本,其中包含了两百多个 Vim 用法。首先,我们把这个文件下载到本地,下载地址:

https://gist.github.com/gmccreight/7519289/raw/master.vim

为了避免混淆,把该文件复制命名为 study.vim,命令如下:

cp master.vim study.vim

用 Vim 命令打开文件,我们可以看到文件分为两部分,从第35行华丽的分割线以上是 Vimscript 脚本,用来创建三个命令:「,,」「,c」「,k」,后续我们将通过这三个命令操控 Vim 卡片。

分割线以下是两个队列,第一个是「= Study」,在37行,表示在学的 Vim 卡片。第二个是「= Known」,在831行,表示已知的 Vim 卡片。

开始时所有的 Vim 卡片都在学习队列种,每个 Vim 卡片有三行,第一行是命令,第二行是解释,第三行空行。代码片段如下:

M
go to the middle of the window(大写 M 把光标移到窗口中部)

L
go to the bottom of the window(大写 L 把光标移到窗口底部)

10L
go to the tenth line from the bottom of the window(10+大写 L 把光标从底部上移10行)

<c-d>
Go down half a screen(ctrl +d 向下翻半屏)

学习方式就是从第一个 Vim 卡片开始,学命令,看解释,然后进行操练,练习完成后通过那三个命令移动 Vim 卡片。具体做法:

1、在普通模式执行「:so %」,加载 Vimscript 脚本,定义上面提到的三个命令。

2、把光标移动到 Vim 卡片的第一行,执行:

,,:两个逗号,表示你已经比较熟悉这个命令了,但是还不放心,该操作会把 Vim 卡片放到学习队列的最底部。

,c:逗号+c,表示你对这个命令不明觉厉,希望很快再次见到它,该操作会把 Vim 卡片下移几位,这样你很快就能再次见到它了。

,k:逗号+k,表示你已经彻底掌握了这个命令,该操作会把 Vim 卡片移除学习队列,放入已知队列,也就是「= Known」的下面。

每次学习完成之后,用「:wq」保存退出,下次打开根据上次的进度继续学习。如此循环往复,生生不息,武功终将大成。

当然,你如果总结出了该卡片不包含的命令,也可以加入进来,不断完善,这个 Vim 脚本将变成你的 Vim 学习宝库。

这世界上一直存在一条路,让我们的能力从平庸到杰出,这条路漫长而艰辛,只有少数人愿意走下去,所以,优秀的人永远是少数——来自《MacTalk·人生元编程》