红联Linux门户
Linux帮助

Vim简易使用教程

发布时间:2014-07-12 11:18:57来源:红联作者:velcbo
很早以前就在用 vim,不过水平很菜,就会最基本的操作。而且经常犹豫是不是要投奔Emacs阵营呢,毕竟在传说中,Emacs强大无比,可以秒杀一切。但是Emacs似乎学起来难度更大,最后还是决定投身vim吧。

一次无意中找到了Steve Oualline 写的 VI iMproved 一书,看过之后我才真的觉得自己算是入门了。我的这一系列博客其实就是我学习 VI iMproved 一书的学习笔记,希望对各位准备学习VIM的同学有些帮助。(vim和Emacs似乎有些相克,学会了一个就很难再学另一个了,因此,如果决定了学习vim就不要念想着Emacs了)

比起其他的文本编辑器,VIM的学习曲线陡峭的多。我尽量每篇博客只介绍一个小的主题,让大家容易消化学习。(这一系列博客准备写81篇,寓意学习vim只有经过81难才能修成正果。不知道能不能坚持写完啊。)

------------------------------------华丽分割线------------------------------------

Vi 是Unix世界里极为普遍的全屏幕文本编辑器,VIM是它的改进版本Vi IMproved的简称,和Emacs并列成为类Unix系统用户最喜欢的编辑器。几乎可以说任何一台Unix机器都会提供这套软件。由于Vim具有代码补完、编译及错误跳转等方便编程的功能,在程序员中被广泛使用。

VIM 简史
vi是Bill Joy所写,当时他还在Berkeley。Ken Thompson去Berkeley的时候带去了他那不完整的Pascal系统,而Bill Joy恰好在暑假就接到修复它的工作,他对修复代码时使用的编辑器ed很不满意。正好,他们从一个叫George Coulouris的家伙那里拿到了em的代码,em比ed要好用。他们就修改了em,发明了en,而最终又变成了ex(连Bill Joy本人也不知道怎么就变成了ex)。后来他熬了几个月的夜写出了vi。

Bram Moolenaar 在 80 年代末购入他的 Amiga计算机时,Amiga 上还没有他最常用的编辑器vi。Bram 从一个开源的 vi 复制 Stevie 开始,开发了 Vim 的 1.0 版本。最初的目标只是完全复制 vi 的功能,那个时候的 Vim 是Vi IMitation(模拟)的简称。1992 年 1.22 版本的 Vim 被移植到了 UNIX 和 MS-DOS上。从那个时候开始,Vim 的全名就变成 Vi IMproved(改良)了。在这之后,Vim 加入了不计其数的新功能,包括多视窗编辑模式(分割视窗)、 highlight(语法高亮)功能、代码折叠、插件、多国语言支持、拼字检查、上下文相关补完,标签页编辑等新功能。

第一课 最基本的操作
从命令行模式运行gvim:gvim

命令行模式打开一个文件:gvim file.txt

如果 file.txt 不存在,则新建一个空文件。

每行前都有个波浪号(~),这表示这行不在文件中。因为是空文件,当然一行数据都没有。

VIM 的工作模式
不同于一般的文本编辑器,VIM存在3种工作模式,分别是命令模式,插入模式和 VISUAL 模式。刚打开vim 时处于命令模式,按一下键盘i 则进入插入模式。注意这时的窗口左下角原本显示文件名的地方现在显示“-- INSERT --”。在插入模式下我们可以像普通的编辑器那样输入文本,进行编辑。当我们想退回命令模式时按键。

移动光标
在命令模式下移动光标可以用键盘上的箭头键。但是最快捷的方式是下面四个键:

左:h

右:l

上:k

下:j

由于移动光标是最常做的操作,因此给它们分配在右手最方便按到的四个键。

删除字符和一行
删除当前光标所在的字符:x 键

删除一行:dd

撤销和恢复
撤销最近的一次操作:u

恢复最近的一次撤销操作:Ctrl-R

退出
保存当前文件并退出:ZZ (注意是两次大写的Z)

退出但不保存: :q! (冒号 q 然后是感叹号,三个字符)

如果你只是看了看文件没做任何修改,可以省去上面命令最后的感叹号(!)

其他几个最基本的编辑命令
在当前行的末尾插入字符(进入到插入模式,并把光标挪到当前行的行尾): a 键 (append)

在光标的下一行插入一个空行,并把光标挪到下一行:o 键 (open)

获取帮助信息
:help

:help subject


比如想看看x命令的帮助: :help x

看看CTRL-A 名利的帮助::help CTRL-A


有时,同一个快捷键在不同模式时代表不同的命令,vim 默认认为查询的是命令模式下的那个命令。可以加上前缀来区分不同的模式。i_ 表示插入模式。v_ 表示VISUAL模式。: 表示ex模式。比如下面的例子:

:help i_CTRL-H

:help :quit

重复执行一个命令多次
可以在命令前加上个数字,比如我要在当前位置插入10个a。

10ia

最后的是为了退回命令模式。如果执行的命令不会让vim从命令模式进入到其他模式可以不加最后的。比如将光标左移3个字符:

3h


OK,知道上面这些就可以进行最基本的操作了。练熟这些再开始第二课。

第二课 更快速的编辑
这一回将介绍些上一次没有讲到的基本的操作命令。

快速的移动光标
将光标移动到下一个单词的开始:w

将光标移动到上一个单词的开始:b

类似的,2w 表示向后移动两个单词。

移动到一行的结尾:$

移动到一行的开始:

移动到一行的第一个非空白字符:^

(熟悉正则表达式的朋友肯定对 $和^不会陌生。)

向下移动2行自然就是:2$

一行中查找一个字符
从当前位置向后查找第一次出现x的位置,并将光标移过去:fx

从当前位置向前查找第一次出现x的位置,并将光标移过去:Fx

如果没有找到x,不移动光标

类似的还有一对命令t与T。与f和F类似,不过它会停在查找到的字符之前一个字符。

移动光标到指定的行
移动到指定的行n:nG

比如移动到第3行:3G

移动到最后一行:G

显示行号
显示行号::set number

隐藏行号::set nonumber

给出当前光标所在的行、列信息:CTRL-G

翻页
向上滚动半屏文字:CTRL-U

向下滚动半屏文字:CTRL-D

删除文字
前面已经介绍过删除一行:dd

从当前位置删除到当前单词结束,并将后面的空格也删除掉:dw

W命令是将光标移动到下一个单词的开始位置,dw 是将光标移动的过程中路过的那些字符都删掉,当然最后光标移动到的那个位置上的字符不删除。

类似,删除3个单词:3dw 或 d3w

实际上,d命令后面可以跟着任意的光标移动命令,比如 dfi 表示从当前位置一直删到第一次出现i为止。当然,如果当前行没有找到i则上面的命令就什么都不做,因为这时光标没有移动。


重复上一次的命令
重复上一次执行的命令:. (一个句号)

比如上次执行的是 dd,那么. (一个句号) 就等效于 dd。

将两行合并
将当前行与下一行合并为一行:J

替换当前字符
将当前字符替换为x:rx (replace)

改变大小写
改变当前字符的大小写:~

改变完大小写后将光标向后移动一位。但是是在行内移动,不会到下一行。

录制一段键盘宏操作
我们可以将一系列操作录制成一个宏: q 命令

宏的名字是一个小写字母。下面还是举个例子:

假设我们的文件中有如下几行。

stdio.h

fcntl.h

unistd.h

stdlib.h

我们希望将其编辑为:

#include “stdio.h”

#include ”fcntl.h”

#include ”unistd.h”

#include ”stdlib.h”


首先将光标移动到第一行的开始。

然是输入如下的命令:

qa

^

i#include “

$

a”

j

q


这样就录好了一段宏,宏名为a。

之后执行3次这个宏:3@a

第三课 各种查找操作

比如我们想在文档中搜索一个简单的字符串“include”,这时用 / 命令:/include

找到第一个include 后如果希望继续查找,可以这样:/

这时vim会默认你还是搜索上一次的字符串。(注意:不能用. 命令)

有几个字符有特殊的含义(其实是正则表达式),搜索时要在前面加上\ 来转义

这几个字符如下:.*[]ˆ%/\?~$

Vim 会记住历次搜索的字符串,搜索时用 来选择。

开启增量式搜索: :set incsearch

关闭增量式搜索::set noincsearch

什么是增量式搜索,做个实验试一下就清楚了,这里就不多说了。

下面的命令可以将搜索到的结果高亮显示:

:set hlsearch

关掉这个特性的命令是:

:set nohlsearch

/ 命令是向后搜索,如果要向前搜索,用?命令。

n 命令是重复上一次搜索。

/ 命令和?命令都支持正则表达式。

第四课 基本的复制、粘贴操作
剪切和粘贴
当用命令 d 或 x 删除了一段文字后,被删除的文字就自动被 vim 保存到了一个特殊的剪切板中。之后可以用 p 命令(put)将其粘贴到光标所在的位置的后面。

大家可以试试依次输入下面两条命令:

dd

p

这两条命令执行下来相当于将两行内容调换了位置,类似下面的命令

x

p

将两个字母颠倒了位置。

p 命令同样可以在前面加上个数字,表示重复粘贴 n 次。

文本中加入标签
有时,我们要删除一个大的文本块,直接用d命令很难描述这个文本块的开始和结束。这时可以用 m 命令(mark)在文本中做个标记。还是举个具体的例子。比如有如下的文本:

int main(void)

{

double x = 1e-2;

double y[5];


y[0] = gsl_log1p(x);

y[1] = log1p(x);

y[2] = log1p2(x);

y[3] = log1p3(x);

y[4] = log(1+x);

printf("gsl_log1p = %.15e\n", y[0]);

printf("log1p = %.15e\n", y[1]);

printf("log1p2 = %.15e\n", y[2]);

printf("log1p3 = %.15e\n", y[3]);

printf("log(1+x) = %.15e\n", y[4]);

return 0;

}


想要将几条printf 语句都删除掉。先将光标移动到第一个printf语句的第一个字符p处。执行命令 ma 。其中的 a 是给这个标签命的名字,命名的规则与 q 命令相同。然后将光标移动到 return 语句的 第一个字符 r。输入命令 d`a。可以看到几行 printf 语句都被删除了。

`a 表示做标记的位置

‘a 表示标记所在的行的开始位置


当我们在一篇文章中做了多个标记后,可能我们自己都记不清那些标记都放到了哪里。这时可以用下面的命令显示出所有的标记。

:marks

可以看到,除了我们定义的标记,还多了许多系统自定义的标记。他们的含义以后在介绍。

复制命令
Vim 中称复制操作为 yank。对应的命令是 y。

y 命令与d 命令相似,只是它不删除所选的区域。

作者:liyuanbhu
文章评论

共有 0 条评论