本文目录 [隐藏]
初入编辑器之神:Vim
Vim
是一款功能强大、高度定制的文本
工具。
Vim安装
- Ubuntu
apt install vim
vi和vim是什么关系?
- vi
可视化接口(visual interface),EX(行文本编辑器)的可视化接口
- vim
vi(VIM - Vi IMproved)的加强版本
- 增加了多级撤销
- 多窗口操作
- 提高了稳定性,减少了崩溃以及崩溃后也可以恢复
- 关键字自动补全以及上下文相关的补全
I. vim工作模式
- 普通模式
vim打开一个文件时的默认模式(命令模式)
- 插入模式
键盘上的i
键盘即进入插入模式,o/a都可以进入插入模式
- 命令行模式
shift+:
即可进入命令行模式
:set nulber # 显示行号
配置文件子/etc/vim/vimrc
或者~/.vimrc
- 可视化模式
键盘上的v进入可视化模式,上下左右移动光标选中文本,可以进行后续的粘贴、删除、复制等操作
- 替换模式
按R
就可以进入到替换模式
II. 光标移动
- 单个字符移动
字符 | 移动方向 |
---|---|
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 | 查看当前的位置状态 |
III. 滚屏与跳转
- 半屏滚动
快捷键 | 方向 |
---|---|
ctrl+u | 向上滚动 |
ctrl+d | 向下滚动 |
- 全屏滚动
快捷键 | 方向 |
---|---|
ctrl+b | 向上滚动 |
ctrl+f | 向下滚动 |
- 定位光标的位置
定位 | 位置 |
---|---|
zz | 将光标置于屏幕的中间 |
zt | 将光标移动到屏幕的顶部 |
zb | 将光标移动到屏幕的底部 |
- 设置跳转标记
标记 | 跳转 |
---|---|
mx | 设置跳转位置 |
`x | 跳转到设置 |
IV. 文本插入操作
按键 | 描述 |
---|---|
i | 在当前光标的前面插入字符 |
a | 在当前光标的后面追加字符 |
o | 在当前光标的下一行行首插入字符 |
I | 在一行的开头添加文本 |
A | 在一行的结尾处添加文本 |
O | 在光标当前行的上一行插入文本 |
s | 删除当前光标处的字符并进入到插入模式 |
S | 删除光标所在处的行,并进入到插入模式 |
u | 撤销修改 |
V. 文本删除
- 字符删除
按键 | 描述 |
---|---|
x | 删除当前光标所在处的字符 |
X | 删除当前光标左边的字符 |
- 单词删除
按键 | 描述 |
---|---|
dw | 删除一个单词(从光标处到空格) |
daw | 删除光标所在的整个单词(包括空白字符) |
diw | 删除整个单词文本,但是保留空格字符不删除 |
d2w | 删除从当前光标开始处的 2 个单词 |
d$ | 删除从光标到一行末尾的整个文本 |
d0 | 删除从光标到一行开头的所有单词 |
dl | 删除当前光标处的字符=x |
dh | 删除当前光标左边的字符=X |
- 行删除
按键 | 描述 |
---|---|
dd | 删除当前光标处的一整行=D |
5dd | 删除从光标开始处的5 行代码 |
dgg | 删除从光标到文本开头 |
dG | 删除从光标到文本结尾 |
- 行合并
按键 | 描述 |
---|---|
J | 删除一个分行符,将当前行与下一行合并 |
VI. 文本复制、剪切与粘贴
按键 | 描述 |
---|---|
y | 复制,p:粘贴 |
yw | 复制一个单词 |
y2w | 复制2 个单词 |
y$ | 复制从当前光标到行结尾的所有单词 |
y0 | 复制从当前光标到行首的所有单词 |
yy | 复制一整行 |
2yy | 复制从当前光标所在行开始的2 行 |
- 复制文本块
- 首先进入
visual
模式:v - 移动光标选择文本
- 复制与粘贴的操作
VII. 文本修改与替换
按键 | 描述 |
---|---|
cw | 删除从光标处到单词结尾的文本并进入到插入模式 |
cb | 删除从光标处到单词开头的文本并进入到插入模式 |
cc | 删除一整行并进入到插入模式 |
~ | 修改光标下字符的大小写 |
r | 替换当前光标下的字符 |
R | 进入到替换模式 |
xp | 交换光标和下一个字符 |
VIII. 组合命令使用
更改 | 删除 | 复制 | 从光标位置到... | |||
---|---|---|---|---|---|---|
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行 |
IX. 文本查找与替换
- 字符串查找
表达式 | 描述 |
---|---|
/string | 正向查找 |
?string | 反向查找 |
- 设置高亮显示
:set hls
*
按键将当前光标处的单词高亮显示- 使用
n
浏览下一个查找高亮的结果
- 字符串替换
操作 | 描述 |
---|---|
:s/old/new | 将当前行的第一个字符串old 替换为new |
:s/old/new/g | 将当前行的所有字符串old 替换为new |
:90s/old/new/g | 将指定行的所有字符串old 替换为new |
:90,93s/old/new/g | 将90 到93 行的所有字符串old 替换为new |
:%s/old/new/g | 将文本中所有的字符串old 替换为new |
:%s/old/new/gc | 依次替换每个字符串关键字 |
:%s/^struct/int/g | 将所有以struct 开头的字符串替换为int |
X. 修改的撤销、重做和保存
操作 | 描述 |
---|---|
u | 撤销上一步的操作 |
Ctrl+r | 将原来的插销重做一遍 |
U | 恢复一整行原来的面貌(文件打开时的文本状态) |
q | 若文件没有修改,直接退出 |
q! | 文件已经被修改,放弃修改退出 |
wq | 文件已经被修改,保存修改并退出 |
e! | 放弃修改,重新回到文件打开时的状态 |
XI. 编辑多个文件
- 文件和缓冲区的区别
- 文件是保存在磁盘上的,而打开的文件的文件是在内存中
- 在内存中有一个缓冲区,用来存放打开的文件
- vim 每次打开文件时都会创建一个缓冲区,vim 支持打开多个文件
操作 | 描述 |
---|---|
:buffers` | 查看缓冲区列表==ls |
:buffer N` | 根据缓冲区列表的编号跳转到指定缓冲区 |
:bnext/bprev` | 遍历缓冲区列表 |
:bfirst/blast` | 分别调到缓冲区列表的开头和结尾 |
:write` | 将缓冲区的修改保存到磁盘上 |
:edit! e!` | 放弃缓冲区的修改,恢复到文件打开时的状态 |
:edit file` | 编辑另一个文件 |
:wnext` | 保存当前缓冲区的修改并跳转到缓冲区列表中的下一个文件 |
:set autowrite
XII. 标签页与折叠栏
标签页的新建:tabedit file/tab split
标签页的切换: tabn/tabp
按键:gt/gT
标签页的关闭: tabclose
关闭当前的标签页,:tabonly
- 创建一个折叠
zf200G: 将光标和 200 行之间的代码折叠起来
- 折叠的打开与关闭
- za: 打开和关闭折叠
- zr/zm: 一层一层地打开和关闭折叠
- zR/zM: 分别打开和关闭所有的折叠
- 折叠键的光标移动
- zj: 跳转到下一个折叠处
- zk: 跳转到上一个折叠处
- 删除折叠
- zd: 删除光标下的折叠
- zD: 删除光标下的折叠以及嵌套的折叠
- zE: 删除所有的折叠标签
创建的折叠当退出 vim 之后就失效了。
XIII. 多窗口操作
- 分割窗口
split/vsplit filename
- 窗口间跳转
ctrl+w hjkl
ctrl+w w
- 移动窗口
ctrl+w HJKL
- 调整窗口尺寸
ctrl+w +/-
调整窗口的高度ctrl+w </>
调整窗口的宽度ctrl+w =
所有的窗口设置相同的尺寸:resize n
将当前窗口尺寸调整为 N 行
- 关闭窗口
close
: 关闭一个窗口qall
: 退出所有窗口qall!
: 放弃修改,退出所有窗口wqall:
保存并退出所有窗口wall:
保存所有窗口