Skip to main content

备战 NOIP2016 - vim 简明教程

· 20 min read

简介

Vim 是从 vi 发展出来的一个文本编辑器,代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器

本文将以打一道题为背景讲述如何使用 vim,请以看 算法竞赛入门经典 的心态看本文(即不求甚解)

注意:

  • 本文极具个人使用风格
  • Linux 特指 CCF 2016-10-08 发布的 基于 Ubuntu14.04 的 NOI-Linux
  • Windows 特指 WindowsXP~Windows7 的 Windows 版本

安装

Linux

(其实系统自带,可以跳过)

ctrl-alt-t //讲道理会打开一个命令行终端
sudo apt-get install vim

Windows

  1. 访问 vim 官方网站
  2. 点击左侧 Download
  3. 点击关键字 PC: MS-DOS and MS-Windows
  4. 你会看到 gvim@@.exe (@@表示版本号,因为会不断更新所以没有加数字)
  5. 下载安装即可

准备

安装 g++

Linux

(其实系统自带,可以跳过)

ctrl-alt-t
sudo apt-get install g++

Windows

  1. 安装 MinGW 或 Dev-C++ (尝试 MinGW 的请自行探索,以下是 Dev-C++ 的步骤)
  2. 在安装目录中寻找 bin 或 MinGW32/bin
  3. 将上述目录加入系统环境变量 PATH 中(详细方法自行查阅网络)

vim 的配置文件

打开 vim

Linux
ctrl-alt-t
vim
Windows

双击桌面图标 gVim @@.exe (不要管另外两个)

编写配置文件

注意,打开 vim 之后千万不要乱动键盘,因为现在键盘上的大部分按键都是命令

现在,遵循刘汝佳精神,先按下面的步骤做,后面会详细说明他们的含义

:e $VIM/vimrc "请注意观察光标位置的变化

这时讲道理会提示打开了一个新文件

i "对,这是一个命令,注意观察光标和左下角的变化
:set number "有没有发现这里的注释是双引号开头的?
:set tabstop=4 "配置文件中的注释就是这样的
:set shiftwidth=4 "请不要在等号前后加空格
:set autoindent
:set smartindent
ESC "也可以按 ctrl-[
:w "观察
:q "观察

使用

用 vim 打开文件

Linux

ctrl-alt-t
cd (你准备存放文件的路径)
vim
:e (文件名,不存在该文件就会自动新建,这也就是新建文件的方法)

Windows

  1. 找到/新建文件
  2. 右键
  3. 用 gvim 打开

:e 指令就是打开文件,当文件名很长的时候,你可以打前面部分内容,按 TAB 键会自动补全文件名

关于 vim 的模式

这里要解释一下 vim 的使用姿势

vim 有一种叫做 模式 的东西

  • 刚打开 vim 时处在普通模式下,这时键盘上的大部分按键都是命令,光标可以覆盖整个字符
  • 普通模式下按 i 或 a 进入插入模式,这时 vim 就像一个普通的编辑器,光标处在字符之间,按 ESC 或 ctrl-[ 回到普通模式
  • 普通模式下按 R (注意大小写)进入替换模式,这时和插入模式很像,但输入的字符会覆盖原来的内容
  • 普通模式下按:进入命令模式,还记得上面的那些:吗

其实还有更多的模式与切换模式的方法,下面将详细探究

关于 vim 的操作

为什么 vim 好用?普通模式很重要!

现在先打开一个文本内容足够长的文件并尝试以下命令

这些命令需要你长时间的使用才能熟练使用,但是请注意,这是有意义的

移动

k
hl
j

上面的表格形象的解释了移动光标的命令及含义,即 h j k l,当你用习惯以后会喜欢上这种设定的,特别是 Linux 用户

ctrl-u
ctrl-d

这两个命令可以半屏半屏地移动光标

gg
G

对,就是这么按,一个是到文件头,一个是到文件尾

:233

直接输入数字会跳到指定行,这里会跳到第 233 行

请多多使用上面几个命令移动光标,较为熟悉后再看下面的内容

复制 剪切 粘贴

dd
yy
p
P

这其实是三个命令

dd 会移除整行,这也是删除整行的方法
yy 会复制整行
p 与 P 会放置之前移走或复制的内容,方向类似于之前的 o 和 O

v
V

这是精确复制的方法,同时这也叫做可视模式,从当前位置开始,按下小写 v,移动光标至你想要的位置之后使用 y (复制)或 d (移除)即可,大写可以进行多行操作

x

可以删除单个字符

恢复

有没有发现,如果你错删内容了怎么办

u
ctrl-r

u 可以无限恢复更改
ctrl-r 可以无限恢复 u 的更改
是不是有点乱?自己试试就知道了

花式插入

记得写完内容后回到普通模式

只移动光标当然没用了,我们要编辑!所以要进入插入模式!

i
a

上面已经提到过了,这两个命令的区别在于 i 会使光标移动到它原来覆盖的字符与左面字符的中间,a 是另一边
有什么用呢?你试试在行尾添加字符,用 i 是不是不太对劲,那就用 a 吧

I
A

好眼熟啊...对的,大写了,有什么区别呢,I 会使光标移动到行首并进入 insert 模式,A 相反,有异曲同工之妙吧,快自己尝试一下

o
O

这不一样,这不一样,这不一样
又是大小写...小写会让光标在下面挤出一个新行,大写相反

这里给出一个好用的按键组合

ggo

就是 gg 和 o 的组合,添加头文件利器!
在使用中你会发现更多好用的组合的

奇怪的替换模式

请慎用这个奇怪的模式

r
R

注意光标与左下角的变化,r 会使你进入单字符修改模式,按 r 之后按下的一个字符会替换光标覆盖的那个字符,按 R 后可以一直往后覆盖字符,直到使用 ESC 或 ctrl-[ 退出

现在你已经学会了很多东西了吧,现在已经忘记很多了吧,这是正常现象,要多多复习

保存文件与退出

有了上面的内容,你就可以完整的打完一个代码了,可是怎么保存呢?

:w
:q

上面曾经使用过,:进入命令模式,w 是 write 的缩写(vim 的命令支持缩写和 tab 键补全),即写入文件,q 是 quit 的缩写,即退出
w 指令是有可选参数的,在 w 后加文件名就是 另存为 了

用 vim 编译?

代码是需要编译的,但投奔 vim 之后我们就可以抛弃其他 IDE (例如 Dev-C++)了!

事实上,我们的 c++ 代码的编译靠的是 g++,而不是 IDE,这就是为什么刚开始的时候我们要找到 g++ 了

在普通模式下,以文件名为 demo.cpp 为例

:!g++ % -o demo -Wall

解释一下

  • :是切换为命令模式
  • !表示将后面的内容递交给命令行处理,也就是说之后的内容是命令行的命令
  • g++ 表示调用编译器,Windows 没有添加环境变量或加错的话就无法成功调用
  • % 是 vim 支持的正则表达式,vim 会在你回车后将它替换为当前文件的名字,也就是 demo.cpp,注意,如果文件路径中包含空格请写成 "%"
  • -o 是 g++ 的参数,表示之后的内容是输出的可执行文件的名字,这里就是 demo(Windows 会自动输出为 demo.exe)
  • -Wall 是 g++ 的编译选项,提供更多的优化建议

回车后,Linux 会回到命令行,Windows 会弹出一个命令行窗口,窗口中会给出编译信息,按任意键返回

强大的分屏功能

编译通过之后当然要过样例啦,首先我们要新建一个输入文件,不过我们还将依赖 vim,怎么做呢?

不要再手打样例了...

我们可以输入 :e demo.in 来新建文件呀,还记得吗?之后再 :e demo.cpp 回来,不过这样太 low 了

:sp demo.in
:vsp demo.in

效果请自行尝试,很好用吧,你可以选择自己喜欢的方法打开新窗口
写好输入文件之后怎么关闭呢?

:wq

看到没有,这样更方便了,保存并关闭,而且你会更深刻的理解 :q 命令,它退出的并不是整个程序而是窗口,那么怎么退出整个程序呢?

:qa

这是啥?
quit 并且是 all


现在可以运行程序了

:!./demo
:!demo

上面是 Linux 命令,下面是 Windows 命令,这里展示了 Linux 的特性,必须声明文件就在当前目录
这次仍然会弹出一个窗口,即使程序崩溃也会有提示,即使没有写 while(1) 也会显示 输入任意键返回,这是 vim 为我们做的,是不是很贴心啊

如果没有正常结束怎么办?

  • 如果崩溃请调代码,注意,vim 中输入:之后可以使用上下键查阅历史记录,不需要再打字咯
  • 如果停不下来请输入 ctrl-c 强制停止,并调代码

现在应该已经正常输出了,怎么分屏打开输出文件呢?哦,看上面的内容去(建议使用上下分屏)

可是啊...输出文件一共才几行却占了半屏,我要求同时看代码和输出文件!!!

:res 10

数字代表了大小,请自行选择

可是啊...光标怎么挪到另一个窗口里啊

ctrl-w w

这是个组合键,ctrl-w 表示后面的命令是窗口命令,w 是其中的一个,会让光标在文件之间循环移动,你也可以选择使用 h j k l,会使光标定向移动到一个方向的窗口

这里要插一句,vim 打开大文件是会有些卡,这出现在输出大量 Debug 语句的时候

更多

上面的内容已经足够我们打一打代码了,但是我们还需要知道更多的内容

配置文件

配置文件的路径

还记得写配置文件的方法吗?

:e $VIM/vimrc

我们已经知道了 :e 是打开文件,可是 $VIM 是什么呢?
它代表了 vim 的安装位置,每次 vim 启动时都会自动访问这个文件并执行,你可以尝试加入混乱的字符并重启 vim,vim 会给出错误信息

还有一个配置文件的路径

:e $HOME/.vimrc

这个是你的用户文件夹目录,并且文件是隐藏的,有什么区别呢?
它的作用域是单个用户,上面的作用域是整个系统

配置文件的内容

你有没有发现配置文件中的内容挺像命令模式的命令啊,都带:
对啊,就是这样啊,快尝试这样做

  1. 删除配置文件中的 :set number
  2. 重启 vim,已经不再显示行号
  3. 在普通模式下输入 :set number
  4. 出现行号
  5. 重启 vim,行号消失

有没有发现什么?对,配置文件的作用就是帮你输入命令...

现在解释一下这些命令的含义

:set number "行号
:set tabstop=4 "tab 键的长度,默认为 8
:set shiftwidth=4 "自动缩进的长度,默认为 8
:set autoindent "智能缩进
:set smartindent "同上,一起使用效果好

具体的作用请像刚才自行尝试
更多好用的命令

:set showmatch "在输入右括号时会使光标跳至匹配括号再跳回来
"但事实上光标还在这里,你不用等它
:set cursorline "高亮光标所在行
:color evening "著名的 vim 主题
"你可以使用 :color default 切换回来

查找 替换

更高级高效的操作方法

?int

并不是只有:可以让你进入命令模式,?也可以,并且是查找命令,它会将光标跳到第一次出现查找内容的地方,在 gvim 中还会高亮所有找到的字符,再次输入?并回车可以直接跳到下一个,不用再输入查找的内容

可是 gvim 的高亮会一直保持应该怎么办?

?haha

搜不到匹配项就不会高亮了

:%s/int/long long/g

: 则是我们熟知的,%s 是正则表达式的内容,语法是 %s/原内容/要替换的内容 注意不要输入多余的空格,默认只会替换每行第一次出现的 原内容,/g 使它替换所有的内容

文件与自动恢复

使用 vim 的时候最不用担心的就是电脑 BOMB 并重启了,在你使用 vim 编辑文件的时候,vim 会创建一个隐藏的交换文件,他会储存着你较新的修改,只有写入命令才会让源文件更新,在每次载入文件的时候,vim 都会查看是否存在交换文件(如果正常关闭的话 vim 会自动删除交换文件),如果存在就会给出提示

有时也会出现一些奇怪的问题,例如 vim 提示 demo.out 存在交换文件,这时还是果断删除交换文件吧

如果你做出了修改又不想保存(例如做出了错误的修改),你不必使用 u 一步步返回,你可以这样做

:q!
:e! demo2.cpp

在命令后加感叹号表示强制执行,不保存当前文件就退出或打开其他文件,这样下次加载时 vim 就不会提示交换文件的问题了

你也可以设置定时自动保存或每次保存都生成备份文件,在此不再赘述

一次执行多次命令

在普通模式下输入数字会发生什么呢?
什么也没有发生
再输入命令呢,比如 u?
哦哦哦,天啊...
先用 ctrl-r 恢复过来吧
先输入数字表示执行后面的命令的次数,默认为 1
有时会很有用
如果输入了数字又不想执行呢?
按 ESC 会取消任何还未执行的命令,包括这些数字

缩进小助手

有的时候代码的缩进会很奇怪啊,怎么办呢,我们不用一行一行改,只要在普通模式下输入<>,再输入从这一行开始要修改的行数,回车
配合上面讲的命令前面的数字,简直就是神器啊!!!

对于长变量的补全

如果你喜欢长变量名,难道要手输变量?!快打前几个字符,再按 ctrl-p ,此时如果有多种选择它就会弹出一个菜单,否则就会直接补全

菜单上的操作

  • ctrl-p 选择下一项
  • ctrl-n 选择上一项
  • ctrl-d 使用高亮行补全代码

这样就不会很费手了吧

应该没有什么必要东西的了