简介
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
- 访问 vim 官方网站
- 点击左侧 Download
- 点击关键字 PC: MS-DOS and MS-Windows
- 你会看到 gvim@@.exe (@@表示版本号,因为会不断更新所以没有加数字)
- 下载安装即可
准备
安装 g++
Linux
(其实系统自带,可以跳过)
ctrl-alt-t
sudo apt-get install g++
Windows
- 安装 MinGW 或 Dev-C++ (尝试 MinGW 的请自行探索,以下是 Dev-C++ 的步骤)
- 在安装目录中寻找 bin 或 MinGW32/bin
- 将上述目录加入系统环境变量 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
- 找到/新建文件
- 右键
- 用 gvim 打开
:e 指令就是打开文件,当文件名很长的时候,你可以打前面部分内容,按 TAB 键会自动补全文件名
关于 vim 的模式
这里要解释一下 vim 的使用姿势
vim 有一种叫做 模式 的东西
- 刚打开 vim 时处在普通模式下,这时键盘上的大部分按键都是命令,光标可以覆盖整个字符
- 普通模式下按 i 或 a 进入插入模式,这时 vim 就像一个普通的编辑器,光标处在字符之间,按 ESC 或 ctrl-[ 回到普通模式
- 普通模式下按 R (注意大小写)进入替换模式,这时和插入模式很像,但输入的字符会覆盖原来的内容
- 普通模式下按:进入命令模式,还记得上面的那些:吗
其实还有更多的模式与切换模式的方法,下面将详细探究
关于 vim 的操作
为什么 vim 好用?普通模式很重要!
现在先打开一个文本内容足够长的文件并尝试以下命令
这些命令需要你长时间的使用才能熟练使用,但是请注意,这是有意义的
移动
k | ||
h | l | |
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
这个是你的用户文件夹目录,并且文件是隐藏的,有什么区别呢?
它的作用域是单个用户,上面的作用域是整个系统
配置文件的内容
你有没有发现配置文件中的内容挺像命令模式的命令啊,都带:
对啊,就是这样啊,快尝试这样做
- 删除配置文件中的 :set number
- 重启 vim,已经不再显示行号
- 在普通模式下输入 :set number
- 出现行号
- 重启 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 使用高亮行补全代码
这样就不会很费手了吧