题图
一. Vim是什么
都说程序员只用两种编辑器,一种是编辑器之神Vim,一种是神的编辑器Emacs,可现实生活中,我发现真正用这两种编辑器的人很少,所以我开始有点怀疑这句话的真实性。
刚毕业那会,我对实际的软件开发了解甚少,于是糊里糊涂的进入了服务器开发领域,现在回想起来真是觉得既幸运又后怕。幸运的是,在我完全不了解的情况下竟然选择了后端开发,后怕的是,既然不了解,就很可能选择到其他方向,而另一个选择可能会造就一个完全不同的人生轨迹。虽然从现在的眼光去看软件开发的每个方向,都非常有趣和有挑战,但服务器领域才是我最向往的地方,且它极大程度的满足了我的好奇心。
不知道为什么,我对很古老的东西很感兴趣,服务器开发日常面对的是一个终端界面,没有图形化的丰富表现,只有常规的字符,让我着迷的肯定不是它的表现形式,更深层次的讲,它更接近于计算机最开始的样子,在这种环境下工作可以帮助我更容易的掌握机算机的原理和思想。
区别于Windows这样的操作系统,Unix/Linux系统的设计原则是简约(Kiss原则),可能有点违背直觉,大多数人认为Windows更为容易上手,确实如此,但这并不意味着它的设计就是简单的,使用起来就是高效的。而Unix不同,其中的每一个程序都只完成单一的功能,程序之间可以很容易的交互数据,这样,通过将不同程序进行任意组合,可以创造出任意的功能,既匹配了程序员这一创造性工作,又极大的提升了工作效率。试比较——在同一目录下,将所有jpg后缀转换为png后缀的操作——在哪个系统上操作更为方便。
Unix设计原则对于大多数程序员来说,是一种“信仰”,而Vim也是其中一个具备KISS原则的产品。
所谓程序员只用两种编辑器,我现在似乎明白为什么使用它们的程序员实际上并不多的原因了,这句话缺少了一个时间的维度,在过去,图形界面不发达,人们用计算机只能使用命令行,在命令行中也只能使用Vim或Emacs编辑器,而随着时代的变迁,人们更倾向于使用易于上手的图形化软件,他们希望速成,不愿意在编辑器上花成本,而逐渐忘却了Vim或Emacs。时至今日,这句话变成了:
程序员都用两种编辑器,大多数人使用图形化编辑器,少数人使用Vim或Emacs。
二. 我为什么使用Vim
我为什么会选择Vim,一是因为Vim可以在所有操作系统及终端中使用,真正做到了“一招鲜,吃遍天”。学会了Vim,你再也不需要学习其他编辑器。
相反,如果你使用IDE的话,可能这辈子要学习很多编辑器,例如当你使用C/C++时,你可能会用VS/SourceInsignt/SublimeText等,当你使用Java时,你可能会换成Eclipse/Android Studio,而当你做前端开发时,你需要学习使用WebStorm/Atom等。同时,这些IDE都无法在终端中运行,这时你要编码和调试,需要跨越两个环境,效率极低,如果你想改变这种现状,你还得学习Vim。
而对于程序员来说,一个顺手的开发环境决定了他的开发效率和幸福指数,有时为了一个稳定又一致的开发环境,我会放弃公司的办公电脑,取而代之的是背一部几公斤重的笔记本来来回回。
二是Vim的效率很高,它会想尽一切办法将你的双手放在主键盘区,甚至不需要碰小键盘或鼠标,更深一层,为了达到相同的目的,它会让你尽可能减少按键次数。这样做都是为了让你更加专注,集中精力去完成当前的工作,而右手经常在鼠标和键盘之间来回切换,无疑是一种“打断”。
最后一个原因,使用Vim真的很酷,因为Vim学习曲线比较陡峭,即便对于程序员同学来说,它不好用,或是一头难以驯服的猛兽,所以在这种情况下,如果你可以把它运用自如,你拥有的就是别人从未有过的一种体验。
三. 至少要掌握的知识
说Vim学习曲线陡峭,其实也是相对于其他编辑器来说的,其实也并没有多陡峭,下面主要从以5个概念,来谈一下Vim的最少必要知识,这是我平时使用Vim的过程中,总结出来的:对于一个新人,至少要知道哪些用法呢?
模式
命令
窗口,Buffer
配置
插件
模式
模式是Vim区别于其他编辑器的首要功能,它要解决的问题是“只使用键盘就可以完成所有工作”,你可以想象一下,当你在使用电脑时,克制自己不用鼠标或触控板时的感受:你也许会感觉非常无力吧。而当你在使用Vim时,这件事情不会给你带来任何不适,相反如果你适应了Vim的模式后,看到别人的右手在键盘和鼠标之间来回切换,你才会觉得那个人的效率和自己比起来是多么低效。
Vim中的三个模式分别是
普通模式normal
插入模式insert
可视模式visual
普通模式相对于插入模式,它用来控制光标移动、复制/粘贴文本、排版等,并将这些功能映射到指定的快捷键中,这样当你输入一个按键,它就会帮你完成以上功能。
按键帮你从其他模式切换到普通模式,所以当苹果在最新版的macbook pro中取消按键时,一大批Vimer第一个反应就是macbook pro不适合开发者,不过我觉得这应该不是什么大问题,在切换到Vim时,肯定会弹出相应的虚拟按键,只是手感上应该会差很多,但如果要追求更好的手感,我推荐你去外接一个机械键盘,真的不一样。
h/j/k/l
这四个键在键盘的最中间,当你处于普通模式时,h/j/k/l这四个按键分别代表了光标向左/下/上/右移动一个字符,当然你完全不需进行刻意的记忆,打开电脑练习几次就习惯了。学会了这几个按键,你的手指再也不需要移动到小键盘上去了。
hjkl
移动
ctrl+f/b/d/u
这四个快捷键,可以帮助你翻页,实现光标在文件中快速移动。
ctrl+f:向下翻一页
ctrl+b:向上翻一页
ctrl+d:向上翻半页
ctrl+u:向下翻半页
移动
b/w/e/shift+^/shift+$
普通模式下,h和l每次只能向左或向右移动一个字符,这无疑是非常慢的,下面几个快捷键,可以帮助你在行内快速移动
b:将光标移动到上一个单词的第一个字符
w:将光标移动到下一个单词的第一个字符
e:将光标移动到下一个单词的最后一个字符
shift+^:将光标移动到行首
shift+$:将光标移动到行尾
移动
f/F'a'
在行内快速移动的“升级版”,单引号中的内容可以用任意字符代替,例如f'b'/F'b'
fa:将光标移到右边的第一个字符a上,继续按';'(分号),可以延相同的方向找到下一个a,继续按','(逗号),可以延反方向找到下一个a
Fa:将光标移到左边的第一个字符a上,继续按';'(分号),可以延相同的方向找到下一个a,继续按','(逗号),可以延反方向找到下一个a
当你熟练使用这个快捷键,你就知道我为什么会说:
Vim会尽量减少你敲键盘的次数
移动
H/M/L
这几个快捷键,可以帮你把光标移动到屏幕的上方/中间/下方,注意是要打开大写锁定或按住shift
H(high):将光标移动到屏幕上方
M(middle):将光标移动到屏幕中间
L(low):将光标移动到屏幕下方
移动
[n]jk
中括号中的n可以用任意数字代替,例如10j表示将光标向下移动10行,而10k则相反
[n]j:将光标向下移动n行
[n]k:将光标向上移动n行
移动
[n]G
同[n]jk命令,[n]G命令会帮你把光标移动到指定的行数,例如100G,会将光标移动到文件的第100行
移动
gg/G
这两个快捷键,会将光标移动到文档的第一行或最后一行
gg:将光标移动到文档的第一行
G:将光标移动到文档的最后一行
移动
zz
这个快捷键会将当前光标所在行居中
移动
%
该快捷键实质上是shift+5两个键的组合,可以让你的光标在成对的括号间跳转,例如大括号、圆括号、方括号等,该功能在写代码时经常使用。
移动
*/#/n/N
*:在文件中查找光标下的单词(向下),如果要继续查找,可以按n向下查找,按N反向查找
#:在文件中查找光标下的单词(向上),如果要继续查找,可以按n向上查找,按N反向查找
移动
[[、]]、{、}
这套指令也特别容易记忆,因为大括号或花括号的方向即是你的光标所移动的方向
[[:将光标移动到上一个代码段(或函数)的行首
]]:将光标移动到下一个代码段(或函数)的行首
{:将光标移动到上一个空行行首
}:将光标移动到下一个空行行首
关注光标变化
以上是在普通模式中最常用的移动操作,熟练掌握以上操作,Vim便成了你手中的“六脉神剑”,可以任由你“指哪打哪”了。
u/ctrl+r
u:撤销
ctrl+r :重做
编辑
y/yy/p/P/"+y/"+p
这几个命令表示基本的复制和粘贴
y:复制,比较常用的是先进入可视模式,然后按y,复制所选文本
yy:复制一整行
p:从光标右边开始粘贴,注意不能粘贴到Vim外的程序中
P:大P,从光标左边开始粘贴
"+y:复制到系统剪贴板,这样就可以粘贴到Vim外面去了
"+p:将Vim外复制的内容粘贴进来
+"y/p这种三个键的快捷键不是很方便,所以我们可以在vim中建立按键映射,将它的操作简化,例如在~/.vimrc(没有该文件的情况下要手动创建)中加入:
" 定义快捷键的前缀,即
let mapleader="'"
" 在可视模式下,'+y则为复制到剪贴板
vnoremap y "+y
" 普通模式下,'+p则为从剪贴板粘贴到Vim
nmap p "+p
编辑
a/i/A/I/r/cc/cw
这几个快捷键可以帮助你编辑文本
a:从光标右边开始插入,进入插入模式
i:从光标左边开始插入,进入插入模式
A:从行尾插入,进入插入模式
I:从行首插入,进入插入模式
r:替换光标下的字符,不进入插入模式,例如rx,将光标下的字符替换为x
cc:修改光标所在行,进入插入模式
cw:修改光标开始以右的单词,这个组合键在编码的时候也经常使用,Vim中的组合键由动作+ 范围组成,如c为修改动作,w为一个单词的范围,再如d2j表示:删除光标所在行及下一行,其中d为删除动作,2j为下两行
编辑
.
点号键可以帮你重复上次编辑操作,例如你想手动将文件中所有的int转换为int64,只需要:
进入普通模式,将光标移到int下
敲击*查找int
敲击cw替换int,输入int64
按ESC继续进入普通模式
敲击n查找下一个int
敲击.重复执行替换,然后继续执行第5步骤
编辑
插入模式没什么可说的,在这种模式下和其他编辑器没有什么区别,下面说下可视模式
v/V/ctrl+v
v、V或ctrl+v进入可视模式,在这种模式下你可以自由选择你需要操作的文本,然后进行批量操作
v:进入可视模式,按[n]hjkl调整范围,n代表分别对hjkl做的次数,例如v10l表示选择光标右边的10个字符
V:选择光标下的行,V10j表示选择光标及光标下的10行
ctrl+v:可以选择一个块状的区域,这个功能能够很好的帮你完成块注释或块反注释
下图展示了我将某一个代码块注释掉的动作
首先ctrl+v,然后敲击6j,垂直选择6行
输入:s,^,//,|noh将行首替换为注释符号//,noh是禁止高亮的意思
visual_mode
选择
命令
在Vim中可以通过输入命令的方式进行交互,在普通模式下,输入:调出命令栏——Vim最底部的一栏,命令分为两种
Vim调用shell的命令,前面要加一个感叹号,例如输入:!pwd执行pwd
Vim内置或用户通过插件实现的命令,例如下面的几个常用命令
:/ :?
查找命令
:/id:从当前光标向下查找文件中的id字符串,为了方便,你可以直接敲击/id
:?id:从当前光标向上查找文件中的id字符串,为了方便,你可以直接敲击?id
:%s,Id,ID,g
:s为替换命令,上文可视模式中已经展示了批量替换的威力,另外一种比较常用的是全文替换,例如:%s,Id,ID,g表示将全文中的Id替换为ID,g的意思是一行里面如果有多个匹配项,则都进行替换,和sed中的替换是一个概念
:q :w :x :e
学到这里你已经掌握了Vim中的基本用法,现在可以退出休息一下了:)
:q 退出
:w 保存
:x 保存并退出
:e 编辑文件,不存在则创建,例如:e ~/.vimrc会编辑~/.vimrc这个文件
:help
即便看完了以上内容,你可以顺使用Vim了,但最好还是浏览一遍帮助文档,这样当你遇到某个问题时,可以通过help进行查找。
Window,Buffer
Vim一次可以打开多个文件,同时打开的文件暂存在Buffer对象中,每个打开的文件对应一个buffer对象,你可以选择性的通过打开某个Buffer来显示对应的文件,而一旦该文件显示出来,用来显示该文件的窗口被称为Window,如果你的屏幕够大,你可以把Vim分成多个窗口,即实现了多个文件同时进行编辑的功能,非常方便你编写代码。这也是Vim和其他编辑器在理念上不一样的地方,其他编辑器使用Tab来打开多个文件,虽然Vim也有Tab功能,但Window+Buffer的方式更符合习惯
:split vsplit ctrl-w+h/j/k/l
这几个是Vim中操作窗口的命令
:split 将光标所在的Window分为上下两个窗口
:vsplit 将光标所在的Window分为左右两个窗口
ctrl-w h/j/k/l 帮助你在不同窗口间进行切换,h/j/k/l分别代表了切换到左/下/上/右窗口
看完了以上内容,再看这幅浓缩图,就会觉得格外清晰
pic
配置
Vim是高度可定制的编辑器,你可以通过配置从而把它打造成一个非常强大的IDE,而所有的配置基本上都在~/.vimrc中完成,非常方便管理,网上讲配置的文章和文档非常多,相信你可以在网上找到你想要的内容。
插件
插件本质上是配置的一种,而掌握了Vim插件的安装和使用后,你就可以将Vim运用到实际工作中了,基本的逻辑是,先明确自己的需求,然后在google中搜索对应的关键字便可以找到你所需要的插件,这里就介绍一个非常重要的插件
NERDTree
NERDTree插件配合窗口功能非常好用,NERDTree插件可以帮你列出系统中的目录和文件树,打开其中文件的同时,还可以帮你进行分屏,有了这样的插件,你应该会更得心应手。
版权申明:
此文章首发于公众号程序员在深圳,搜索 studycode 即可关注
本文无需授权即可转载,甚至无需保留以上版权声明
关注作者: