如何在一夜之间突然学会 VIM
Apr 19,2013
- design , food
我不得不承认这样的标题太过于夸张了,但读完这篇文章你至少可以学会如何使用这个“编辑器之神”,并通过它提高自己的工作效率,明天你就可以在别人面前展示你的VIM技巧了。
从去年夏天我开始学习VIM以来,我就深深地迷上了这个编辑器,后来所有的代码都是在它之下完成的。如果代码不是在VIM下编写,我会感到非常烦恼,因为VIM实在太强大了,用它编码的效率要远远超过其他编辑器(当然Emacs不算)。VIM简单易上手,有丰富的插件可以定制,如果你十分熟悉它的配置语法也可以自己编写插件。NERDTree使我可以快速查看整个工程的结构,SnipMate让我可以用一个tab键完成常用语法的编写,CtrlP使我可以迅速找到需要的文件,和命令行整合在一起的编辑环境使我可以方便地在终端与VIM之间切换。
你将学到:
-
为自己的*nix操作系统安装vim
-
通过vim进行简单的文本编辑
-
使用快捷键与命令对文本进行操作
-
安装插件
你不会学到:
-
编程技巧
-
vim脚本的编写
-
在windows下使用/安装/配置vim
安装
在Linux与Mac中,VIM是预装的,可以在终端中敲入 vim 测试一下是否已经装好,以防万一还是列一下安装方法。
在Debain系中
sudo apt-get install vim
在Redhat系中
sudo yum install vim
在Mac中
用Macport或者brew都可以
sudo port install vim
或
sudo brew install vim
基础
不同于其他文本编辑器,VIM是唯一一个将指令操作与文字输入分离开的文本编辑器。事实上VIM的指令都非常简单,但通过一些结合,这些简单指令可以完成非常强大的功能。
模式
很多人初学VIM时一打开它就傻了,因为好像什么都敲不进去。正如前面所说,VIM是将指令操作与字符输入分开的,不像在一般的编辑器中我们可以打一行字,然后选中他们,按Ctrl-C复制。VIM是分多模式的。
VIM有三种模式:
-
普通模式(Normal Mode):又称Command模式(命令模式)所有按键输入都会被当作命令,不会作为内容输入,后文中所有提到的快捷键或功能键若无特别说明都是在Normal模式下生效的。注意:VIM对命令的大小写十分敏感,我在后文中提到的快捷键与功能键都是对大小写有讲究的,请看清是大写还是小写,避免不必要的麻烦。
-
插入模式(Insert Mode):除修饰键以外所有按键输入都会插入进文本(就像记事本那样)
-
可视模式(Visual Mode):命令模式的一种子模式,使用者在这个模式下可以选择文本
从Insert模式切换到Normal模式,按 ESC 。
从Normal模式切换到Insert模式有以下几种基本方法:
-
i ,会在当前光标前进入Insert模式。
-
a ,会在当前光标后进入Insert模式。
从Normal模式切换到Visual模式有三种方法:
-
v ,切换到面向字符的Visual模式(以字符为单位选择文本)。
-
V ,切换到面向行的Visual模式(以行为单位选择文本)。
-
Ctrl + V ,切换到块选择的Visual模式,可以选择一个矩形的文本区域。
由于Visual模式是Normal模式的子模式,所有在Normal模式下有效的命令在Visual模式下也同样有效。
练习
现在尝试着进入VIM,按 i 进入Insert模式,插入一些文字,再按 ESC 返回到Normal模式。
光标移动
这是VIM最最基础的内容,很多人感受不到VIM强大的主要原因便是没能适应VIM的光标移动按键。
-
h --光标左移
-
l --光标右移
-
j --光标上移
-
k --光标下移
很显然,这四个键只在Normal模式与Visual模式下有效,在Insert模式下会成为纯粹的 h j k l 字符输入。这也是VIM中最基本的移动光标方式。有些人在使用了VIM之后依然习惯用方向键来移动光标,这是一个非常坏的习惯,因为方向键的位置离键盘的主工作区有一段距离,VIM的主题思想便是让用户的手尽量不离开键盘主工作区,至于鼠标什么的就更别提了。至于为什么要用 h j k l 作为光标移动的方向键,当年伯克利的Bill Joy在开发Vi编辑器时,使用的是ADM-3A终端机,这台机器将 h j k l 作为方向键,所以Vi便采用了相同的按键,VIM自然也就采用了相同的按键进行光标移动。
看下面这张图,是ADM-3A终端机的键盘,注意 h j k l 上的箭头,注意 CTRL 、 ESC 的位置。还有一个小细节,看键盘的右上角 HOME 与 ~ 是同一个键,这与今天的键盘设计不同,明白为什么*nix系统中要以 ~ 代表用户主目录 $HOME 的位置了吧。
初学VIM时,光标移动是一大瓶颈,博主在这里推荐大家一个适应这种光标移动模式的捷径: VIM Adventures 。你可以暂时放下文章然后花半个小时去玩这个游戏,游戏中我们需要用 h j k l 控制主人公移动,游戏虽然很短,但玩完之后确实会对这种光标移动方式有所适应。
撤销与重做
撤销可以使你弥补错误,所以我认为应该优先掌握。
-
u --撤销
-
Ctrl + r --重做
删除(也是剪切)
-
x --单个字符删除
-
d d --整行删除
黏贴与拷贝
-
y --拷贝当前字符,如果进入Visual模式选取特定的内容,再使用 y 则会拷贝所选的所有内容。
-
p --黏贴到当前位置。
命令
命令是指按下 : 后,可以在编辑器最底部的输入框中输入的一系列内容,按下回车后,VIM进行相关操作。
-
:w --存储文件
-
:w! --强行存储
-
:q --结束编辑,退出VIM
-
:wq --保存并退出
-
:q! --不保存就退出
如果要另存为另外一个文件,可以使用 :w index.html ,这样可以将当前编辑的文件存储为以 index.html 为名的文件。
读到这里,你便可以开始对文本进行简单的编辑了。
进阶
上一节是基础内容,这一节是提高效率的关键。
更多的插入模式
-
I --光标会移动到当前行的第一个非空字符,并进入插入模式。
-
A --光标会移动到当前行的最后一个非空字符,并进入插入模式。
-
o --光标会移动到当前行的下一行,加入一个新的空白行并进入插入模式。
-
O --光标会移动到当前行的上一行,加入一个新的空白行并进入插入模式。
-
c w --光标会移动到当前行的上一行,加入一个新的空白行并进入插入模式。
更多的光标移动方式
-
0 --光标跳转到当前行的第一列
-
$ --光标跳转到当前行的最后一列
-
^ --光标跳转到当前行的第一个非空字符
-
g _ --光标跳转到当前行的最后一个非空字符
-
w --光标跳转到下一个单词
-
W --光标跳转到下一个单词,只针对空格跳转,忽略标点符号
-
e --光标跳转到当前单词的结尾
-
E --光标跳转到当前单词的结尾,只针对空格跳转,忽略标点符号
-
b --光标跳转到当前单词的开头
-
B --光标跳转到当前单词的开头,同样只针对空格跳转,忽略标点符号
-
g e --跳转到前一单词的结尾
-
g E --跳转到前一单词的结尾,针对空格,忽略标点符号
-
f --与下一次按键输入结合,比如说 f a ,跳转到该行接下来出现的第一个字符 a
-
g g --跳转到当前文本的第一行
-
G --跳转到当前文本的最后一行
一些编辑操作
-
d --可以与其他光标移动键结合来删除特定内容,比如说 d 0 是删除当前光标到当前行启示列的所有内容, d w 是删除当前光标到下一个单词开始处的所有内容, d k 是删除当前行和上一行的内容。
-
d d --这个比较特殊,删除当前行。
-
c --这个跟 d 比较像,区别是删除之后立刻进入Insert模式,使得我们可以替换刚刚删除的文本。
-
x --删除当前光标下的字符。
-
X --删除当前光标之前的字符。
-
y --与 d 比较像,它实现复制内容的功能,在Visual模式下可以复制选定的文本。
-
p --在光标之后黏贴上一次复制的文本。
-
P --在光标之前黏贴上一次复制的文本。
-
r --用下一次敲击的字符来替换当前光标下的字符。
-
. --重复上一次操作。
练习
试试用VIM打开一个档案
测试 g g v G x 有什么效果,想想这是为什么。
测试 d d p p p 有什么效果,想想这是为什么。
值得注意的是,VIM下所有的删除命令都相当于剪切,即删除的文本会存在于剪切板中。
跳转到特定行
经常看到在某个脚本第xxx行出了错误,若想快速跳到这一行,只需按下 : 再输入数字就ok了。
搜索
在VIM中,如果需要快速查找特定内容,可以在Normal模式下按 / ,然后输入内容,按回车来搜索,搜索过程中按 n 跳转到下一个匹配,按 N 跳转到上一个匹配。注意这个搜索是基于正则匹配的,可以使用正则表达式。
替换
在VIM中,如果需要全文替换特定内容,可以在通过下面的命令完成, :%s/待替换内容/新内容/g ,这个过程也是基于正则匹配的,比如我们要将文档中所有 apple 换成 banana ,只需要敲入 :%s/apple/banana/g 即可,如果需要将档案中所有的数字删除,可以敲入 :%s/\d//g ,其中 \d 在正则表达式中指匹配数字。
更多的指令
-
:vim --打开新的文件,后面跟文件名。
-
:set paste --让VIM进入黏贴模式,这时从外面复制进来的文字或代码就不会因为VIM本身的缩进功能变得乱七八糟。
-
:set nopaste --离开黏贴模式。
-
:set ft: --告诉VIM你当前正在编辑的语言类型,比如 set ft:python 就是告诉VIM你正在编辑python文件。不过一般情况下VIM会通过你的文件后缀来识别语言类型。
-
:syntax on --开启代码高亮。
-
:set number --开启行号。
-
:set nonumber --关闭行号。
-
:vnew --垂直分割屏幕,开启一个新的工作区。
-
:new --水平分割屏幕,开启新工作区。
-
:tabnew --开启一个新选项卡,使用 gt 与 gT 来前后切换不同选项卡。
-
上面三条指令后面也可以加文件名,以在新打开的工作区中立刻开启文件。
更加高效
这个阶段我会教你一些小技巧,将工作效率提升到一个新的档次。
多窗口工作环境
就像我给文章配的第一幅图,我垂直分割了文本框,同时查看两个文件并来回编辑。
敲入 :vnew 以后,VIM将会为你垂直分割出来一个窗口,你也可以在这条命令后面加上文件名,如 :vnew index.html 会在编辑器中垂直分割出一片空间并在其中打开 index.html 文件。也可以在敲入 :vnew 后分割出的新窗口中用 :vim index.html 来打开这个文件,与直接用 vnew index.html 实现的效果是一样的。如果需要在不同窗口间跳转光标,可以使用下面的快捷键。
-
CTRL + w + h --将光标跳转到当前窗口左方的那个窗口。
-
CTRL + w + l --将光标跳转到当前窗口右方的那个窗口。
-
CTRL + w + k --将光标跳转到当前窗口上方的那个窗口。
-
CTRL + w + j --将光标跳转到当前窗口下方的那个窗口。
多选项卡工作环境
如果显示器分辨率太低,开多窗口会比较影响使用,这时可以使用VIM自带的多选项卡功能,与 :vnew 很类似,开启一个新选项卡的命令是 :tabnew ,后面可以跟文件名直接开启一个文件。在不同选项卡之间跳转可以使用下面的命令:
-
g t --跳转到后一选项卡
-
g T --跳转到前一选项卡
安装插件
VIM主要的配置信息在 ~/.vimrc 文件中。
VIM的插件安装在VIM的runtimepath下,在VIM中通过命令 :set rtp 可以查看到目录位置,一般我们选择在 ~/.vim/ 下安装插件。
事实上,我建议初学者先采用他人的设定档来配置vim,感受各种插件的便利,再选择适合自己的插件。
可以参考我托管在github上的vim配置档: dinever-vim ,下面列出一些我在使用的插件:
vim-pathogen
超好用的vim插件管理工具。安装它以后再安装其他插件,只要将整个插件目录丢到 .vim/bundle/ 下就可以了。
NERDTree
在VIM窗口左侧显示树状文件列表,方便在整个工程的目录中切换。
CtrlP
可以通过它快速找到某一文件, Ctrl + P 开启。
snipMate
不知道你有没有听说过一个叫做TextMate的Mac端文本编辑器,他之所以受欢迎便是因为有一套叫做snippets的代码补全方案,snipMate便是VIM下的snippets。
SelectColors
帮助用户快速选择配色方案的小插件,通过命令 :SelectColors 开启。
Python-mode
Python是我目前主要的编程语言,因此Python-mode便成为必不可少的一个VIM插件,它的功能有:
-
检查代码规范性(基于PEP8标准)
-
折叠Python代码
-
保存文件时检查语法错误
-
检查未使用过的import
-
运行Python脚本
-
查看Python文档
-
其他
小结
上面已经包括了我常用的所有命令,学到这里,对于VIM基本上算是入门了,经过一到两周的磨合,你便会感受到它的强大。