我是这样用vim写代码的--基础篇
本人是从重度vs使用者经过大概半年的时间转变成的重度vim使用者。学习过程中也看过很多教程和经验,一开始只能机械的记住什么键对应什么功能,常用有哪些插件,别人的vimrc长啥样。很难理解为什么如此设计,vimrc里面为啥要设成那样,有什么好处。一直觉得针对vim新手,缺乏简明的介绍和解释的文章。本文会先简单介绍vim的基本操作以及vim的优势,然后根据自己的理解,介绍一些按键的作用,并尽可能说明为什么要用,为什么要这么做以及一些使用技巧。
在这之前,我是搞图形学,做游戏客户端的,因此最熟悉的是windows+vs组合环境。开始搞服务器后,坑爹了,公司的linux服务器只能远程命令行连接,一种选择是写一段同步一下,编译出错,再同步一下,极度浪费时间。于是常用工具开始转变为windows+vs+linux+vim,直到现在虽然工作环境在windows下,常用编辑工具已经成了vim。
vim作为一个上手以后非常高效的编辑工具,即使平时主要使用IDE环境,也实在值得学习掌握,本人的vs也是常年使用vsvim插件,能有效提高编辑效率,减少键鼠切换。经常听到有的程序员敲键盘噼噼啪啪毫无停顿,而有的则是敲几下停一下再敲几下,显然前者的节奏很稳,听着非常带感。使用了vim后就可以做到手不离键盘,不用鼠标,持续稳定高能输出。其实那声音一定是在聊天啦。。。最终决定敲键盘的速度还是思考的时间。。。vim能带来的好处是,让双手更轻松,减少不必要的操作,至少不用成为鼠标手了嘛。
vim的安装,mac/linux自带,初学用自带的就够了,先把基本功能都熟悉,再根据自己的需求安装特定编译的版本即可。windows下,请下载官方最新版本,有exe文件直接安装,总之目前vim的安装算是非常简单了,使用一般插件也不用自己编译安装。
github vim windows官方版本地址:https://github.com/vim/vim-win32-installer/releases
日常编辑中最常用的就是光标的移动,vs等常见编辑器的移动是利用键盘的上下左右键以及鼠标点击移动光标。而vim不需要移动整个手掌以触及方向键或移动整个手腕去摸鼠标。vim有三种模式,normal,insert,visual,每种模式下键盘区域的按键功能都不一样,这样在有限的手指区域内,除了打字外,可以做更多的操作,更可以自定义很多快捷键来帮助自己做特殊的操作。有很多文章会介绍vim的键位,并且肯定比本文全面,这里本文只希望尽可能解释键位的含义和意图,理解或想象键位的全称或者设计意图非常重要,可以帮助自己更快的熟悉这些键位,当熟悉了大多数编辑方式后,就能得心应手,比普通编辑器高效了。
下面简单介绍下vim三个模式的概念,并着重介绍normal模式下的各种操作方式。
insert模式,就是正常的输入模式,可以正常打字,组合按键以及功能键还是可以使用一些快捷操作。
visual模式,字面理解视图模式,在normal模式下按下v即可进入,然后使用normal模式下的移动命令,便可以选中大段文本,做后续操作了。常用的是按下v后,选中一段文字,进行复制(y)、剪切(d)、移动(<>)或者搜索等。另外按下ctrl-v,也可以进入批量编辑,这是个较高级的编辑,不太常用,不多说。
normal模式,vim最常用的且区别于多数编辑器的模式,有的叫命令模式,也可以叫编辑模式,在该模式下,键盘整个是一套编辑按键。在insert或者visual模式下,按esc键(手小觉得esc也太远的,可以改成更方便摸到的键,比如';;')即可进入normal模式。这里介绍一下常用的键位和命令,日常编辑中只用到一些常用键位就够了。一些高级编辑技巧,日常使用很少,笨拙的方式也能完成,没必要花太多时间研究,当然出于研究vim为目的就另当别论了,毕竟vs也是有很多神奇的快捷键的嘛。
文件的基本操作
文件最基本的操作就是打开、关闭和保存了,这些都依赖vim内的命令行,normal模式下输入冒号 ':' 紧跟命令:
:new 在新窗口新建一个文件
:tabnew 在新tab中新建文件
:e filepath 编辑指定文件(edit),没有则新建
:q 不保存退出(quit),文件发生更改会提示,加叹号!表示强制退出,放弃更改
:w 保存当前文件(write)
编辑中的移动操作
h/j/k/l 依次对应向左下上右移动,设计上正好在标准手势的右手手指下(标准手势很重要啊),习惯以后,手指微小的移动就能移动光标,非常方便。
w/b w可以理解为word,意为向前(右)一个单词,单词会被符号隔开,不仅仅是空格;b可以理解为back,向后(左)一个单词。
ctrl-d/ctrl-u/ctrl-f/ctrl-b 依次对应向下翻半页(down),向上翻半页(up),向下翻整页(forward),向上翻整页(back),前面我们已经看到单个按键b已经有别的用处了,因此翻页这种操作就加一个ctrl组合键啦。另外可能很多人习惯了ctrl-f是搜索,比如我。。。所以我就放弃了向下翻整页,把它改成了搜索,所有快捷键都是可以自定义覆盖的。如此鼠标滚轮可以抠掉了,滚动条也可以隐藏掉了(因为vim状态栏有显示当前位置,因此可以不依赖滚动条观察当前位置,可以省出更多空间看代码呢。个人为了美观而隐藏。。。匿。。。)
^/$/gg/G 移动到行首(shift+6),行尾(shift+4),文件头(按两下g),文件尾(shift+g)。这里^和$正是正则表达式的头和尾的表示字母了。g我的理解是global,全文的头和尾,欢迎提出更好的见解。。。
实际编辑中,我们经常想移动的不仅仅是一个字或者一个单词,可能是多个,这时只要先按下数字再按相应的按键即可。比如往右移3个字(3l),或者往右移3个单词(3w)。甚至往右或往左移到下一个指定字母,需要用到前置的forward按键f和shift-f,比如往右移到下一个字母 'a' (fa),往左移到下一个字母 'a' (Fa)。习惯后,会明显比鼠标点中某个单词,或者狂按上下左右键高效的多。
另外还有一个小问题很多人会遇到的,如果一行的文字非常多,导致分了好几行显示,此时想在里面往下往上移动怎么办呢?
ctrl-j/ctrl-k 行内向下和向上移动,没有为什么。。。单个按键被用掉了啊。。。
关于移动大概讲这么多,熟练后单窗口的编辑移动基本够用了,关键是要善于组合使用各种移动操作,才能以最高效简单的方式完成精准的移动。
复制剪切和粘贴
接下来就是编程最重要的神操作了,恩。。。
ctrl-c 好吧,并不是想象中的复制。。。是一个中断操作,平时基本用不到,提示,不要习惯性去按它。。。
yw/yb/yy 复制当前单词右侧部分(按一下y再按一下w),复制当前单词左侧部分,复制当前行(按两下y),y是前置键(yank,可以理解为激活复制),紧跟着表示要复制哪一部分。注意y前面还可以加数字,表示操作几次,比如3yw,就会复制3个单词。我就想复制整个单词咋办?要习惯多使用w和b,另外还有一种方便的选中整个单词的方式viw(visual+inner word)。
p/shift-p 粘贴到光标之后,粘贴到光标之前。由于normal模式下,光标是位于一个字下的,所以贴到前面和后面是不一样的,熟练后也不会被困扰。一样,可以3p,这样就连续粘贴3次了呢。
学会以上技能,就再也不用鼠标选一坨,然后ctrl-c/ctrl-v了;写着写着有想复制的函数名,esc退出到normal模式,按yw,然后hjkl或者ctrl-o直接返回之前正在输入的地方,按下p,完成。整个过程无需任何停顿,只需稍动下手指。
dw/db/dd 有复制肯定也要有剪切了,d(delete) 与y相对,是剪切的前置键。这里就是剪切一个单词,剪切整行。
D 剪切当前到行尾的所有字符,这个操作也很实用,复制粘贴一下,把后面原来的都删掉。
x 单个字剪切,毕竟常用的ctrl-x是剪切。
上面都是小范围的复制粘贴操作,如果我们要复制一大段文本,就要用到上文提到的visual模式了。按v进入visual模式,然后运用上文的移动命令,会发现移过的位置都成了选中状态,此后按下y,整段文字即被复制,再到要粘贴的地方粘贴即可。比如要复制从当前位置到文本最后,那就vGy,然后到要粘贴的地方p,整段文字粘贴完,完全不需要鼠标点着按滚轮。
搜索和替换
说完复制粘贴,还有一个比较重要的操作是搜索和替换。编程所需要的搜索其实更多的是跳到定义等较高阶的搜索,比较依赖插件。但是对于一些脚本语言以及文件内搜索,文本搜索还是很实用的。这里也简单介绍下。
#/* 向上搜索当前单词,向下搜索当前单词,这两个是最方便的文件内搜索,如果开了多个窗口,窗口间是可以共同看到高亮结果的。加一个前置命令g,也可以理解为global,范围更广,只要包含该单词的字符串都可以被搜索到。
n/N 跳到下一个搜索结果(next),跳到上一个搜索结果(可以注意到,很多大写都是反向操作)
比如当前光标所在的单词是word,要搜索别的word,就按下shift-8,即可跳到第一个结果,再按n/N即可依次跳到所有结果,或者回到上一个结果。但是有的时候需要搜索的不只是一个单词啊,可能是一个指定的字符串啊,normal模式下,按下 '/' 即可在底下命令行里输入要搜索的内容,之后还是按n/N。有的时候还要搜索正则表达式啊。。。按下 '/' 后是可以搜正则表达式的,要加反斜杠,不常用,用到再看。这里还有一个小技巧,按下 '/' 后,ctrl-r + ctrl-w 即可在命令行粘贴光标所在单词。
再说替换,替换是需要使用vim的内置命令的,在normal模式下,输入 ':' 即可在命令行中键入命令。替换的命令是:s(substitute),举两个例子说明:
:s/word/newword/g 当前行的word替换为newword,g代表所有出现的都替换,不加g则只替换第一次出现的
:%s/word/newword/g 全文的word替换为newword,%代表全文
日常替换也够了,当然装了插件后有更高端方便的查找和替换,不在本文基础范围了。
几个实用键位
以下介绍几个实用键位,后续想到再补充。
shift-j 合并当前行与下一行,编辑中常常写了多行想合并成一行,特别是某个分支语句,写完发现只要一行,一个快捷键搞定,不用删很多空格。。。
(/)/shift-% 既然是写代码,段落的概念肯定是很重要的,左右括号可以在向下和向上跳到下一个空行。shift-%可以帮助在代码块成对的开头和结尾之间来回跳,帮助观察代码段落和编辑。比如两个成对的括号之间,lua代码的function和end之间,代码块很长的if-else-end之间。
</> 左右尖括号,用于代码缩进,往左或往右缩进一个tab位。按v进入visual模式,选中一大段,即可实现大段的缩进。当然装了插件针对特定语言还有更智能的缩进方法。这里是最基本的缩进键。
ctrl-i/ctrl-o 前进和后退,个人把这俩快捷键理解为in和out,便于记忆,写代码经常需要在代码之间跳来跳去,这时回到上一次编辑的地方,如果用鼠标就要找文件了,那是相当麻烦,使用这两个快捷键,基本上来回切换就是瞬间的事。相当于vs的ctrl--和shift-ctrl--。
以上应该是vim编辑最常用的键位和命令了,熟练掌握以上键位,快速方便的编辑就基本达成了。
关于vim的基础就说这么多,相信使用以上编辑方式已经比txt高效很多,当然相比vs还缺乏了很多跳转、多窗口、调试等功能。关于vim的窗口切换,vimrc设置,插件等,后续会单独介绍,从而真正实现高效的代码编辑和调试。