vim的模式
基本模式
- 普通模式
- 插入模式
- 可视模式
- 选择模式
- 命令行模式
- Ex 模式
派生模式
- 操作符等待模式
- 插入普通模式
- 插入可视模式
- 插入选择模式
- 替换模式
在入门使用中只涉及到:普通模式,输入模式,替换模式,插入模式,可视模式,命令行模式;且以前两者的使用为主
入门使用
以下内容多用表格讲解记录
普通模式
退出vim
按键 | 含义 |
---|---|
ZZ(两个大写字母Z) | 保存修改并退出 |
:wq(这是一个组合命令,:w 表示保存,而 :q 表示退出) | 保存修改并退出 |
:q | 直接退出(只看看) |
:q! | 直接退出(有修改,但不希望保存) |
光标移动
按键 | 含义 |
---|---|
h | 将光标向左移动 |
j | 将光标移动到下一行 |
k | 将光标移动到上一行 |
l | 将光标向右移动 |
0 | 将光标定位到行首的位置 |
^ | 同上 |
$ | 将光标定位到行尾的位置 |
b | 将光标定位到光标所在单词的起始处 |
e | 将光标定位到光标所在单词的结尾处 |
w | 将光标定位到下一个单词的起始处 |
gg | 将光标定位到文件的开头 |
G | 将光标定位到文件的末尾 |
数字+motion | 重复多次motion(10h:光标向左移动10) |
标点、特殊符号算一个单词,两个标点间的中文句子算一个单词。
删除命令
按键 | 含义 |
---|---|
x | 删除光标指定的字符(跟在插入模式的 Delete 一样) |
d motion | d 是 Delete的意思,motion 即指定要删除的对象 |
d0 | 删除光标从当前位置(不包含)到该行行首的所有字符 |
d^ | 同上 |
d$ | 删除从光标当前位置(包含)到该行行尾的所有字符 |
db | 删除从光标当前位置(不包含)到单词起始处的所有字符 |
de | 删除从光标当前位置(包含)到单词结尾处的所有字符 |
dw | 删除从光标当前位置(包含)到下个单词起始处的所有字符 |
dh | 删除光标前面一个字符 |
dl | 删除光标指定的字符(同x) |
dj | 删除光标所在行以及下一行的所有字符 |
dk | 删除光标所在行以及上一行的所有字符 |
dd | 删除光标所在行的所有字符 |
dgg | 删除光标所在行(包含)到文件开头的所有字符 |
dG | 删除光标所在行(包含)到文件末尾的所有字符 |
数字+d motion(d+数字+motion) | 删除多个motion范围 |
这上面所有的“删除”操作并不是真的删除,它们事实上是存放在 VIM 的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能 。
撤销和恢复命令
按键 | 含义 |
---|---|
u | 撤销最后一次修改 |
U | 撤销对整行的修改 |
Ctrl + r | 恢复撤销的内容 |
粘贴命令
按键 | 含义 |
---|---|
p | 将最后一次删除的内容粘贴到光标之后 |
P(大写) | 将最后一次删除的内容粘贴到光标之前 |
如果你需要粘贴的是整行为单位,那么 p 命令将在光标的下一行开始粘贴;如果你拷贝的是非整行的局部字符串,那么 p 命令将在光标后开始粘贴。
拷贝命令
按键 | 含义 |
---|---|
y motion | y是 yanked的意思,motion 即指定要拷贝的对象 |
y0 | 拷贝光标从当前位置(不包含)到该行行首的所有字符 |
y^ | 同上 |
y$ | 拷贝从光标当前位置(包含)到该行行尾的所有字符 |
yb | 拷贝从光标当前位置(不包含)到单词起始处的所有字符 |
ye | 拷贝从光标当前位置(包含)到单词结尾处的所有字符 |
yw | 拷贝从光标当前位置(包含)到下个单词起始处的所有字符 |
yh | 拷贝光标前面一个字符 |
yl | 拷贝光标指定的字符 |
yj | 拷贝光标所在行以及下一行的所有字符 |
yk | 拷贝光标所在行以及上一行的所有字符 |
yy | 拷贝光标所在行的所有字符 |
ygg | 拷贝光标所在行(包含)到文件开头的所有字符 |
yG | 拷贝光标所在行(包含)到文件末尾的所有字符 |
数字+y motion(y+数字+motion) | 拷贝多个motion范围 |
与删除命令相似,但不会去除拷贝内容,相当于 Windows 的复制功能 。拷贝完成之后同样使用 p 命令进行粘贴。
替换命令
普通替换
按键 | 含义 |
---|---|
r | 替换光标所在的字符 (先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符) |
数字 + r | 重复替换多个字符(替换多个字符为同一个如将two变为aaa) |
与删除命令相似。对于需要替换多个字符,更好的方案是直接进入替换模式(按下大写的 R 键,详见下)。
查找替换
输入:s/old/new
,这样即可将光标所在行的第一个 old 替换为 new;如果输入的是 :s/old/new/g
,则表示将光标所在行的所有 old 替换为 new。
输入 :%s/old/new/g
表示替换整个文件中每个匹配的字符串。
希望 VIM 在每次替换前都咨询一下你:“亲,我准备替换 XX 了,你确定要将 XX 替换成 OO 吗?”可以,输入 :%s/old/new/gc
,能看到页面下方的 (y/n/a/q/l/^E/ ^Y) ,这是 VIM 在咨询您的意见:
- y 表示替换
- n 表示不替换
- a 表示替换所有
- q 表示放弃替换
- l 表示替换第一个并进入插入模式
- ^E 表示用 Ctrl+e 来滚动屏幕
- ^Y 表示用 Ctrl+y 来滚动屏幕
如果我只想替换第 5 行到第 13 行之间的所有 XX, 使用 :5,13s/old/new/g
即可胜任你的要求
修改命令
会进入插入模式。
按键 | 含义 |
---|---|
c motion | c 是 change的意思,motion 即指定要删除的对象 |
c0 | 删除光标从当前位置(不包含)到该行行首的所有字符,并进入插入模式 |
c^ | 同上 |
c$ | 删除从光标当前位置(包含)到该行行尾的所有字符,并进入插入模式 |
cb | 删除从光标当前位置(不包含)到单词起始处的所有字符,并进入插入模式 |
ce | 删除从光标当前位置(包含)到单词结尾处的所有字符,并进入插入模式 |
cw | 删除从光标当前位置(包含)到下个单词起始处的所有字符,并进入插入模式 |
ch | 删除光标前面一个字符,并进入插入模式 |
cl | 删除光标指定的字符,并进入插入模式 |
cj | 删除光标所在行以及下一行的所有字符,并进入插入模式 |
ck | 删除光标所在行以及上一行的所有字符,并进入插入模式 |
cc | 删除光标所在行的所有字符,并进入插入模式 |
cgg | 删除光标所在行(包含)到文件开头的所有字符,并进入插入模式 |
cG | 删除光标所在行(包含)到文件末尾的所有字符,并进入插入模式 |
数字+c motion(c+数字+motion) | 删除多个motion范围,并进入插入模式 |
文件信息
ctrl + g
: 文件名,文件状态,文件的总行数,以及光标所在的位置(光标所在的位置的右边是光标在文件中的相对位置,是用百分数来显示的 )。
光标跳转
在 VIM 有两种方式可以将光标跳转到指定的位置:
-
行号 + G
-
:行号
12G :12
定位括号
VIM 有个按键可以快速定位到另一半括号 就是 %
键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。
缩进
VIM 可以使用尖括号(<
或 >
)来控制缩进。
-
单行行缩进
两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作:
>>
表示缩进,而<<
则表示反缩进。 -
多行缩进
方法一:可以先输入数字 在输入 >> 表示将光标所在行以及下面几行共(数字)行同时插入一个缩进。
方法二:也可以 按 v 进入可视模式(详见下),选择好需要缩进的目标后,
只需按一下 >
即可完成任务。
搜索命令
搜索
-
按下斜杠(
/
) 进入命令行模式 , 紧挨着斜杠(/)的是搜索目标 , 比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置 。/llo
按
n
键即可定位到下一个符合的目标(向下查找),而按N
键则返回上一个(向上查找)。 -
在普通模式下按下问号(
?
)也是进入命令行模式,实现的也是搜索功能。/FishC 是从光标位置向后开始搜索 FishC 这个字符串,而 ?FishC 则相反,是从光标位置向前开始搜索
总结: |
/目标 | ?目标 |
---|---|---|
搜索方向 | 从光标位置向后 | 从光标位置向前 |
n | 向后搜索下一个 | 向前搜索下一个 |
N | 向前搜索下一个 | 向后搜索下一个 |
其他
当搜索到了文件的末尾(/目标)或开头(?目标),页面下方面会显示“Search hit BOTTOM, continuing at TOP”或“Search hit TOP, continuing at BOTTOM”的字样。表示一轮搜索到文件尾/头了,搜索下一个就是从文件头/尾开始 。
VIM 会自动高亮所有匹配的目标,即使在你找到目标之后,它们仍然高傲的亮着 。 输入冒号(:
)进入命令行模式,然后输入 nohl
即可 取消。
:nohl
在搜索命令中*.、、[、]、^、%、/、?、~ 和 $ 这 10 个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠(\
),**比如你要搜索问号,则输入 \? 。
/\?
执行shell命令
需要知道某个路径下有哪些文件 , 于是祭出了一个感叹号(!
) 比如你想知道根目录(/)下面有哪些目录和文件,可以在VIM中输入 :!ls /
:!ls /
文件
文件另存为
做法是输入 :w 新文件名
。
:w hello.c
局部内容另存为
在普通模式中按下 V 键即进入可视模式 选好范围之后的操作就跟“文件另存为”一样了。按下冒号(:
)屏幕左下方出现 :'<,'>再输入 w 新文件名
。
如果路径中已经存在 test2 文件,那么 VIM 会提醒你需要加感叹号(!
)才能强制覆盖文件。即输入 w! test2
合并文件
只需要输入冒号(:
)进入命令行模式,然后输入 r 文件名
, 即可将指定文件的内容读取并置入到光标的下一行中。
:r hello.c
打开多个文件
VIM 使用 –o 或 –O 选项打开多个文件,其中 –o
表示垂直并排, -O
表示水平并排, 例如 :
vim -o lesson4 lesson5 lesson6
打开后默认光标是落在第一个文件中的,此时之前学过的所有命令都可以上,不过仅限于第一个文件。 使用ctrl + w + w
将光标切换到下一个文件;或者使用 ctrl + w + 方向
(方向键或 h、j、k、l):
-
对于垂直并排的文件:使用 ctrl + w + 上、下方向,表示上、下切换文件;
-
对于水平并排的文件:使用 ctrl + w + 左、右方向,表示左、右切换文件。
退出文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z), 只需在原来退出命令的后边加上小写 a
,则表示退出动作是针对所有的(ALL):qa、qa!、wqa
:qa
:qa!
:wqa
输入模式
在普通模式下,敲击 i、a、o、 s、 I、 A、 O、 S
进入到输入模式。按下 Esc
可回到普通模式。
屏幕左下角出现 -- INSERT-- 字样,即可像txt一样输入。
按键 | 含义 |
---|---|
i | 在光标所在字符前开始插入 |
I | 在光标所在行的行首开始插入 如果行首有空格则在空格之后插入 |
a | 在光标所在字符后开始插入 |
A | 在光标所在你行的行尾开始插入 |
o | 在光标所在行的下面另起一新行插入 |
O | 在光标所在行的上面另起一行开始插入 |
s | 删除光标所在的字符并开始插入 |
S | 删除光标所在行并开始插入 |
替换模式
在普通模式下,按下大写的R
键进入到替换模式。按下 Esc
可回到普通模式。
屏幕左下角出现 -- REPLACE -- 字样 ,可以替换多个字符 。此时输入字符可以连续替换光标及其后边的内容。
退格键(Backspace)在替换模式中被解释为如果左边内容被替换过,则恢复到原来的样子;如果没有被替换过,则简单的向左移动。
可视模式
在普通模式,下按下大写的 v 键进入到可视模式。按下 ==Esc== 可回到普通模式。
左下角出现 -- VISUAL -- 字样
通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中)。
总结
vim的功能十分强大,不愧是编辑器之神。因此以上内容也仅仅只是入门,可以使用vim;若真正想体会vim的强大,还得深入学习。