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 有两种方式可以将光标跳转到指定的位置:

  1. 行号 + G

  2. :行号

    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的强大,还得深入学习。