本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。Vim难学难用?但事实是,它仍然受到许多程序员的欢迎。也许只是你的“打开方式”不对。最近,GitHub上出现了一个名为LearningViminaSmartWay的项目。上线短短几天,就已经收获了2200颗星。那么,这种学习Vim的方式有多“聪明”呢?与Vim“交流”的聪明方法许多人可能会被Vim命令的复杂性吓倒。因此,作者将Vim命令的一般结构分解为简单的语法规则。这也是本教程中最重要的一章——一旦你理解了Vim命令的类语法结构,你就可以和它“畅所欲言”了。按照作者的说法,“你只需要知道一条语法规则”就能说出Vim的语言:动词+名词如果用英语短句来打比方,例如:Eat(verb)adonut(noun)Kick(verb)aball(名词)现在,只需使用基本的Vim动词和名词来增加你的词汇量。Vim的名词和动词这里所说的名词是Vim中的一些动作,例如:h:左j:下k:上l:右w:移到下一个词的开头}:跳到下一段$:移到Vim中的行尾和动词等同于操作符。以h运算符为例,Vim中有16种类型,但你只需要知道其中的3种就可以满足80%的要求。y:复制d:删除文本,保存到寄存器c:删除文本,保存到寄存器,开始“插入”模式:从当前位置拖到行尾dw:从当前位置删除到下一个单词的开头c}:将当前位置更改为本段的结尾当然,像这样的组合也接受数字作为参数中,例如:y2h:向左拉2个字符d2w:删除接下来的2个单词c2j:改变接下来2行的内容另外,linewiseoperations(逐行操作)是文本编辑中常见的操作,因此,Vim也允许你通过连续输入2个运算符来完成这样的操作。例如输入“dd”删除整行;键入“cc”以更改整行。可组合性和语法讨论完Vim语法之后,就是Vim的可组合性。可组合性意味着拥有一组通用的命令,这些命令可以组合起来执行更复杂的命令。Vim可组合性的真正威力来自与外部程序的集成。比如现在有一段“乱七八糟”的文字,如下:Id|Name|Cuteness01|Puppy|Very02|Kitten|Ok03|Bunny|Ok现在需要将这些文字转换成表格形式,如果使用Vim使用column终端命令执行此操作可能有点困难,但可以使用column终端命令快速完成。将鼠标指向“ID”并运行!}column-t-s"|"得到一张漂亮的桌子:IdNameCuteness01PuppyVery02KittenOk03BunnyOk回头看看刚才的命令。“!”是一个过滤操作符,“}”是一个名词,过滤操作符接收另一个参数,它是一个终端命令,“column-t-s”|“”。总之,经过这样的操作,就完成了对文本进行制表的任务。再比如,除了制表之外,要过滤带“OK”的行,还可以这样做:!}column-t-s"|"|awk'NR>1&&/Ok/{print$0}'结果是:02KittenOk03BunnyOk这是与Vim进行“交流”的巧妙方式。但作者也指出,刚开始学习和适应这种“Vim语法”需要一定的时间,但一旦熟练了,就可以轻松驾驭。更多基于Vim语法的操作介绍了Vim的语法规则后,你可以基于它们完成更多的操作和任务。比如本教程第五章介绍了“如何在文件中移动”。刚开始使用键盘完成这个任务肯定比较慢,但是笔者相信只要熟悉了这种方法,就会比使用鼠标更快。最基本的操作就是将一个字符向左、右、上、下移动:h向左j向下k向上l向右在字符之后是以文本为单位的移动。W:移动到下一个单词的开头E:移动到下一个单词的结尾B:移动到上一个单词的开头gE:移动到上一个单词的结尾接下来是以“行”为单位move:0:移动到当前行的第一个字符^:移动到当前行的第一个非空白字符g_:移动到当前行的最后一个非空白字符$:移动到当前行的最后一个字符n|:移动到当前行的第n列当然,用类似Vim的方式,你也可以完成“分段”层级、搜索、滚动、标记等一系列移动操作。此外,教程还提供了“插入模式”、“撤消”等许多其他操作的教程。教程还在持续更新中,感兴趣的读者可以持续关注本期《智能Vim教程》。传送门:https://github.com/iggredible/Learn-Vim
