玩转vim(vi)编辑器

2024-08-08 17:28:32 浏览数 (1)

前言

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文件添加一些通用的内容。

0 人点赞