简介
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:进入替换模式,连续替换字符直到按Escu:撤销上一个操作Ctrl-r:重做撤销的操作.:重复上一个命令(如重复删除、复制等)
查找与替换命令
/pattern:查找指定的pattern(模式)?pattern:向上查找指定的patternn:跳转到下一个匹配的查找结果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:在文件中向上搜索patternn:跳到下一个匹配项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!:强制退出所有文件,不保存任何更改