导航
- 简介
- Vim 的来历
- Vim 语言
- Vim 的三种模式
- Normal(普通模式)
- Insert(插入模式)
- Visual(可视模式)
- 三种模式转换
- 普通模式实用技巧
- 说明
- 复制当前行并粘贴
- 使用上一个命令
- 撤销上一个操作
- 最常用的跳转命令
- 查找对应的字符
- 向下查找多字符
- 向上查找多字符
- 常用删除命令
- 设置标记
- 插入模式实战技巧
- 插入模式多种删除命令
- 替换模式
- 可视模式实战技巧
- 在长短不一的高亮块后添加文本
- 剪切一整个代码块
- 命令行模式实战技巧
- 打开文件
- 复制和移动内容
- 复制当前文件
- 全局替换内容
- 手动替换想要替换的内容
- 总结
- 普通模式的常用命令
- 光标移动命令
- 删除命令
- 复制与粘贴命令
- 替换命令
- 查找与替换命令
- 其他常用命令
- 插入模式常用命令
- 进入插入模式的常用方式
- 插入模式下的常用操作
- 退出插入模式
- 其他插入模式命令
- 可视模式常用命令
- 进入可视模式
- 选择范围
- 剪切和复制
- 粘贴
- 替换和删除
- 其他操作
- 退出可视模式
- 命令行模式常用命令
- 文件操作
- 搜索与替换
- 撤销与重做
- 查找与跳转
- 窗口管理
- 缓冲区与标签
- 宏与寄存器
- 交互式命令与历史
- 系统命令
- 退出 Vim
- 参考链接
简介
Vim 的来历
Vim 是一个高度可定制的文本编辑器,其名字来源于 Vi IMproved,即 Vi(改进版)
Bram Moolenaar(布拉姆·穆伦纳尔)于 1991 年开发,目的是为了增强和扩展 Vi 编辑器
Vim 语言
动词
动词代表了我们打算对文本进行什么样的操作。例如:
d
表示删除(delete)r
表示替换(replace)c
表示修改(change)y
表示复制(yank)v
表示选取(visual select)
名词
名词代表了我们即将处理的文本。Vim 中有一个专门的术语叫做文本对象,下面是一些文本对象的示例:
w
表示一个单词(word)s
表示一个句子(sentence)p
表示一个段落(paragraph)
介词
介词界定了待编辑文本的范围或者位置。例如:
i
表示“在…之内”(inside)a
表示“环绕…”(around)t
表示“到…位置前”(to)f
表示“到…位置上”(forward)
举例
# 删除一个段落: delete inside paragraph
dip# 选取一个句子: visual select inside sentence
vis# 修改一个单词: change inside word
ciw# 修改一个单词: change around word
caw# 删除文本直到字符“x”(不包括字符“x”): delete to x
dtx# 删除文本直到字符“x”(包括字符“x”): delete forward x
dfx
Vim 的三种模式
Normal(普通模式)
vim 的核心模式,vim 的大部分操作也都是在这个模式下使用的, 主要用于导航、编辑、复制粘贴、查找替换等操作
Insert(插入模式)
主要用于输入和编辑文本
Visual(可视模式)
选中一段文本并对其执行相关操作
三种模式转换
注意:你只能从普通模式到插入模式,或者从普通模式到可视模式,而无法从插入模式直接转到可视模式,反过来也是这样(所以你明白为什么普通模式是核心模式了嘛)
从常规模式到插入模式
按键 | 作用 |
---|---|
i | 在 光标前 进入插入模式 |
a | 在 光标后 进入插入模式 |
I | 在 当前行首(非空字符前) 进入插入模式 |
A | 在 当前行尾 进入插入模式 |
o | 在 当前行下方 插入新行,并进入插入模式 |
O | 在 当前行上方 插入新行,并进入插入模式 |
从插入模式到常规模式
Esc
:很难按到,建议不要使用
Ctrl + [
:建议使用
Ctrl + c
从常规模式到可视模式
v
: 进入字符可视模式,逐字符选择
V
:进入行可视模式,整行选择
Ctrl + v
: 进入块可视模式,矩形区域选择
从可视模式到常规模式
Esc
普通模式实用技巧
说明
vim 中,完成一个操作可能有许多不同的方式,建议记住一个最简单的,不然脑子真的记不住 😅
复制当前行并粘贴
yy -- 复制光标所在行
p -- 粘贴到光标后面
使用上一个命令
vim 中可以使用 .
符号,重复执行上一个命令
例如:我们使用了 p
命令粘贴,此时我们一直 .
就可以一直粘贴
撤销上一个操作
当我们发现粘贴多了,想取消上一次操作怎么办
按 u
最常用的跳转命令
w
:跳到下一个单词的开头e
:跳到当前或下一个单词的结尾b
:跳到当前或上一个单词的开头0
:跳到当前行的开头$
:跳到当前行的末尾gg
:跳到文档的开头G
:跳到文档的结尾
查找对应的字符
hello world!
- 我们想查找
o
字符 - 光标移动到这一行上
- 输入
f{char}
即fo
- 此时光标就在第一个
o
上了 - 按
;
查找下一个o
- 按
,
返回上一个o
向下查找多字符
/{chars}
n
下一个N
上一个
向上查找多字符
?{chars}
n
上一个N
下一个
常用删除命令
x
:删除当前光标所在的字符dd
:删除当前行
别再记别的了 😂
设置标记
mA
当前光标位置设置一个标记,名字叫A
'A
跳到A
标记处:marks
查看所有标记:delmarks!
删除所有标记
可用于快速跳转
插入模式实战技巧
插入模式多种删除命令
delete
向后删除
Ctrl + h
/ Back
向前删除
Ctrl + w
删除前一个单词
Ctrl + u
删到行首
不建议再记别的,先使用着
替换模式
R
进入
可视模式实战技巧
在长短不一的高亮块后添加文本
举例:想让下面的 javascript 代码后面都加上 ;
let foo = 1;
let bar = 2;
let foobar = foo + bar;
Ctrl + v
进入可视模式jj
向下选中$
向尾部选中A
尾部插入- 输入
;
剪切一整个代码块
举例:想将下面的代码块剪切下来
@router.post("/login/access-token")
def login_access_token(session: SessionDep, form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
) -> Token:"""OAuth2 兼容的令牌登录,获取访问令牌以供后续请求使用"""user = user_crud.authenticate(session=session, user_account=form_data.username, password=form_data.password)if not user:raise HTTPException(status_code=400, detail="Incorrect email or password")elif not user.is_active:raise HTTPException(status_code=400, detail="Inactive user")access_token_expires = timedelta(minutes=60 * 60 * 24)return Token(access_token=create_access_token(user.id, expires_delta=access_token_expires))
- 将光标放在代码块的起始位置
- 按
V
进入行可视模式 - 使用
j
或k
扩展选择,直到选择完整个代码块 - 按
d
剪切所选的代码块
命令行模式实战技巧
打开文件
:e {filename}
打开文件
复制和移动内容
:6t.
将第六行复制到当前行下面:2m.
将第二行移动到当前行下面
复制当前文件
:w newfile
全局替换内容
:%s/content_old/content_new/g
将 content_old 替换为 content_new
手动替换想要替换的内容
假设你想批量替换 content
为 copy
你可以使用 :%s/content/copy/g
命令,但是这样会全部处理 content
内容,我们像自定义要不要替换当前 content
使用 *
符号
- 光标移动到文本
content
上 - 输入
*
,此时会选中所有content
- 输入
cw
命令,会删除content
并进入输入模式 - 输入
copy
退出 - 按
n
进入下一个content
- 按
.
重复操作
总结
通过实战和理解上面的命令,你应该能够解决在 Vim 中遇到的大部分常见场景。我使用 VSCode 和 Vim 插件,解决了一些 Vim 中较为复杂的命令,比如代码格式化和保存等问题。
虽然我才刚从 JetBrains 全家桶迁移到 VSCode + Vim 编写代码的第三天,但我已经能够想象使用 Vim 快捷操作行云流水写代码的场景了 😅 (一种远古程序员的魅力 👻)
熟能生巧,坚持下去吧~
如果你想进一步了解 Vim,以下是一些有用的资料
- Vim 中文文档
- 也可以参考下面的常用 Vim 命令总结
普通模式的常用命令
建议不要看 😅 用到再查,注重实战!
光标移动命令
h
:光标向左移动一个字符j
:光标向下移动一行k
:光标向上移动一行l
:光标向右移动一个字符w
:跳到下一个单词的开头e
:跳到当前或下一个单词的结尾b
:跳到当前或上一个单词的开头0
:跳到当前行的开头$
:跳到当前行的末尾gg
:跳到文档的开头G
:跳到文档的结尾H
:将屏幕顶部行与光标对齐M
:将屏幕中间行与光标对齐L
:将屏幕底部行与光标对齐Ctrl-f
:向下滚动一页Ctrl-b
:向上滚动一页Ctrl-d
:向下滚动半页Ctrl-u
:向上滚动半页
删除命令
x
:删除当前光标所在的字符dd
:删除当前行d$
:删除从当前光标到行尾的内容d0
:删除从当前光标到行首的内容dw
:删除当前光标所在的单词dG
:删除从当前光标到文档结尾的内容dgg
:删除从当前光标到文档开头的内容
复制与粘贴命令
y
:复制选中的文本(需要先进入可视模式)yy
:复制当前行yw
:复制当前单词y$
:复制从光标到行尾的内容p
:将复制的内容粘贴到光标后P
:将复制的内容粘贴到光标前
替换命令
r<char>
:将当前字符替换为指定字符R
:进入替换模式,连续替换字符直到按Esc
u
:撤销上一个操作Ctrl-r
:重做撤销的操作.
:重复上一个命令(如重复删除、复制等)
查找与替换命令
/pattern
:查找指定的pattern
(模式)?pattern
:向上查找指定的pattern
n
:跳转到下一个匹配的查找结果N
:跳转到上一个匹配的查找结果:%s/old/new/g
:替换文档中的所有old
为new
:s/old/new/g
:替换当前行中的所有old
为new
其他常用命令
:
:进入命令行模式,可以执行如保存、退出等命令q
:退出 Vim:w
:保存文件:q
:退出文件:wq
:保存并退出文件:x
:保存并退出文件(与:wq
类似):e filename
:打开另一个文件:sp
:水平分屏:vsp
:垂直分屏:tabnew
:打开新标签页
插入模式常用命令
进入插入模式的常用方式
i
:在 光标前 进入插入模式a
:在 光标后 进入插入模式I
:在 当前行首 进入插入模式(非空字符前)A
:在 当前行尾 进入插入模式o
:在 当前行下方 插入新行并进入插入模式O
:在 当前行上方 插入新行并进入插入模式
插入模式下的常用操作
删除字符:
Backspace
:删除光标前的字符Ctrl-w
:删除光标前的一个单词
撤销和重做:
Ctrl-z
:撤销上一步操作Ctrl-r
:重做撤销的操作
跳转到行首和行尾:
Ctrl-a
:将光标移到当前行的 开头Ctrl-e
:将光标移到当前行的 末尾
光标控制:
Ctrl-f
:向前移动一屏(相当于滚动一页)Ctrl-b
:向后移动一屏Ctrl-d
:向下滚动半页Ctrl-u
:向上滚动半页
退出插入模式
Esc
:退出插入模式,返回 普通模式
其他插入模式命令
Ctrl-h
:删除光标前的字符(类似 Backspace)Ctrl-t
:在当前光标位置插入一个制表符(Tab)Ctrl-k
:删除光标后到下一个空白字符的内容(删除单词)
可视模式常用命令
进入可视模式
v
:进入 字符可视模式,可以选择一个字符并通过移动光标来扩展选择区域V
:进入 行可视模式,可以选择整个行并通过上下移动光标来扩展选择区域Ctrl-v
:进入 块可视模式,可以选择一个矩形区域的文本块,用于按列选择文本
选择范围
j
/k
:在可视模式下,按j
向下选择一行,按k
向上选择一行h
/l
:在可视模式下,按h
向左选择,按l
向右选择w
:按单词选择,跳到下一个单词并选中b
:按单词边界选择,跳到上一个单词并选中0
:将光标移动到行首,并开始选择$
:将光标移动到行尾,并开始选择
剪切和复制
d
:剪切选中的内容并将其存入寄存器(类似删除)y
:复制选中的内容并将其存入寄存器(类似复制)
粘贴
p
:将剪切或复制的内容粘贴到光标 后面P
:将剪切或复制的内容粘贴到光标 前面
替换和删除
r
:替换当前选择的字符。例如,按r
后跟一个字符,会将选中的字符替换为该字符D
:删除当前选中的文本直到行尾(相当于d$
)C
:删除当前选中的文本并进入插入模式(相当于d
然后进入插入模式)
其他操作
>
:将选中的文本缩进一个层级<
:将选中的文本取消缩进一个层级=
:自动调整选中文本的缩进
退出可视模式
Esc
:退出可视模式,返回到普通模式
命令行模式常用命令
文件操作
:w
:保存当前文件:w filename
:将当前文件保存为指定的文件名:e filename
:打开指定的文件:q
:退出 Vim(如果没有未保存的更改):q!
:强制退出 Vim,不保存更改:wq
或ZZ
:保存并退出文件:x
:保存并退出文件(与:wq
类似,但只有在有修改时才会保存):e!
:重新加载当前文件,丢弃所有未保存的更改:sp
或:split
:水平分割当前窗口并打开一个新文件:vsp
或:vsplit
:垂直分割当前窗口并打开一个新文件:close
:关闭当前窗口:only
:关闭所有其他窗口,保留当前窗口
搜索与替换
:/pattern
:在文件中向下搜索pattern
:?pattern
:在文件中向上搜索pattern
n
:跳到下一个匹配项N
:跳到上一个匹配项:%s/old/new/g
:在整个文件中替换old
为new
,并替换所有匹配项:s/old/new/g
:在当前行替换old
为new
,替换所有匹配项:%s/old/new/gc
:在整个文件中替换old
为new
,并在每个替换项时询问确认:s/old/new/c
:在当前行替换old
为new
,并询问是否替换
撤销与重做
:undo
:撤销上一步操作:redo
:重做上一步撤销的操作:earlier
:回到更早的编辑状态,可以指定时间(例如::earlier 10m
返回 10 分钟前的状态):later
:恢复到更晚的编辑状态
查找与跳转
:find filename
:查找并打开指定文件:locate pattern
:查找文件系统中的文件(需要配置支持locate
的环境)。:tags
:查看标签文件:tag tagname
:跳转到指定标签的位置(通常与代码导航相关):grep pattern
:在多个文件中搜索pattern
(依赖于系统中的grep
命令)
窗口管理
:windo command
:在所有窗口中执行命令(例如,:windo %s/foo/bar/g
替换所有窗口中的foo
为bar
):resize
:调整当前窗口的大小:vertical resize
:调整垂直分割窗口的大小
缓冲区与标签
:ls
或:buffers
:列出当前打开的所有缓冲区:b buffer_number
:切换到指定的缓冲区:bnext
或:bn
:切换到下一个缓冲区:bprev
或:bp
:切换到上一个缓冲区:bdelete
或:bd
:删除当前缓冲区
宏与寄存器
q{register}
:开始录制宏,{register}
是你选择的寄存器(例如:qa
录制到寄存器a
)q
:停止录制宏@{register}
:执行宏,例如@a
执行寄存器a
中的宏@@
:重复上一次执行的宏
交互式命令与历史
:
:按:
进入命令行模式:history
:查看命令历史q:
:打开命令历史窗口,你可以选择并运行历史命令Ctrl-f
和Ctrl-b
:在命令历史中向前和向后浏览
系统命令
:!command
:执行外部系统命令(例如,:!ls
列出当前目录文件):sh
:进入 shell 环境,在 Vim 中执行 shell 命令:w !sudo tee %
:使用sudo
保存文件(常用于权限不足时保存文件)
退出 Vim
:qa
或:quitall
:退出所有打开的文件:qa!
:强制退出所有文件,不保存任何更改
参考链接
- 一起来说 Vim 语