目录

1、vim的概述

1.1什么是 vim?

1.2、vim的三种模式

1.2.1、命令模式

1.2.2、输入模式

1.2.3、底线命令模式


1、vim的概述

1.1什么是 vim?

vim(vi improved),是Linux系统中提供的编辑器,它是vi的增强版本,与vi向上兼容。通常,在LInux中用到的vi实际上是vim,即使输入命令时输入的是vi,但是使用的仍然是vim。

1.2、vim的三种模式

vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)。 这三种模式的作用分别是:

1.2.1、命令模式

用户刚刚启动 vi/vim(例如输入vi命令),便进入了命令模式。

此状态下敲击键盘动作会被vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

首先说明Ctrl+g,在屏幕下方可以查看到当前光标所在位置,例如:按下Ctrl+g组合键后,在下方看到:

命令模式移动光标可以使用下面的按键:

h

向左箭头键(←)

Backspace

光标向左移动一个字符。

这几个命令前面都可以添加数字,表示移动多个字符。

Backsapce在到达边界时可以上移一行,即具有跨行的功能。

h和←不具备跨行功能。

j

向下箭头键(↓)

Ctrl+n

+

Enter

光标向下移动。

这几个命令前面都可以添加数字,表示移动多行,除了Ctrl+n。

+和Enter将光标移到下一行的第一个非空白字符。

其他3个将光标向下移动一行,但是光标所在列不变。如果下一行比当前行光标所在位置还短,则下移到行尾。

k

向上箭头键(↑)

Ctrl+p

-

光标向上移动。

这几个命令前面都可以添加数字,表示移动多行,除了Ctrl+P。

-是将光标移到上一行的第一个非空白字符

其他3个将光标向下移动一行,但是光标所在列不变。

l

向右箭头键(→)

space

光标向右移动一个字符。

这几个命令前面都可以添加数字,表示移动多个字符。

space在到达边界时可以下移一行,即具有跨行的功能。

l和→不具备跨行功能。

例如:向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键;

向左移动5个字符,可以使用“5h”或“5←”的组合按键;

[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d]屏幕『向下』移动半页
[Ctrl] + [u]屏幕『向上』移动半页

0

^

0将光标移动到当前行的第1列,不管它是否为空白符。

^将光标移动到当前行的第一个非空白字符。

该命令前面不能有数字。

$将光标移到当前行的最后一个字符上(包括空白字符)。
n<space>那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离,即使会换行。不指定n时,默认为1个字符。
w移到下一个单词的首字符,在移动的路径上如果有逗号、句号会先跳到标点符号上。前面可以有数字。
W移到下一个非空白字符串的开头。
b和w命令方向相反
B和W命令相反
e和w命令类似,只不过是,e将光标移到单词结尾。
E和W命令类似,只不过是,E将光标移到字符串的结尾。
0 或功能键[Home]移动到这一行的最前面字符处 (常用)
$ 或功能键[End]移动到这一行的最后面字符处(常用)
(将光标移到上一个句子的开头。句子被定义为以” . “、"?”、“!'结尾,后随两个空格或一个换行的字符序列。 
)将光标移到下一个句子的开头。句子被定义为以” . “、"?”、“!'结尾,后随两个空格或一个换行的字符序列。 
H光标移动到这个屏幕的最上方那一行的第一个字符(包括空白字符)。
M光标移动到这个屏幕的中央那一行的第一个字符(包括空白字符)。
L光标移动到这个屏幕的最下方那一行的第一个字符(包括空白字符)。
G移动到这个档案的最后一行(常用)
nGn 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G 啊! (常用)

命令模式下修改文本命令(有些命令可以有命令模式转换成输入模式)介绍:

i 在光标前插入内容。
I在当前行的行首插入新增文本,行首是该行第一个非空白字符。
a在光标后附加内容。
A在当前行的行尾附加内容。
o在当前行的下面新增一行,并写入内容。
O在当前行的前面新增一行,并写入内容。

c

C

cc

c命令的一般使用方式是:c+光标移动命令+新文本+Esc键

删除多个字符或多个行,然后进入输入模式(即修改)。配合光标移动命令例如:2c←或者c2←则会删除光标(向左修改时不包括光标位,向右修改时包括光标位)左侧2个字符然后进入insert输入模式;c2↑删除当前行和当前行上面2行,接着进入输入模式;

C命令删除从光标当前位置到该行的末尾,接着进入输入模式;

cc和C类似,不过cc是删除当前一整行,并进入输入模式。

x从光标所在位置向右删除n个字符(包括光标处的字符)(n省略时,默认为1),但是不会由命令模式转化成输入模式。
X从光标所在位置向左删除n个字符(包括光标处的字符)(n省略时,默认为1),但是不会由命令模式转化成输入模式。
r取代当前光标所在处的字符,但是不会由命令模式转化成输入模式。r前面可以有数字,例如:3ra表示光标位及光标后2个字符都被取代成a。
R进入取代输入模式。
s删除当前光标所在处的字符,接着插入(替换)。若在s前面给出一个数字,例如:5s表示删除光标所在字符及其后的4个字符将被新输入的正文替换。
S删除当前光标所在行,接着插入。
nu撤消命令,撤销到上n步。(常用)(n省略时,默认为1)(常用)
U

把当前行恢复到编辑之前的状态,无论该行被编辑了多少次。

[Ctrl]+r

重做上一个动作。(常用)

.不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)
d...

d与光标移动命令(以...表示)组合而成的命令表示从光标位置开始删到由光标移动限定的文本对象的末尾。向右删除,会删除当前光标所在位置,也就是包括当前光标所在处的字符;向左删除,不会删除当前光标所在位置,也就是不包括当前光标所在处的字符。

dd删除光标所在行。ndd表示删除光标所在行及后面的n-1行(n省略时,默认为1)

例如:3dd表示删除当前行及后面的2行内容。

d0从光标位置(不包括光标位)删至行首。
d$从光标位置删除到当前行的末尾,与D相同
d3l从光标位置(不包括光标位)向右删除3个字符
d5j删除当前行和当前行下面5行,也可以5dj
d2k删除当前行和当前行上面的2行,也可以2dk

D从光标位置删除到当前行的末尾
yy

yy与光标移动命令组合而成的命令表示从当前位置复制到移动位置

nyyn表示数字,复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)。
yy表示复制当前行。(常用)
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行!(常用)

>

<

>>

<<

文本行移动命令

>将限定的正文行向右移动若干位(通常是8个空格)。被移动的正文行的范围由当前行和随后输入的光标移动命令所限定。如>2j
>和>类似,只是方向向左
>>将当前行向右移动8个空格。若在>>之前给出一个数字,如5>>,则将当前行和及下面的4行(共5行)都右移8个空格
<<和>>类似,只是将当前行向左移动8个空格

!过滤命令的格式是:!+光标移动命令+Linux命令,最后按Enter键。其功能是把当前行和光标移动命令指定的行之间的所有行由给定的Linux命令进行加工,替换原来的那部分正文。
J文本行合并命令,把当前行与下面一行合并成一行。若在J之前给出一个数字,如nJ,则表示把当前行及其后的n-1行合并成一行。
: 切换到底线命令模式,以在最底一行输入命令。

1.2.2、输入模式

在输入模式下,用户可以自由输入文本内容。

在输入模式下,可以使用下面的按键来快速移动光标:

Ctrl+u将光标快速回退到刚插入字符串的第一个字符,并删除该字符串,重新开始插入
Ctrl+w将光标移到最后插入单词的首字符,并删除该单词(单词是以标点符号或空白符号分开的字母数字串)
Ctrl+t对当前光标所在行进行缩进。

1.2.3、底线命令模式

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。所有的底线命令都可以使用Enter或者中断键予以中止。

在底线命令行模式下,经常有些命令需要指定作用范围,例如:检索指定模式字符串。可以使用下述字符指定行的位置:

.当前行,多数的命令默认地址是当前行。
n编辑缓冲区中的第n行,行号从1开始编排
$缓冲区最后一行
%从第一行到最后一行。等价于1,$
+n

n表示相对当前行的位移。例如-3、.+3、+++,都表示向上移动3行;-5,表示向下移动5行。

指定命令作用范围的语法格式:

:n1,n2命令

例如:

:10,20d        删除10至20行之间的内容

:.,+5d        删除当前行和它下面的5行

检索指定模式字符串

检索字符串
/word向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word向光标之上寻找一个字符串名称为 word 的字符串。

n

代表重复前一个检索的操作。例如,如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!

并且n前面可以有数字,例如:2n 表示连续2次同向重复前一个检索操作。

N

重复检索前一个检索操作,但是为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。

并且N前面可以有数字,例如:4N表示连续4次反向重复前一个检索操作。

当前行中查找字符
按下f后按下目标搜索字符在当前行上向右查找指定字符,光标停在首先找到的字符上。
按下F后按下目标搜索字符在当前行上向左查找指定字符,光标停在首先找到的字符上。
;同向重复上一次查找字符命令
,反向重复上一次查找字符命令

使光标靠近字符
按下t后按下目标搜索字符

在当前行上向右查找指定字符,光标停在首先找到的前一个字符上

(右前,左后)

按下T后按下目标搜索字符

在当前行上向左查找指定字符,光标停在首先找到的后一个字符上

(右前,左后)

;同向重复上一次查找字符命令
,反向重复上一次查找字符命令

置标记
按下m后按下标记名(标记名为一个字符)对文件中某些特定位置可以做上标记,便于以后查找。可以置多个标记,标记名相同时,后者覆盖前者。标记在退出文件后会失效。
'标记名光标回到标记所在行的开头
`标记名光标回到标记处

全局(局部)替换

一般格式:

g/模式/命令表

一种组合命令,用单个命令就可执行对文件的复杂修改。g(global)命令分为两个执行阶段:1、对编辑缓冲区中与给定模式相匹配的各行做上标记;2、对每个置上标记的当前行(以 表示)执行给出的命令表。
g/s1/p打印(print)当前所编辑文件中包含字符串s1的所有行。
g/s1/s//s2/在包含字符串s1的所有行中,用字符串s2替换(substitute)首次出现的s1
g/s1/s//s2/g用字符串替换所有出现的s1,不管在一行中s1出现多少次(常用)
g/s1/s//s2/gp用字符串替换所有出现的s1,并打印所有修改过的行
g/s1/s//s2/gc确认(confirm)替换,字符串s1每出现一次,就询问是否用s2替换。若回答y,则进行替换,否则不替换。
g!/模式/命令表对所有不匹配给定模式的文本行执行给出的命令表
s/模式/替换文本/选项更加灵活地替换方式。可以在模式中使用正则表达式。选项有c(表示确认)、g(表示全局)
:n1,n2s/word1/word2/gn1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !例如,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则:
『:100,200s/vbird/VBIRD/g』。(常用)

:1,$s/word1/word2/g

或 :%s/word1/word2/g

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)

:1,$s/word1/word2/gc 

或 :%s/word1/word2/gc

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

定线命令行模式常用命令

e命令

在vi中,%表示当前文件名,#表示上一个文件名

当时用e命令时,vi编辑器首先检查修改缓冲区后,文件是否保存过,如果没有保存则会发出警告信息,并终止该命令。

e 文件名切换到指定文件。例如,e #,表示切换到下一个文件
e! 文件名不把对当前文件的修改保存,直接切换到指定的文件,也就会强制编辑器跳过检查是否修改过缓冲区这一流程。
e +n 文件名从指定第n行开始编辑指定文件参数n可以是不包含空格的编辑命令。如+/模式。

Ctrl+^当在vi中编辑多个文件时,可以使用Ctrl+^来切换文件。等价于  :e #Enter键
r命令

把文本读入编辑缓冲区的任意指定位置。所读入文本必须至少长,可以是一个文件或命令的输出

位置r 指定文件将指定文件的副本放入到缓冲区指定行后。若未指定文件,则默认是当文件。位置参数,不能超过缓冲区的最大行数,和小于最小行数。
r ! 命令把命令的输出读到指定行之后。注意:“ ! ”之前有空格。

w命令

将编辑缓冲区中的全部或则部分内容保存或另存为指定的文件。

w 文件名将编辑缓冲区中的内容保存为(另存为)指定的文件,在该情况下,如果指定文件不存在,则vi会自动新建文件。若不指定文件名,则表示保存到文件,前提是该文件已经存在。
n1,n2 w 文件名将 n1 到 n2 的内容保存到指定文件中。
w>>文件名将编辑缓冲区中的内容附加到现有文件的结尾。
w!若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
wq保存并退出

q命令

退出命令

q退出vi编辑器
q!若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
wq 文件名相当于执行w命令后,再执行q命令
x 文件名如果该文件做过修改,并且尚未写出去,那么该命令就把缓冲区内容写出去,然后退出vi,否则直接退出vi.

ZZ这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
ZQ不保存,强制退出。效果等同于 :q!。
! command暂时离开 vi 到指令行模式下执行 command 的显示结果!例如
『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
Logo

更多推荐