前言
vi编辑器是Linux下的标准编辑器,vi编辑器并非只是用来写程序,还可以用来对一些配置文件进行编辑。vim是vi的加强版,我们一般使用vim对文件进行编辑。本文介绍了vim编辑器的三大模式,以及相应的命令,最后介绍了如何通过vim编辑器的配置文件.vimrc根据自己的需求对vim进行配置。
一、vim三大模式的关系以及如何配置vim为默认编辑器
1. 三种模式的切换
vim编辑器有三个模式:命令模式(command mode)、插入模式(Insert mode)也叫做编辑模式、末行模式(last line mode)也叫底行模式。我们在shell下输入命令vi或者vim加要编辑的文件名就可以进入vi或vim编辑器(我们一般使用vim,因为vim是vi的加强版,功能更为强大)。
我们在shell下初次进入vim是进入到vim的命令模式,在命令模式下按a/i/o/s等插入键进入插入模式,插入模式下按ESC回到命令模式。在命令模式下按 : 进入末行模式,末行模式下按两次ESC回到命令模式。末行模式和插入模式之间不能直接切换。
2. 配置vim为默认编辑器
我们在shell下敲击命令vim就可以进入vim编辑器,敲击vi默认是进入vi编辑器。我们也可以通过过配置,当输入vi的时候也进入vim编辑器,有两种方法。
① 通过别名设置
代码语言:javascript复制alias vi="vim"
非常简单,通过别名实现,一句话搞定。
② 执行下列指令
代码语言:javascript复制sudo update-alternatives --install /usr/bin/editor editor /usr/bin/vim 1
sudo update-alternatives --set editor /usr/bin/vim
sudo update-alternatives --install /usr/bin/vi vi /usr/bin/vim 1
sudo update-alternatives --set vi /usr/bin/vim
二、vim三种模式下的命令介绍
学习vim可以使用官方的教程,在shell下输入命令就能查看vim教程
代码语言:javascript复制vimtutor
通过上下键就可以翻页学习。
1. vim的命令模式(command mode)
在shell下通过vim进入vim编辑器后就是命令模式,在命令模式下按下的键都会当作命令去执行,命令模式界面如下,最低下一行会显示文件名和当前光标所在行号。
(1)移动光标
最基本的上下左右移动,可以在教程中看到,四个方向键和k/h/j/l四个字母键。
光标移动相关的命令如下表所示:
命令 | 作用 |
---|---|
h/左键 | 光标左移一个字符 |
j/下键 | 光标下移一个字符 |
k/上键 | 光标上移一行 |
l(小写L)/右键 | 光标下移一行 |
0 (数字0) | 移动到光标所在行行首 |
$ (shit 4) | 移动到光标所在行行尾 |
gg | 移动到整个文件的首部(文件的第一个字符处) |
shift g (G) | 移动到整个文件的尾部(G可以是shift g,也可以是CapsLk开启大写键后直接按G键) |
n shift g (nG) | 移动到第n行(先按数字键指定n,然后按住shift键不放,同时按g键) |
(2)复制、粘贴、删除、剪切
① 删除与剪切
之所以把删除和剪切放在一起,是因为删除的内容会放在剪切板上,可以通过粘帖把剪切板(刚删除)的内容粘帖回来,这样删除就起到了和剪切一样的效果。其实,删除就是剪切,剪切就是删除,如果删除后不粘帖那就是删除,如果删除后进行粘贴操作,那就是剪切。
命令 | 作用 |
---|---|
x (小写x) | 删除光标后面的字符 |
d l(小写L)/右键 | |
shift x (大写X) | 删除光标前面的字符(X可以是shift x,也可以是CapsLk开启大写键后直接按X键) |
d h/左键 | |
d 方向键(箭头或hjkl) | 删除相应方向的字符或行(不建议用) |
dw | 删除光标所在位置到光标所在单词的尾部 |
d shift 4 (d $) | 删除光标所在位置一直到行尾(D可以是shift d,也可以是CapsLk开启大写键后直接按D键) |
shift d (D) | |
dd | 删除一整行 |
ndd | 删除光标所在行开始的n行 |
操作演示:
dw删除指令演示
编辑
ndd命令演示,先按数字键,然后快速按两次d键
编辑
② 复制与粘贴
粘贴操作既可以在复制后进行,也可以在删除(剪切)后进行
命令 | 作用 |
---|---|
yy | 复制光标所在行到剪切板 |
p (小写p) | 将剪切板内容粘贴到光标所在位置的下一行 |
P (大写P) | 将剪切板内容粘贴到光标所在位置的上一行 |
编辑 通过粘贴前后对比可以看到,粘贴会新开辟一行然后把剪切板内容复制到新开辟的这一行,而不会把原来的上一行或下一行覆盖掉,原来的下一行变为粘贴行的下一行。
(4)查找命令
比如要查找文件内所有的string
命令 | 用法及解释 |
---|---|
/ | 命令模式下,直接输入 /string ,回车,从文件顶部开始查找文件内所有string并高亮显示 |
? (shift /) | 命令模式下,直接输入?string,回车,从文件底部开始查找文件内所有string并高亮显示 |
# | 把光标移动到要查找的字符串string上,按#便可以查找所有string并高亮显示 |
n | 向下遍历查找到的字符串(依次选中下一个高亮显示的string) |
N (shift n) | 向上遍历查找到的字符串(依次选中上一个高亮显示的string) |
① / 与 n 用法演示(?与N同理)
当我们按下 / 后,在最下面会变成这样
然后在 / 后面输入需要查找的字符串
按回车键可以看到,所有的printf都已经高亮显示了
按一下n可以发现,光标移动到下一个高亮显示的printf处了
② #用法演示
把光标停在要查找的字符串处,按#即可高亮选出所有,通过n和shift n可以在被选出的字符串之间遍历。
(5)替换命令与替换模式
命令 | 作用 |
---|---|
r | 在输入一个字符c,就可以将光标后面的一个字符替换为c |
shift r (R) | 进入替换模式 |
Esc | 退出替换模式 |
① 替换单个字符
找到要替换的字符,把光标停在字符前面,按r,在输入需要替换成的目标字符就可以替换成功。
② 进入替换模式
按 shift r 也就是R就可以进入替换模式,这时会在最下面显示替换二字
现在就可以通过上下左右键来移动光标,并输入字符替换光标后面的字符,直到按Esc键退出替换模式。
(6)可视化模式
命令模式下按v就可以进入可视模式,我们在前面讲的复制粘贴删除等等操作只能是按行、按单词或者按字母操作,在可视模式下,我们可以通过选中来操作自己需要的任意个字符。可视模式的作用相当于Windows下,你按住鼠标左键并拖动,这样一个选中功能,然后在对选中的内容进行操作。
命令 | 作用 |
---|---|
v | 命令模式下按v进入可视模式,通过移动光标来选中内容 |
y | 复制 |
d | 删除(剪切) |
p | 在光标位置后面粘贴 |
P (shift p) | 在光标位置前面粘贴 |
操作演示:
按下v的时候就相当于按下了鼠标的左键,通过方向键移动光标就相当于移动鼠标来选中内容,然后对选中的内容操作。
首先在命令模式下按一下v(按完就松开,不用像鼠标一样一直按着),然后按左键和下键选中几行内容
等需要的内容全部被选中后,按y进行复制,然后移动光标到需要粘贴的位置,按p
复制完成,如果需要再次操作,在按一下v,然后进行上面的操作。
(7)代码格式化
命令 | 作用 |
---|---|
>> | 当前光标所在的行右移一个Tab |
n>> | 当前光标所在的行开始往下数n行,全部右移一个Tab |
<< | 当前光标所在的行左移一个Tab |
n<< | 当前光标所在的行开始往下数n行,全部左移一个Tab |
gg=shift g (gg=G) | 对整个文件的代码进行自动调整 |
用法演示:
右移一个Tab键,按住shift,按两下>键
编辑
五行一块右移一个Tab,5>>命令,把光标移动到要右移的内容的第一行,先按一下数字5,按住shift连按两下>即可。
编辑
代码整体调整命令gg=G,按键顺序 g g = shift g
调整前代码
编辑
gg=G命令格式化之后代码
编辑
(8)切换到插入模式
命令 | 作用(下面的插入是指进入插入模式后把光标放在哪) |
---|---|
i | 在光标前插入(如果是竖条光标表现为在光标当前位置插入,其实竖条光标对应的块状光标就是选中了竖条光标后面的一个字符) |
I (shift i) | 在行首插入 |
a | 在光标后插入 |
A (shift a) | 在行尾插入 |
s | 删除光标后的元素,并进入插入模式 |
S (shift s) | 删除当前行的内容,并把光标放在行首进入插入模式 |
o | 在光标所在行的下一行新开辟一行,并在行首插入 |
O (shift o) | 在光标所在行的上一行新开辟一行,并在行首插入 |
s命令的演示
编辑
通过对比可以看到,竖条光标后面的字符没了,并且进入了插入模式,对应的块状光标应该是光标当前选中的字符被删除并进入插入模式。
(9)切换到末行模式
命令 | 作用 |
---|---|
:(冒号) | 进入末行模式,在末行模式下可以执行命令 |
进入末行模式后,最下面会显示一个冒号:
(9)其他操作命令(撤销反撤销、查看函数原型、保存退出)
① 撤销与反撤销
命令 | 作用 |
---|---|
u | 撤销上一个命令,撤销刚才的操作(相当于Windows下的ctrl z),可以理解为一些集成开发环境的后退键 |
ctrl r | 撤销刚才的撤销,反撤销,也就是撤销刚才的 u 操作,可以理解为一些集成开发环境的前进键 |
② 进入man帮助手册
命令 | 作用 |
---|---|
K (shift k) | 把光标移动到函数处,按K进入man帮助手册 |
n K (n shift k) | n是一个数字,表示进入man帮助手册的第n章 |
q Enter | 退出man帮助手册 |
演示:
把光标移动到函数上,按shift k,便可以进入man帮助手册
使用2 shift k命令对scanf函数进入man帮助手册第二章,对库函数进入man手册第二章是进不去的,因为man的第二章是系统调用相关的,对某个函数进入man手册相应章节时应该对号入座,否则就直接shift k不选章节。
使用3 shift k 命令进入man手册第三章,成功进入,在左上角有数字3,F(3)表示这是man帮助手册的第三章。
③ 保存并退出
命令 | 作用 |
---|---|
ZZ (shift z z) | 保存并退出文件,直接在命令模式下敲击两个大Z即可保存并退出,相当于末行模式下的 :wq |
2. vim的插入模式(Insert mode)
插入模式就是编辑模式,没什么好讲的,就是开始对文件进行编辑,通过上下左右键可以移动光标,底部会有插入两个字提示当前在插入模式。但是,默认情况下编辑文件还是非常不方便的,比如不像集成开发环境那样可以自动补全括号,函数提示等,但是我们可以对vim进行配置,这些在后面一章讲解。
3. vim的末行模式(last line mode)
末行模式也叫底行模式,只能在命令模式下按冒号:进入,在插入模式下无法进入,进入末行 后可以在最后一行冒号的后面输入命令。
(1)保存与退出
命令 | 作用 |
---|---|
w | 保存 |
q | 退出 |
wq | 保存后退出 |
x (小写) | |
q! | 强制退出(不保存) |
wq保存后退出是我们最常用的命令
(2)查找与替换
命令 | 作用 |
---|---|
s/src/des | 将光标所在行的第一个src替换为des |
s/src/des/g | 将光标所在行的所有src替换为des |
%s/src/des | 整个文件每一行的第一个sec都替换为des |
%s/src/des/g | 整个文件每一行的所有sec都替换为des |
用法演示:
① s/src/des
因为这个命令是把光标所在行的第一个src替换为des,所以替换之前,一定要在命令模式下,把光标放到src处,否则执行会报错,比如要把某一行第一个int替换为char
命令模式下,先把光标移动到int处
冒号:进入末行模式,并输入命令 s/int/char,回车执行,可以看到第一个替换成char了,第二个没有替换。
② s/src/des/g
把一行所有int替换为char,同样需要在命令模式下把光标移动到相应行,否则vim不知道你要替换的字符串是哪一行的
③ %s/src/des
这个不需要在命令模式下设置光标位置,因为这个替换是对整个文件操作的,原始文件
把整个文件每一行第一个char换成int,%s/char/int,回车运行
④ %s/src/des/g
整个文件所有char替换为int,最后还会提示替换了几次,替换了几行。
(3)vim分屏显示
命令 | 作用 |
---|---|
sp filename | 横屏分屏显示filename文件,如果不加文件名,则分屏显示光标所在的文件(当前光标在哪个文件就分屏再显示一个此文件) |
vsp filename | 竖屏分屏显示filename文件,如果不加文件名,则分屏显示光标所在的文件(当前光标在哪个文件就分屏再显示一个此文件) |
q | 退出一个文件,不能加文件名,输一次q退出一个文件(关闭一个分屏),当前光标在哪个文件就退出哪个文件 |
w | 保存,保存当前光标所在分屏的文件(当前光标在那个文件就保存哪个文件的修改) |
qall | 退出所有文件,并回到shell |
wqall | 保存并退出所有文件,回到shell |
ctrl ww | 切换到下一个分屏(在分屏显示的各个文件之间切换) |
: | 进入底行,输入命令 |
用法演示:
① 横屏分屏
当前打开test.c,再打开文件hello.c和123.c,首先打开test.c
按:进入末行模式,输入sp hello.c
再次按:进入末行模式,输入sp不加任何文件名,它会默认打开当前光标所在的文件,也就是hello.c,光标所在的文件也就是被选中的文件,其文件名会有高亮的背光可以区分。
按住ctrl然后按两次w(Ctrl ww)可以让光标在这三个文件中进行切换,以便于对某个文件进行修改。按一个q,会把当前选中的文件退出(文件名高亮显示、光标所在文件),qall关闭所有文件并进入shell。
② 竖屏分屏
原理和操作与横屏相同,这里只看效果,个人感觉竖屏视觉效果更好,且对比文件更方便。
(4)执行shell命令
命令 | 作用 |
---|---|
!shell命令 | 执行shell命令 |
输入!ls -l,相当于执行shell下的命令ls -l,同样可以删除文件,当我们在vim编辑器的末行模式下删除文件test后,再转到shell下查看,可以看到test文件已被删除。
(5)查看历史命令
和shell一样,在末行模式下可以通过上下键查看历史命令
命令 | 作用 |
---|---|
上键 | 查看上一条历史命令 |
下键 | 查看下一条历史命令 |
三、vim配置文件.vimrc
1. 配置shell下使用vim快捷键
(1)直接输入shell命令
第一种方法直接在shell下输入命令
代码语言:javascript复制set -o vi
代码语言:javascript复制
这样在shell下就可以使用vim编辑器的快捷键了,在shell下按Esc就能进入vim的命令模式,i/a/$/0等快捷键就可以使用并进入vim的插入模式,下面简单演示一下,比如我输入很长的一个命令,但是发现少写了sudo命令,如果没有vim的快捷键0(在行首插入),可能需要按好多下左键才能移到行首并添加sudo,现在我直接按Esc进入命令模式,按0就可以在行首插入。又比如我输入的命令有误,需要删除,在shell下需要一直按删除键,有了vim快捷键,直接Esc进入命令模式,然后dd删除一行。
按Esc进入命令模式(如果你按非进入插入模式的字母键没反应说明当前在命令模式了),按dd
一行命令直接被删除。
(2)修改配置文件.bashrc
使用第一种方法,每次重新开机命令就失效了,要想永久有效,可以修改配置文件.bashrc,其实我们每次开机进入shell之前,系统都会运行.bashrc这个文件,我们只要把上面的命令加到这个配置文件中,就相当于每次开机都执行了一次 set -o vi,这样就可以永久有效了。
.bashrc文件的位置,在~目录下,通过ls命令的-a选项可以看到(因为是隐藏文件),使用vim编辑器打开.bashrc并添加命令即可。
2. 配置.vimrc实现类似于Visual Assist等功能
.vimrc文件的位置在~目录,通过 ls -a 命令可以看到,使用vim编辑器打开即可编辑
代码语言:javascript复制vim ~/.vimrc
代码语言:javascript复制
上面是最常用的几个配置,前三个是设置Tab缩进的距离,set nu 表示显示行号。这些都是很基本的,那么下面来点高级的,首先看下效果,我在shell下直接通过 vim 1.c 创建一个C文件
新创建的C文件直接包含了文件信息(文件名、作者、单位、时间),并且写好了main函数框架和头文件,如果你经常使用Visual Studio开发的话,应该用过Visual Assist插件吧(红苹果插件,如果你没用过的话一定要试试,非常强大,在我的资源有上传哦),这个功能有点像Visual Assist插件,非常方便,并且看起来很高级,其实这也是通过.vimrc配置出来的,具体内容如下
代码语言:javascript复制func SetTitle()
if expand("%:e") == 'c'
call setline(1,"/****************************************************************************")
call append(line(".")," >File Name : ".expand("%"))
call append(line(".") 1," >Author : QQ")
call append(line(".") 2," >Company : QQ")
call append(line(".") 3," >Create Time: ".strftime("%c"))
call append(line(".") 4,"****************************************************************************/")
call append(line(".") 5,"#include <stdio.h>")
call append(line(".") 6,"#include <stdlib.h>")
call append(line(".") 7,"int main()")
call append(line(".") 8,"{")
call append(line(".") 9," ")
call append(line(".") 10," return 0;")
call append(line(".") 11,"}")
endfunc
就是在.vimrc中加了一个函数,这个函数的功能是给新创建的C文件添加一些通用的内容。