如何在一夜之间突然学会 VIM

Apr 19, 2013#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基本上算是入门了,经过一到两周的磨合,你便会感受到它的强大。

Comments