Vim NEW Cheat Sheet

Cheat sheet做的就是“堆砌”,目的在方便查阅。但是对于初学者,首先要理解有什么、怎么用。这篇文章的侧重点在于以一个初学者的身份——这很重要,高手写这些把握不了分寸,容易炫技——从头审视vim指令,这些指令的发明并不是没有原因的,某一个字母肯定和我们日常体验有一定的联系。我没有去考究发明者真的的想法,但是通过联想,我尝试找出了这些指令背后可能的联系——部分是自己生搬硬套出来的,从而帮助记忆。

移动与定位


上下左右操作,hjkl。非常容易,但只知道他们远远不够。
快速地定位,是在鼠标缺位的情况下最需要做的。熟练掌握定位之后,手再也不用从键盘上移开了,这是VIM巨大的优势。
移动的距离,单位可以分成一个字符,一个单词,一段话。如hjkl是字符单位移动。


若以整个页面作为观察维度,如何快速地到页面顶行、底行,或者正中间——Header,Last,Middle。切换页面则需要Ctrl+b,backward,Ctrl+f,forward。Vim还提供半屏移动,Ctrl+u,up,向上半页,Ctrl+d,down,向下半页。找到这些联系之后指令变得非常好记。
用行来作为移动单位时,g作为基础指令,让人联想到goto。G到最后一行。Vim里面同一个指令的大小写区分一般是同一操作的相反方向或者加强,等会还会看到更多。数字加上G则将位置移动到数字指定的行数。10G,移动到第十行。数字加指令的形式在Vim也很常见,当指令与编辑有关的时候表示指令重复多少遍。除了快速定位,滚动行要用到Ctrl+eCtrl+y,这时候光标会停留在当前行。前面加上数字则会一次移动指定行数。e可以想到是enter,回车键,本质上可以看成打字机效果,内容往上走,相当于在往下面的行数移动,就像经典的打字机那样。
进一步缩小到对单词的定位,第一的目标便是单词的头和尾。此时用back,end。如果他们本身就在头尾,那么他们就会去到前一个单词的首位或者下一个的末尾。同时,word负责直接去到下一个单词的首位。Vim里面还有一个有趣的区分,word和WORD是两个概念。简单来说,word不包括任何标点,典型的就是I’m算一个WORD,不算word。
接下来两个点放到一起,因为都和代码关系比较大。
一是0^的区别,0是到本行行首,而^是到本行不为空的第一个字符,因为代码缩进的情况很常见,^更为常用。
另一个是%,用于括号匹配,带你到括号的另一端的。也在代码中使用较多。Percentage和Parentheses,这样会比较好记。

编辑


审视一下我们平时的习惯性动作,用鼠标定位到一个地方之后,要么就是开始输入或者删除了,要么就是从这个位置开始选中一些内容来进行复制粘贴等操作。

replace用来替代一个字符。c即是cu t,cw剪切一个word,从光标处到单词末尾。ciw更加彻底,即使光标在当中,也会将整个单词删除。caw再进一步,删掉单词本身加上和下个单词之间的空格。cc剪切整行,S起同样的效果。c$切到行尾。都是基本指令加上后缀,大部分指令都有这种结合效果。
Join可以把两行连起来,中间以空格相连,gJ则不带空格。

.用来重复操作,实际使用中好像并不是多么实用,我会重复按那些命令。不过如果能合理使用,一定能节省很多时间。undo,直观,U可以用来还原最后修改的那一行,和undo、redo是分离的,不常用。ctrl+r,redo。


insert插入到光标之前,I到行首输入。append插入到光标之后,A插入到行尾。大写的命令往往起到加强的作用,这里是方向的强化。o在当前行之下插入空行,理解为open一行,O则在上方开新行。这里大写则起到反向的作用。

选择


选中内容,如选中一个单词,选中一段话。如果是代码,则有区块的概念。


选择是我用vim一段时间之后才发现的功能,准确的说,这是一种模式。通过visual进入。大写的V用来进入行选择模式,这种模式下行是选择的基本单位。
区块范围也有不同的命令。abaBibiBaw。a理解成all,i理解成inner,b理解成小的block,小括号(),B则是大的block,大括号。i只选中区块内容,a还包括边界如括号。于是一切就非常好理解和记忆了。o定位到选中范围的另一头,bound,在两端弹来弹去。
\<>用来缩进反缩进。
选完之后可以复制,yank。yank的定义是A term to describe pulling something very hard and fast,应该是出于一些历史原因所以用yank,本质就是copy。

复制粘贴


上面解释过yank,复制。yy,命令重复起到行范围的效应,和cc一样。y和其他后缀组合起到相应效果。

paste也很直观,P再一次是大写反向效果。

delete,及其搭配都比较常见。d$比较特殊,用D代替,这里大写和以上不同。
x用来删除单个字符,不知道为什么我想到的是erase,然而里面并没有x。

搜索



/搜索,?反向搜索,\将所有字符视作原生字符搜索,也就是不看做正则表达式,不需要escape了。

搜索完之后,结果会保存在cache里面,next和N用来定位。

替换,%(所有行) search或者substitute 旧的 新的 g。g看作replace,虽然看上去没什么关系。怀疑和grep有关,再研究。%可以换成具体行号,2,10即第二行到第十行。最后加c代表替换前需要confim。

以上就是我觉得初学比较有用的技巧。Vim包罗万象,一定还有很多内容我没有涉及到,StackOverflow上还有这样的问题:Simple vim commands you wish you‘d known earlier。但那些留待之后探索吧。有时候,“相见更晚”,更会珍惜。

【2018】轻舟已过万重山 iPad上能做和不能做的事情
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×