ansheng’s blog!

初入编辑器之神:Vim

Vim是一款功能强大、高度定制的文本工具。

Vim安装

apt install vim

vi和vim是什么关系?

可视化接口(visual interface),EX(行文本编辑器)的可视化接口

vi(VIM - Vi IMproved)的加强版本

  1. 增加了多级撤销
  2. 多窗口操作
  3. 提高了稳定性,减少了崩溃以及崩溃后也可以恢复
  4. 关键字自动补全以及上下文相关的补全

vim工作模式

vim打开一个文件时的默认模式(命令模式)

键盘上的i键盘即进入插入模式,o/a都可以进入插入模式

shift+:即可进入命令行模式

:set nulber # 显示行号

配置文件子/etc/vim/vimrc或者~/.vimrc

键盘上的v进入可视化模式,上下左右移动光标选中文本,可以进行后续的粘贴、删除、复制等操作

R就可以进入到替换模式

光标移动

字符 移动方向
h 向左移动
l 向右移动
j 向下移动
k 向上移动

10>l向左移动10个字符

单词 移动方向
w 将光标移动到下一个单词的开头
b 将光标移动到前一个单词的开头
e 将光标移动到下一个单词的词末
E 移动到单词的结尾(忽略标点符号)
ge 将光标移动到上一个单词的词末
2w 指定移动的次数
单词 移动方向
$ 将光标移动到当前行的行尾
0 将光标移动到当前行的行首
^ 将光标移动到当前行的第一个非空字符
2\| 移到当前行的第2列
fx 将光标移动到当前行的第一个字符x
3fx 将光标移动到航前行的第3个字符x
tx 将光标移动到目标字符x的前一个字符上
fx和tx 可以通过;,进行正向或反向重复移动
% 用于符号间的移动,它会在一对()[]{}之间跳跃
单词 移动方向
( 移到当前句子的开头
) 移到下一个句子的开头
{ 移到当前一段的开头
} 移到下一段的开头
[[ 移到当前这一节的开头
]] 移到下一节的开头
单词 移动方向
xG\ 跳转到指定的第x行,G移动到文件按末尾
`` 2次单引号)返回到跳转前的位置
gg 移动到文件开头
x% 移动到文件中间,就使用50%
H 移动到当前屏幕的开头
M 移动到当前屏幕中间
``L` 移动当前屏幕的末尾
ctrl+G 查看当前的位置状态

滚屏与跳转

快捷键 方向
ctrl+u 向上滚动
ctrl+d 向下滚动
快捷键 方向
ctrl+b 向上滚动
ctrl+f 向下滚动
定位 位置
zz 将光标置于屏幕的中间
zt 将光标移动到屏幕的顶部
zb 将光标移动到屏幕的底部
标记 跳转
mx 设置跳转位置
`x 跳转到设置

文本插入操作

按键 描述
i 在当前光标的前面插入字符
a 在当前光标的后面追加字符
o 在当前光标的下一行行首插入字符
I 在一行的开头添加文本
A 在一行的结尾处添加文本
O 在光标当前行的上一行插入文本
s 删除当前光标处的字符并进入到插入模式
S 删除光标所在处的行,并进入到插入模式
u 撤销修改

文本删除

按键 描述
x 删除当前光标所在处的字符
X 删除当前光标左边的字符
按键 描述
dw 删除一个单词(从光标处到空格)
daw 删除光标所在的整个单词(包括空白字符)
diw 删除整个单词文本,但是保留空格字符不删除
d2w 删除从当前光标开始处的 2 个单词
d$ 删除从光标到一行末尾的整个文本
d0 删除从光标到一行开头的所有单词
dl 删除当前光标处的字符=x
dh 删除当前光标左边的字符=X
按键 描述
dd 删除当前光标处的一整行=D
5dd 删除从光标开始处的5行代码
dgg 删除从光标到文本开头
dG 删除从光标到文本结尾
按键 描述
J 删除一个分行符,将当前行与下一行合并

文本复制、剪切与粘贴

按键 描述
y 复制,p:粘贴
yw 复制一个单词
y2w 复制2个单词
y$ 复制从当前光标到行结尾的所有单词
y0 复制从当前光标到行首的所有单词
yy 复制一整行
2yy 复制从当前光标所在行开始的2
  1. 首先进入visual模式:v
  2. 移动光标选择文本
  3. 复制与粘贴的操作

文本修改与替换

按键 描述
cw 删除从光标处到单词结尾的文本并进入到插入模式
cb 删除从光标处到单词开头的文本并进入到插入模式
cc 删除一整行并进入到插入模式
~ 修改光标下字符的大小写
r 替换当前光标下的字符
R 进入到替换模式
xp 交换光标和下一个字符

组合命令使用

更改 删除 复制 从光标位置到…
cH dH yH 屏幕顶端
cL dL yL 屏幕低端
c+ d+ y+ 下一行
c5\| d5\| y5\| 本行的第五列
2c) 2d) 2y) 往下第二个句子
c{ d{ y{ 上一段
cG dG yG 文件结尾
c13G d13G y13G 第13行

文本查找与替换

表达式 描述
/string 正向查找
?string 反向查找

:set hls

  1. *按键将当前光标处的单词高亮显示
  2. 使用n浏览下一个查找高亮的结果
操作 描述
:s/old/new 将当前行的第一个字符串old替换为new
:s/old/new/g 将当前行的所有字符串old替换为new
:90s/old/new/g 将指定行的所有字符串old替换为new
:90,93s/old/new/g 9093行的所有字符串old替换为new
:%s/old/new/g 将文本中所有的字符串old替换为new
:%s/old/new/gc 依次替换每个字符串关键字
:%s/^struct/int/g 将所有以struct开头的字符串替换为int

修改的撤销、重做和保存

操作 描述
u 撤销上一步的操作
Ctrl+r 将原来的插销重做一遍
U 恢复一整行原来的面貌(文件打开时的文本状态)
q 若文件没有修改,直接退出
q! 文件已经被修改,放弃修改退出
wq 文件已经被修改,保存修改并退出
e! 放弃修改,重新回到文件打开时的状态

编辑多个文件

  1. 文件是保存在磁盘上的,而打开的文件的文件是在内存中
  2. 在内存中有一个缓冲区,用来存放打开的文件
  3. vim 每次打开文件时都会创建一个缓冲区,vim 支持打开多个文件
操作 描述
:buffers` 查看缓冲区列表==ls
:buffer N` 根据缓冲区列表的编号跳转到指定缓冲区
:bnext/bprev` 遍历缓冲区列表
:bfirst/blast` 分别调到缓冲区列表的开头和结尾
:write` 将缓冲区的修改保存到磁盘上
:edit! e!` 放弃缓冲区的修改,恢复到文件打开时的状态
:edit file` 编辑另一个文件
:wnext` 保存当前缓冲区的修改并跳转到缓冲区列表中的下一个文件

:set autowrite

标签页与折叠栏

标签页的新建:tabedit file/tab split

标签页的切换: tabn/tabp 按键:gt/gT

标签页的关闭: tabclose 关闭当前的标签页,:tabonly

zf200G: 将光标和 200 行之间的代码折叠起来

  1. za: 打开和关闭折叠
  2. zr/zm: 一层一层地打开和关闭折叠
  3. zR/zM: 分别打开和关闭所有的折叠
  1. zj: 跳转到下一个折叠处
  2. zk: 跳转到上一个折叠处
  1. zd: 删除光标下的折叠
  2. zD: 删除光标下的折叠以及嵌套的折叠
  3. zE: 删除所有的折叠标签

创建的折叠当退出 vim 之后就失效了。

多窗口操作

split/vsplit filename

ctrl+w hjkl ctrl+w w

ctrl+w HJKL

  1. ctrl+w +/- 调整窗口的高度
  2. ctrl+w </> 调整窗口的宽度
  3. ctrl+w = 所有的窗口设置相同的尺寸
  4. :resize n 将当前窗口尺寸调整为 N 行
  1. close: 关闭一个窗口
  2. qall: 退出所有窗口
  3. qall!: 放弃修改,退出所有窗口
  4. wqall: 保存并退出所有窗口
  5. wall: 保存所有窗口