这两天我在玩一个 VimGolf 的游戏,也陆续写了一些解决其中部分题目的文章

介绍

先简单介绍一下这个游戏。

大家知道 Vim 以高效而闻名,高效狭义上讲就是能通过更少的按键完成更多的操作。于是有人做了这个 VimGolf 网站,用户可以自由提交题目(都是把一段文本改成另一段文本),也可以自由答题(需要在终端安装软件,除了安装官方的客户端 gem install vimgolf,还可以使用非官方的 Python 版本 pip install vimgolf,这样就不用因此安装 Ruby 了)。这个客户端会使用统一的 Vim 配置,确保所有人的环境一致,所以做题时不能使用自定义按键、配置中的函数、插件、外部命令等等。

安装完客户端,就可以做题了。可以全部在客户端操作,也可以先在网页浏览题目,找到想做的后,运行 vimgolf put [challenge ID] 答题,完整命令会在题目页面右上角显示出来,非常方便。

如果做对了(客户端会提示对错,显示差异),就可以根据提示把结果上传到网站,同时可以在网站的题目页面看到自己的排名和分数(分数即按键次数,组合键算 1 分,分数越低越好)。也可以看到其他人和自己分数差不多的操作方法,也就是说要想看到低分操作,自己得先提交低分操作,像爬楼梯似的。比如一个题目的最低分数是 10 分,而自己得了 50 分,那很可能只能看到 40 多分的操作,自己需要提交更低分数的操作(可以参考别人的输入),才能看到更低分的。如果分数很分散,那要提交好多次才能看到最低分的操作。

现在(2020-06-27)一共有 481 个题目,28401 个用户,335259 次提交。看起来并不是很火,但毕竟是少数人的游戏,能到这个量级就已经很可观了。只有不到 500 个题目,很快就做完了?先做几个试试吧,如果以最低分数为目标(先不考虑能否打破纪录),很快你就会发现这已经是一个天文数字了,你还会怀疑别人用的 Vim 和你用的完全不是同一个软件(不用显摆自己已经是多少年的老用户,我自己也用了十几年了,但在 VimGolf 里,我只是一个新手。做了十几个题目后,我发现自己几乎没有能力完全靠自己得到任何题目的最低分。我做了十多个,只有一个全靠自己得到了最低分,而且还不够优雅)。

另外说一下作弊的问题。简单说网站是不防作弊的,自己稍微改一下客户端,就可以作弊,比如使用插件或者外部命令,甚至直接上传错误的结果(我就在网站上看到过错误的结果)。网站上的规则中有这样一条:

8. Cheaters will be publicly ridiculed by fellow golfers :-)

作弊是一件很没意思的事情。

感想

现在想谈一谈我对这个游戏的感想。

我把它称作游戏,而不是提升 Vim 技能的方法,并不因为我认为它不能用来提升 Vim 技能,而是因为如果用它来练习,并且以最佳操作(分数最低的操作)为目标,很可能会舍本逐末。因为很多题目的最佳操作,其实一点也不“佳”,要么用了平时基本不会用到的奇技淫巧:

样例一

在每一个非空行的行首添加一个 *

这个题目看起来很简单,在每一个非空行的行首添加一个 *。把

This is a
very short

file, but it is 
still
full

of

surpises.

改成

*This is a
*very short

*file, but it is 
*still
*full

*of

*surpises.

看下“最佳操作”是什么?

@Sakigw

<C-V>GyPgvr*ZZ

我在上边链接的文章里有讲解。有人平时这么用 Vim 吗?我想即使多年的老 Vim 用户,他也未必能想出这样的用法来(甚至会因为结果不符合自己预期而感到疑惑)。

样例一结束

要么利用了特定数据集的特点而很难复用(比如经常会使用 7l、8G 等长距离定位):

样例二

2014 新年快乐

A HAPPY END WITH YEAR 2013 !

改成

A HAPPY NEW YEAR 2014 !

最佳操作是

@udioica

ww8sNEW<Esc><C-A>ZZ

里边有一个 8s。正常的 Vim 用户,会去数两个单词的长度,然后用 8s 吗?显然用 2cw 就可以了,虽然这样会多按一次键。

样例二结束

要么用了很多组合键(组合键和单键都是 1 分,但前者显然更不好按),甚至用了功能区按键(正常情况 Vim 用户是不会用的,但有时用它们能节省一次按键):

样例三

为文字添加边框

My dream is to be in a box

改成

###############################
# My dream was to be in a box #
###############################

最佳操作是

fiswa<Home># <End> #<Esc>YPVGr#pZZ

里边出现了 <Home><End>,这样可以节省两次按键,至于方便不方便……

样例三结束

所以很多“最佳操作”,都是 Vim 用户通常不会用的扭曲操作,很难复用,也基本提升不了效率,甚至会让自己养成坏习惯。

那我为什么还玩它呢?

玩法

这可以从两方面来讲,或者说这个游戏有两个玩法。

玩法一

追求最佳分数,不考虑实用性,只考虑游戏性。

这样一来,它就变成了一个非常烧脑的游戏,甚至和一些算法题目相比也有过之而无不及,因为算法还是可以分门别类慢慢学的,虽然内容很多,但至少成系统,从易到难循序渐进。而 Vim 的奇技淫巧连系统都不成,想系统学都没有教材,就算通读了几本书甚至篇幅很长的官方文档,也很难灵活使用。而且更重要的是,学它(特指那些用于节省按键的刁钻操作)也没太大用,不像学算法有很多用处。这看起来是坏处,从游戏性上说却是好处,正因为它没用,才可玩,才好玩。

估计没多少人感觉解算法题好玩,因为实用性压在那里,为了比赛,为了面试,为了工作,为了……太沉重了,没多少人把它当游戏玩。就算有人享受它,很多也是享受它功利性的一面,比如拿到奖牌、得到满意工作、解决工作问题后的喜悦。而玩 VimGolf 是很难有什么功利性的,就算自己排第一又如何?向别人炫耀,对方说不定都会嗤之以鼻,甚至搞不清楚你说的是个什么玩意。

玩法二

如果一定要讲究实用性,也有办法。

那就不要追求最佳分数,原因就像我上边说的,最佳分数的操作经常并不实用(也不绝对,还是有实用的)。但这并不意味着所有的操作都不实用。次佳操作(分数只比最佳操作高一两分之类)往往是实用的高效操作,而在玩这个游戏之前,很多 Vim 用户的操作是非常低效的,这里有巨大的提升空间。而提升之后,自己写代码、文档甚至普通文章的效率会同步提升,从而节省大量时间。这会伴随着自己的一生。从这个角度说,它的实用性甚至比学算法还要强,毕竟很多人在实际工作中也用不了多少算法知识,长期不用慢慢都忘了。

当然也可以把这两种玩法结合起来,既当益智游戏玩,同时又提升自己的 Vim 技能,把握好分寸就可以了。

和算法题的比较

我一直把它和算法题比较,看起来好像没什么可比性,实际上二者还是挺像的。

  • 题目都分三部分内容:描述、输入、输出。条理清晰。
  • 都需要提交程序代码。没错,Vim 的按键序列也是一种程序代码,而且很多时候,就需要使用编程的思路来仔细规划按键,才能得低分。
  • 提交的代码都相当难懂。我想不少人都有去网上搜一道算法题然后盯着乱码般的代码直皱眉的经历(比如充斥着单字母变量名和函数名,糟糕的换行和缩进,当然这样的代码是不被提倡的)。而提交到 VimGolf 的代码“更胜一筹”,几乎就是乱码,而且是不能有代码风格的(缩进?注释?啥也没有),阅读就是破译。不信吗?阅读一下这个试试:qaJr;q11@areqbF r;quqcj$10@b0,.q22@cr ,r;ZZ 看看能读出它的功能不,不是每个字符的功能,而是这一行整体做了什么事。这是某一个题目的非最佳操作(因为某些原因,最佳操作我还没看到)。
  • 程序都可以自动判断对错,自己马上就知道做对了没有(对算法题来说这是关键),以及所用的资源(算法题的时间、空间和 VimGolf 的按键次数。对 VimGolf 来说这才是关键)。
  • 提交之后可以查看自己的排名,并且可以重复提交刷新排名(至少在某些平台可以)。

对一个 ACM ICPC 选手来说,VimGolf 还是很亲切的。如果你已经对算法题厌倦了,可以换个口味,试试 VimGolf,重新体验一下最初被虐的感觉。或者把实用与名利置之度外,单纯享受一下游戏的喜悦。

关于 Vim 的一些想法

VimGolf,当然围绕着 Vim。我虽然也用了很久的 Vim,但就像把一年的 Vim 经验重复了十年,只会一些基础操作。我想和我类似的 Vim 用户并不少见。包括很多夸赞 Vim 效率高的用户,实际并不知道它的效率有多高。这里有一个简单的“事后”判断方法,如果一个人很轻易就从 Vim 迁移到其他编辑器或者 IDE 了,即使用了模拟 Vim 的插件,那说明他只是一个 Vim 新手,不管他用了多少年了。我知道很多人对此有异议,那我建议你先做十几个 VimGolf 的题目,都拿到最低分,再回来讨论。讨论之前还可以再试试那些低分操作在你的 Vim 模拟插件上能不能正常使用,或者想想会不会有人那么用。不然很可能你说的 Vim 和我说的 Vim 完全不是同一个东西。把 Vim 当记事本用也可以,并且随时都可以轻松迁移到更“强大”的工具。

最近我在像一个新手一样学习 Vim,体会到了很多不一样的东西。就像自己家中一直有一块金子,我却一直把它当板凳用。当然这个比喻不大合适,Vim 还是要用的,而不是藏起来或者卖出去。我对 Vim 的兴趣可能持续不了太久,但我对它的想法永远改变了。当然不是宗教般的崇拜,它只是一个工具,工具是拿来用的,不是用来崇拜的,也不是用来比较的。所以我不想让它和其他软件比较(记事本除外,因为真的没有什么可比性,所以比较一下还是挺有意思的)。我也不想贬低各种其他环境中模拟 Vim 的插件(我自己也用了一些),这对 Vim 的生态很有利,简直是 Vim 用户特有的福利。前几天我专门看了下 VS Code 的 Vim 插件功能列表,已经实现很多功能了,虽然还有很多没有实现(包括被认为不重要甚至没必要的功能)。

我想很多人会怀疑花精力去学一个文本编辑器的用法是否值得,把这精力放在其他更有用的地方不是更好吗?但在电脑上用的技能,至少长期来看,很难说有什么比熟练使用一个功能强大的文本编辑器更有用。学一门编程语言当然有用,但有多少人会用它一辈子,也许用不了几年就换别的了,或者从天天用的主要语言变成了一个偶尔用的辅助语言。各种专门的软件当然也有用,各行各业的,都是吃饭的家伙,但那些工具又有多少是屹立不倒的,自己又有多大把握一辈子从事同一个行业,用同一款软件,更不用说自己并不是只有工作时才用电脑。而只要用电脑,就会有编辑文本的需求。有些人可能不这么认为,发现没什么编辑文本的需求。那是因为他们用更低效的方法做了那些事情,而不是没有需求。夸张点说,键盘敲击或者非形象化(形象化是指类似用笔画图那样的操作,有坐标对应关系)的鼠标操作,只要工作量和复杂度上去了,基本都可以转化成编辑文本。工作量不大确实没必要折腾,复杂度不高只需要映射按键(这个也是很有用而很多人都不会去做的事情,甚至熟悉软件默认快捷键的人也不是很多,而默认的快捷键往往不好用——这也是很多人不愿意用的原因之一——当然除了 Vim 等少数特例),不需要编辑文本。

如果只从工作甚至赚钱的方面说也可以。学一门编程语言或者一些算法之后,就可以把它写在简历上,用它找到自己想要的工作,然后每个月数钞票或者数字。而学 Vim 能往简历上写吗?能给自己带来收入吗?精通 Vim?可能想和你较真的人都没有,希望你还能得到面试机会。所以 Vim 根本不值得学。是这样吗?

Vim 确实不适合写到简历上,但不意味着它在工作中没有用,也不意味着它不能给自己带来收入。决定自己收入的,不只是那一份录用通知书(offer)。我以前也在大公司待过,很多同事的技术比我高,收入比我多,加班时间也比我长(画风好像不大对)。加班时间比我长的原因,除了工作年限更长事情更多之外,还有一个重要原因,是工作效率低下。我这里不特指编辑代码或者文本的效率,而是方方面面的效率。我工作的那几年,基本上除了特殊情况(比如晚上开会),我基本都上午十点左右上班,下午六点左右下班,中午休息一个多小时,回家不工作,周末不加班。而我没有看到周围任何一个同事能做到这些(可能有些人能做到但不想做,毕竟我也见识过享受工作的工作狂)。我不是讨厌工作才这样,恰好相反,我一直很喜欢工作(除了最后一年比较特殊),经常在下午的几个小时进入心流状态。刚才还两点多呢,再一看表,五点多了,收拾一下就吃饭下班了。而这几个小时的工作量,可能很多同事需要用一整天甚至更长时间来做。而且我每天都写日报(一般只有刚入职一年的需要写,方便导师跟进),把自己当天做了什么写得清清楚楚,所以我从来不怕有人(不管是同事还是上级)说我下班早的事情(实际上从来没有人找我说过)。

那么就来算一下钱的问题。我每天工作 5.5 个小时左右(10:00 左右到公司,随便收拾下,15 分钟后开始工作,11:45 左右吃饭,然后休息或者做些自己的事情,14:00 左右开始工作,17:45 左右去吃饭,吃完饭回家)。而我周围的同事基本都是这样的,09:00 到 10:00 来公司,随后开始工作,12:00 多去吃饭(通常会等人多了再去,然后在排队上浪费时间,甚至很难找到座位),13:00 左右回来继续工作(有些人会午休,一般时间不长),18:00 多去吃饭(继续排队,或者去周边的饭馆),19:00 之前回来继续工作,20:00 到 21:00 结束 。即使不考虑周末加班或者在家工作的情况,每天也要比我多出将近 4 个小时(2.5 + 5 + 1.5 = 9)。这都会在时薪中体现出来。估计没有人会认为一天工作 5.5 个小时和 9 个小时,收入一样,钱的方面就没有区别。

当然我的那些时间并不是通过使用 Vim 省下来的,这可能有些跑题。但熟练使用 Vim,或者其他功能强大的编辑器,确实可以为自己节省很多时间,这些时间都是直接和钱挂钩的。不说写代码尤其是改代码或者看代码时,熟练使用编辑器可以为自己节省多少时间。工作中经常需要处理各类文本,调整个格式、抽取个数据之类,有些时候不得要领的话,工作量是很大的(即使不是全手动,半自动的话工作量也可能很大,当事人可能认为自己的效率已经很高了),搞不好一下午就搭进去了,而且不出活,还很影响心情。那时我对 Vim 还不熟悉,虽然每天都用,但经常用 Shell 脚本处理文本(其中一些还可以重复使用),节省了大量时间。所以在我的印象中,awk 和 sed 要比 Vim 强大很多,稍微复杂点的改动我都要动用它们。现在看来,只是因为我对 Vim 太不了解了。

我们对高效率通常都是怀疑甚至排斥的。只要现在的方法还能用,即使效率低些,也不愿意换更高效的方法,于是很多时间都浪费掉了。我们还容易高估抛弃旧习惯形成新习惯的难度,认为自己已经习惯了,也很难改了,不然就这样吧。实际上没有那么难,刚开始肯定有些不适应,但很可能只需要花几个小时学习,几天时间适应,就完成了过渡。

拿我的一次经历来说。我高中时学的五笔,但用得少,慢慢有些字就不记得编码了,于是改用五笔拼音。但越来越发现用拼音其实就可以,尤其是联想功能很好用,而且那时的手机都是九宫格键盘,没法用五笔。但有一点我很难接受,有些韵母太长了,输起来很不舒服(比如 shuang,一个读音要六个字母)。当时我在工作时经常需要打汉字,所以就开始想怎么办。于是我决定学双拼,不为了提升打字效率,只为了能舒服些,不用输入长韵母。双拼本身倒没什么难度,无非是韵母和键盘字母的对应关系,但形成习惯就不大容易了,尤其是在切换期,可能比较痛苦。

我在一个周末,从熟悉某一个双拼的对应关系,到打一些简单文字,基本两天时间就能磕磕绊绊使用了。到了下周一,我就开始使用双拼了。那时我经常需要打汉字(在聊天软件帮忙解决技术问题,这个是需要速度的,不能让对方等太久,不然他转眼就干别的去了,大家一起浪费时间),但没有我想象的那么痛苦,肯定没有之前舒服,偶尔会忘了哪个韵母对应哪个键。但基本上隔天就习惯了,形成了好几年的打全拼的习惯,在半周时间就完全改了。

现在也是一样。我给电脑映射了很多自定义的快捷键(比如全局的就有 Win + ... 和 Alt + ... 几十个),特定的软件中还有更多。但经常发现某一个快捷键设定地不是很合理,比如有更常用的功能需要映射到更方便的按键。这种情况,即使我已经习惯了,还是要改,因为我知道最多不适应几天,很快就习惯了。如果不改,那会影响之后的长期效率。

话说就在前几天我刚改了一个严重影响我使用习惯的按键映射,把 CapsLock 映射到 Ctrl 上(之前一直是映射到 Esc 上,至少六年多了),然后设置 CapsLock 弹起后触发一个 Esc。然后我开始将 CapsLock 当 Ctrl 用,这样很多操作都更方便了(想想 Ctrl + a/s/c/v/w/f/j/k/l/...,很多都是常用快捷键,这一下能省多少事,左小指再也不用来回窜了)。唯一有点不方便的居然是 Vim,原来是按下触发 Esc,现在是弹起触发 Esc,这区别可大了,如果后边的键按快了,Esc 还没发出来,就会导致按键顺序错乱。我开始时想把 Ctrl 映射为 Esc,用手掌按,试几次好像感觉不错,但用一阵就不舒服了,根本不可行(如果你是铁掌可以无视)。我还尝试把 Alt + ; 映射成 Esc,但毕竟是组合键,用起来总是没有单键那么方便,而且和 CapsLock(即使是弹起触发)相比,也提升不了效率。所以我还是选择去适应 CapsLock 弹起触发 Esc。

这些其实都和 Vim 有关,因为涉及自己习惯的改变。有些习惯可能持续很久了,虽然效率低,但至少能用,那自己可能就没有改变的动力,认为成本很高或者收益很低。实际上成本没有那么高,收益更没有那么低,改变一下是一劳永逸的。

总结

本来只想谈谈 VimGolf,没想到发散到别的地方了,好在多少有些相关性。VimGolf 的确是一个可以尝试的游戏,还至少有两种玩法(见上文),既可以用来休闲娱乐,也可以用来提升效率,并且不易引发一些功利性的想法。如果你也是一个 Vim 用户,可以稍微了解一下,说不定还能培养出一个新的兴趣爱好。

文章目录