Vim作为一款神级编辑器,却有非常陡峭的学习曲线。网上大部分的教程很多仍然以背指令为基础,很容易让人望而却步。之前我也多次想要学习Vim但是最终都放弃了。直到使用Vim-Adventures才发现要入门Vim其实一点也不难,而且只要熟悉了一些基本命令以后,Vim的使用体验就绝对超过市面上大部分的编辑器了。
就我个人的体验来说,理解Vim的指令并不难,难点在于掌握Vim需要大量的重复练习。初学Vim的人很难有大量使用Vim操作的环境,或没有安全的可以进行编辑的文本,或无法忍受初学Vim时相对下降的编辑效率,从而很快就放弃了Vim。
Vim-Adventures是一款基于Vim操作的网页版游戏,通过一些游戏行为能潜移默化地熟练Vim的基本操作,最终形成肌肉记忆。同时Vim-Adventure给予了玩家一个安全的、可大量重复练习的环境,从而在短时间内获得使用Vim的快感,最终能够体会到Vim的强大。
Vim-Adventures的难度梯度还是比较平缓的,前几关都能够很简单的完成。但是随着游戏的进行,挑战难度会逐渐增大。鉴于网上没有看到比较全面的中文版的攻略,在全部通关Vim-Adventures后,我把每一关的流程攻略写在这里,给有兴趣学习Vim的朋友参考。
Level 14部分参考了github:
https://github.com/pepers/vim-adventures
需要特别说明的是,整个攻略基于我自己的尝试,很有可能不是最优解,需要其他玩家共同发掘。同时强烈建议除非卡关很久否则尽量不要看这个攻略,自己实践的训练效果是最好的。
全文最后有一个小彩蛋,关于学习git的使用。
在学习Vim的基础命令前,有一些游戏命令需要了解。
:login # 登录命令。必须登录才能继续Level 3以后的游戏内容
:stats # 显示统计数据,主要显示每关的按键,用时等
:keyboard # 显示当前可以使用的指令。可用指令随着游戏进程逐步增加
:w <'filename'> # 储存游戏进度,最多可以储存3个游戏进度。如果已有同名进度,需要使用:w!覆盖。此命令本身也是Vim命令
:e <'filename'> # 读取游戏进度。此命令本身也是Vim命令
:!ls # 列出当前储存的游戏进度。注意和':ls'区分
:!rm <'filename'> # 删除游戏存档
:q # 退出游戏。此命令本身也是Vim命令
:level <'n'> # 一旦通过某关,则可以使用:level命令直接跳转至该关开头
第一关主要是熟悉Vim的移动。Vim中移动光标可以用hjkl也可以用上下左右,但是既然都用来学Vim了,那就尽量不要用上下左右。实际上习惯了hjkl的移动方法以后,手不用离开主键盘区就能实现光标移动命令实在是方便的不行。在Vim Adventures里,如果你想用上下左右移动的话,游戏也会提示你使用hjkl的,所以就老老实实学习这个使用方法吧。
游戏中的小人主要是讲解游戏剧情和一些使用技巧,除了最后一关和中间一些涉及游戏进程的对话以外都可以不用太在意。
首先先移动到钥匙位置取得第一个钥匙,注意上方的Remember里的箱子现在暂时是打不开也过不去的,不要过多纠结,一路穿越迷宫向右,消耗刚刚得到的钥匙打开拦在路上的箱子(门?Whatever。。。)进入草地。
现在发现如果想直接过去会有一个反向台阶阻拦,这里需要用到一个技巧:在较长的一行向较短的一行移动时,如果光标超出较短一行的长度,光标会进入较短的一行的最后。但如果继续从较短的一行向较长的一行移动,则光标会回到一开始光标位置的同一列。
因此,只需要将光标移动到草地的第一行最后,然后按j向下即可越过台阶。第二和第三个台阶同理。
越过三个台阶,和皇冠紫发小人对话,按Esc进入第二关。
在第一行获得指令w
。w使光标跳转至下一个单词的开头处。
使用w和hjkl进入石块中间获得第一个钥匙和指令e
。e使光标跳转至当前单词的结尾处,如果已经在当前单词的结尾,则跳转至下一个单词的结尾。
进入最后一行获得指令b
。b使光标跳转至当前单词的开头处,如果已经在当前单词的开头,则跳转至前一个单词的开头。
使用e进入石块中间获取第二把钥匙,向上混合使用w, e, b获取第三把钥匙后打开三个箱子,和皇冠紫发小人对话,按Esc进入第三关。
在第二行Blue处获得指令B。B和b的区别在于b将标点及空格视为单词间分隔而B只将空格(包括tab)视为单词间的分隔。
标红框的暂时无法处理,先将光标移动至草丛边带帽子小人,接下来屏幕右上角会有30秒倒计时。玩家需要在30秒内到达整段文字的最后。
先按j进入文字,按Esc跳过屏幕滚动。17个w到达第三行on,4个e到达my,不断尝试重复使用we之后到达最后一行拿到指令x,等30秒时间到后就会被传送会文字开头。
x可以删除当前光标所在的字符。使用x将Roses段落内标记红框的字符删除后可以获取棕色钥匙。混合使用hjkl, wbB按照原路返回第一关游戏最开始处Remember段落。光标移动至“!”处,使用B进入段落,打开棕色宝箱,获得蜡烛。
如果要继续下面的游戏需要注册付费,费用是25美刀,有效期半年,可以使用信用卡进行支付。
注册付费后就可以使用注册的账号登录。使用全文开头给出的命令可以实现登录,保存游戏进度,读取游戏进度,选择关卡等功能。
拿到蜡烛以后,只能看到附近一点范围的地图,返回之前获得棕色钥匙的小岛,和皇冠紫发小人对话,按Esc进入第四关。
向下走几步后黑暗状态会解除,用x删除所有标红框字符后获得指令W和指令E。W E对应w e的效果和B对应b的效果非常接近,可以类比理解。
在script段落,从<开始,按E跳至>,向下到第三行按B到达句首,移动获得指令r。指令r的作用是替换,按r后输入正确的字符就可以替换当前的字符。将红框内红色的字符用r替换为黑色字符,分别为r0 r< rl rm ra rr rr即可完成本段。和皇冠紫发小人对话,按Esc进入第五关。
从第五关开始游戏难度逐渐提升,各个puzzle的路径也变得不是特别直观。在接下来的攻略中,将用每个puzzle的开头单词作为puzzle的标识。
回顾之前的x和r指令,注意有变化红框的就是需要用r替换的,否则就是用x删除的。
完成后获得指令d。d和x都起删除的作用,但是x一次只删除一个字符,d可以删除多个字符/行/段落。这里需要说明的是,单独的d并不起作用,d需要配合一个定位符来使用,原因很好理解,因为x就是删除当前光标所在的字符,但是d删除的是一个范围,需要根据光标的定位删除当前光标和指定光标之间所有的字符。dd可以直接删除当前一整行,这是vim中的一种快捷方式,以后也会有很多指令有类似的效果。
注意从这里开始,需要删除的红框就不止一个字符了。如果红框框住多个字符,说明需要在一个指令内删除。比如"gone"中的"ne"就不能用两次x删除,必须一次清除。
完成后获得金色钥匙。
在第4行的affair处按e进入路中间。向上回到右侧,进入These段。
注意明面上看似乎都处理完毕,但是最后有一句"BTW, X does mark the spot"提示还有一个小puzzle未解决。
在X处按x,会出现提示:当向前删除时,光标所在位置的字符不会被删除。因此,在.处db,可以删除X和后面的空格,从而完成这个puzzle。
完成后获得金色钥匙。
使用获得的金色钥匙打开两道门后和皇冠紫发小人对话,按Esc进入第六关。
从第六关开始,整体难度再次提升,大部分的puzzle有了按键次数的限制,这要求玩家用精简的方式对字符进行处理,这也符合Vim操作的核心宗旨。一旦puzzle内按键次数超过限制,则会直接跳出puzzle,puzzle内的所有已经处理的内容全部清空。
在限制按键次数的puzzle中,puzzle的按键次数上限是比较严苛的,有不少puzzle我反复试了很多次,都只能在上限按键次数完成。但是就是在这样反复思考的过程中,Vim的水平可以得到进一步的提高。
"Some"的m处开始。
进入Some段后就可以看见右上角的"8 key presses to go",说明这个puzzle需要在8个按键内完成。
小技巧:
完成后获得金色钥匙。
第2行"beard"的b处开始。
完成后获得指令~。 指令~的作用是大小写的互相转换。
"begin"的b处开始。
完成后获得指令$。 指令$的作用是跳转到行最后。
"Shaken"的S处$跳转至感叹号,进入下一部分。
第4行"Understand"的U处开始。
完成后获得指令0。 指令0的作用是跳转到行开头。
第1行"With"的W处开始。
完成后获得指令^。 指令^的作用是跳转到行的非空首字符。
第4行开始。
完成后获得金色钥匙。
本段不限指令次数,结合之前的操作可以简单通过。
完成后获得金色钥匙。
使用获得的金色钥匙打开两道门后和皇冠紫发小人对话,按Esc进入第七关。
第七关开始出现可以进入的小草丛,而且里面会有NPC和指令藏在其中。
puzzle前有一个门被锁住,目前没有钥匙可以打开。
通过puzzle后向下,进入下一个puzzle。
完成后获得金色钥匙。
使用钥匙打开边上的大门,获得指令%。 %可以方便的在()[]{}等符号间做跳转。
完成后获得金色钥匙。
向上回到海岛puzzle,和Alice前的小人对话,搭配0可以迅速返回puzzle一开始的大门,使用钥匙解锁后获得指令g。g是一种更加迅速的跳转方式。gg可以直接到达全文开头,G可以直接到达全文结尾。if段的puzzle也可以用dG替代d%处理。
有了指令g以后可以迅速跳转至海岛下方。
完成后获得金色钥匙。
使用钥匙解锁,和皇冠紫发小人对话,按Esc进入第八关。
开始后需要重新回到之前的区域,因此需要原路返回。注意返回时同样有限制指令次数的要求。
即可回到主路线。
本段不限指令次数。
完成后获得指令*。 指令*是查找光标(光标后)最近的字符,同时跳转过去。
本段之前的海洋不同,黑色区域一旦进入就会传送回之前的位置。
由于没有足够的指令,这个puzzle暂时无法完成。先暂时离开puzzle,向下移动。
指令n类似于, ;,是对*和#的重复。同样,大写N是对* #的反向重复。
指令#作用和*类似,但是查找方向相反。有了#指令就可以回到Here’s段
当使用* #进行搜索时,整个段落中的匹配是内容都会出现,也就是说,这种搜索是全局的,因此,搜索出的结果和记录也是全局的。所以要解决这个puzzle,首先到You段第5行"You"处。
和房间内小人对话后,小人会在10秒后将你传送到他的第一个兄弟处。
传送后和小人对话,小人会要求你去最后一个兄弟处,如果60秒内不能到达,就会被传送回之前的位置。这时发现这个puzzle无法跳转。仔细观察发现,出口处是一个.,因此,需要在之前的段落标记好.,然后使用n进行跳转。
和皇冠紫发小人对话,按Esc进入第九关。
使用金色钥匙打开大门,获得指令数字。数字指令可以说是Vim中最好用的指令之一,数字可以对后面的指令进行重复,极大地减轻了指令操作次数。
注意这个puzzle需要按照指定的顺序到达每个字符。字符右上角的数字表示移动顺序,从1直到7。
通过puzzle后向下,进入下一个puzzle。
通过puzzle后向下向右,进入下一个puzzle。
完成后获得金色钥匙。
原路返回:
回到主路后向左,进入下一个puzzle。
通过puzzle后向上,进入下一个puzzle。
这段猛看似乎可以使用*+,;的方法处理,但是实际上在Vim中,*和#是对整个单词进行识别的,而这个puzzle中,由于没有空格等区分,因此几乎每一行才被视为一个单词,因此*和#是没有办法使用的。
通过puzzle后向下,回到You段puzzle。
通过puzzle后向下,使用一把金色钥匙打开门,进入下一个puzzle。
完成后获得金色钥匙。
使用三把金色钥匙打开门后,和皇冠紫发小人对话,按Esc进入第十关。
在上一关和皇冠紫发小人对话的边上可以看到灰色的字:“DELETED Is Not Really LOST”。正是这句话引出了第10关的内容。
在通常的文本编辑器中,删除的内容就是删除了,想要恢复就要不断的撤销(其实被删除的内容也是被储存了起来,只是不能显式地调用而已),在Vim中,被x或d删除的内容也是如此,这样的删除并不是真的被删除,而是类似于剪切,统一被保存在寄存器(register)当中。Vim里有多种寄存器,如无名寄存器(unnamed,最常用的寄存器),小删除寄存器(small delete),数字寄存器(numbered,1-9),具名寄存器(named,a-z),黑洞寄存器(black hole)等。寄存器的知识会在后面详细讲到。
首先先获得指令p,指令p就是粘贴,默认粘贴会粘贴最近一次复制或者剪切的内容,在当前,就是删除的内容。p是在光标后粘贴,P则是在光标前粘贴。
在下方使用d和x剪切特定内容后,在提示的对应位置粘贴即可。
完成后获得金色钥匙。
右上角的箱子需要棕色钥匙才能打开,暂时先不用理会。使用金色钥匙打开大门向下,进入下一个puzzle。
完成后向左向下,进入下一个puzzle。
完成puzzle后获得指令",使用"就可以显式地指定剪切/复制所使用的寄存器。同时,:reg可以看到当前寄存器的使用情况,即储存的内容。向下进入下一个puzzle。
完成后向下进入下一个puzzle。
这里删除的三行,使用:reg打开寄存器,可以看到编号1-3的3个寄存器保留了刚刚删除的三行内容。当我们需要粘贴时,可以在p前使用"加上寄存器代码,显式地复制寄存器内保存的内容。
注意进入限制指令的puzzle后,打开寄存器查看也是消耗指令次数的。因此,在进入puzzle前先确认这个puzzle需要粘贴的内容对应所在寄存器的数字编号。我的寄存器内容为:
"" 99 bottles of beer (无名寄存器,保留最近一次剪切的内容)
"1 99 bottles of beer
"2 on the wall.
"3 pass is around,
完成后后一直向上,然后向右向上,进入下一个puzzle。
如果直接删除X,那么在第一行粘贴时就无法成功粘贴t,因此,需要先将t保存在指定的寄存器当中。
完成后向右进入下一个puzzle。
除了数字寄存器之外,还有具名寄存器,使用a-z进行命名。当某个具名寄存器已经有内容存放时,"[a-z]会替换寄存器内的内容,而"[A-Z]则会在对应寄存器后进行追加。
完成后获得棕色钥匙。回到关卡开始处,打开棕色箱子,获得指令y。指令y即为复制指令,思路与d接近。
返回获得棕色钥匙的地方,向下进入下一个puzzle。
完成后获得金色钥匙,向下进入下一个puzzle。
完成后获得金色钥匙。回到左侧最下方,进入下一个puzzle。
这个puzzle需要的内容为:“Betty rules” “tweetle bettle” “on the wall” “One Ring”,对应内容需要在整关中找到并存入寄存器后粘贴。
我的寄存器内容为:
"a Betty rules
"b tweetle bettle
"c on the wall
"d One Ring
全部粘贴后使用3把金色钥匙打开三扇门,和皇冠紫发小人对话,按Esc进入第十一关。
进入11关后会发现跳转到天空图。实际上这是Vim的缓存区,用以同时处理多个文件。使用:ls可以看到所有的工作区,当前所在的工作区前标记%,前一个工作区前标记#。
完成后获得指令c。c也是非常常用的指令,用于替换一段字符内容。相当于删除一段内容后重新输入,这里不要求删除前的内容长度和输入后的内容长度相同,理论来说,c一个字符后重新打一万个字也是没有问题的。
完成后向下进入下一个puzzle。
完成后获得指令s。指令s是直接替换当前所在字符,和c需要指定目标位置点有一定的区别。
向上回到关卡开始处,向右进入下一个puzzle。
完成后向右进入下一个puzzle。
这段完成后需要切换工作区,直接:b#就可以跳转回到地面进入下一个puzzle。
完成后获得蓝色钥匙,向下进入下一个puzzle。
完成后获得棕色钥匙。:b#返回天空,使用蓝色钥匙打开大门,使用棕色钥匙打开宝箱,获得指令i。指令i是在当前字符前插入文字。
其实从这关开始,对Vim的操作就已经从Normal模式加入了Insert模式。i是进入Insert模式最常用的方法,在Insert模式下,一切按键都会变成输入,而不作为指令执行。
获得指令i后就可以回到关卡开始处一直向下,进入下一个puzzle。
完成后向右进入下一个puzzle。
完成后获得指令a。指令a和i几乎完全相同,唯一区别就在于i是在光标前插入而a是在光标后插入。
:b#回到地面,进入下一个puzzle。
:b#回到天空,使用蓝色钥匙打开大门,获得指令o。指令o会在当前光标下新建一行并同时进入Insert模式,O则是在上一行插入。
向左向上返回,进入下一个puzzle。
完成后向右进入下一个puzzle。
本段不限指令次数,结合之前的操作可以简单通过。
完成后:b#回到地面进入下一个puzzle。
完成后出现小人,对话给出第一个提示,要进入underground file,箭头岛(arrow island)的第二个词"Sesame"应该为"underground"。
可以看到"Open Sesame"是一个箭头的标记,即所谓的箭头岛(arrow island)。说明这个是通往下一个关的地方。向上进入下一个puzzle。
完成后出现小人,对话给出第二个提示,箭头岛(arrow island)的第一个词"Open"应该为":e"。
完成后获得红色钥匙。在全文一开始的指令中也有提到,:e是打开一个文件,在这里输入:e underground进入underground。
使用红色钥匙开门后进入下一个puzzle。
完成后和皇冠紫发小人对话,按Esc进入第十二关。
最后这几关的难度比较大。从12关开始有了会动的“bug",一旦碰到就会被踢回关卡开始,所以反复重来是不可避免的,同时还要一定的熟练度保证眼疾手快,而且还需要有些耐心。好在被bug踢回关卡开头处并不会导致关卡的重新读档,所以不用太有压力。当然,bug们也是可以被消灭的,根据bug身上标示的指令,只要他们出现在指令的影响范围内,bug就会被消灭。因此,d和y会在面对bug的时候非常有用。
完成后获得指令==()==。小括号()会在整句话之间进行跳转。整句话的标识为句号.,问号?和感叹号!。向上进入下一个puzzle。
完成后获得指令[]。中括号[]本身需要搭配()或者{}使用,用来查找未闭合的()或{}。向左进入下一个puzzle。
完成后获得指令{}。花括号{}会以段落为单位进行跳转。向下进入下一个puzzle。
完成后向下,]),进入下一个puzzle。
完成后向上原路返回,进入下一个puzzle。
完成后获得棕色钥匙,向下进入下一个puzzle。
向上使用金色钥匙开门后进入下一个puzzle。
完成后获得红色钥匙。向右进入下一个puzzle。
完成后回到开头处,使用蓝色钥匙打开大门进入下一个puzzle。
完成后获得第二把红色钥匙。向上右下后找到两个红色大门,使用红色钥匙打开右边大门后进入下一个puzzle。
这段是不能使用i a进入Insert模式的,只能使用复制粘贴完成。
完成后获得指令.。指令.会重复最近一次进行的修改,是批量处理字符的好方法。使用红色钥匙打开左侧大门,进入下一个puzzle。
完成后向下进入下一个puzzle。
完成后获得蓝色钥匙,向下进入下一个puzzle。
完成后进入下一个puzzle。
完成后使用蓝色钥匙打开大门,和皇冠紫发小人对话,按Esc进入第十四关。
由于对数字13的迷信。。。这关不存在。。。
进入第14关会发现,所有的移动指令都不能使用了。所有能用的指令只有y c d z等几个。
:b4 回到lorem buffer,找到之前打开的传送门:37 68|,mB /g
Vim Adventures对于入门Vim是非常好的学习工具。非常详尽地讨论了Normal mode和Insert Mode下的操作和使用,也少量地涉及了Command Mode,唯一美中不足是没有涉及关于Visual Mode的部分,不过相信通过了整个关卡的训练,玩家已经对Vim有了手感,剩下的就是自己的摸索和锻炼了。
Git是现在最流行的版本管理工具,相关的介绍这里不多提供。在这里给出一个学习git非常好的网站,和Vim Adventures一样,同样是用游戏的方式学习。
网址如下:Learn Git Branching: https://learngitbranching.js.org/
相比于Vim Adventures,Learn Git Branching全部免费并且有完全的中文翻译,对于新人非常友好。只需要1-2个小时就可以对git的常用指令如:
等能有一个直观的理解和记忆。
由于题目难度不大且有官方答案提供,因此就不多做赘述,仅做一个小小的安利。
以上,完结撒花~