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)

举例

shell 复制代码
# 删除一个段落: 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 中,完成一个操作可能有许多不同的方式,建议记住一个最简单的,不然脑子真的记不住 😅

复制当前行并粘贴

shell 复制代码
yy -- 复制光标所在行
p -- 粘贴到光标后面

使用上一个命令

vim 中可以使用 .符号,重复执行上一个命令

例如:我们使用了 p命令粘贴,此时我们一直 .就可以一直粘贴

撤销上一个操作

当我们发现粘贴多了,想取消上一次操作怎么办

u

最常用的跳转命令

  • w:跳到下一个单词的开头
  • e:跳到当前或下一个单词的结尾
  • b:跳到当前或上一个单词的开头
  • 0:跳到当前行的开头
  • $:跳到当前行的末尾
  • gg:跳到文档的开头
  • G:跳到文档的结尾

查找对应的字符

shell 复制代码
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 代码后面都加上 ;

javascript 复制代码
let foo = 1;
let bar = 2;
let foobar = foo + bar;
  • Ctrl + v进入可视模式
  • jj向下选中
  • $向尾部选中
  • A尾部插入
  • 输入 ;

剪切一整个代码块

举例:想将下面的代码块剪切下来

python 复制代码
@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 进入行可视模式
  • 使用 jk 扩展选择,直到选择完整个代码块
  • d 剪切所选的代码块

命令行模式实战技巧

打开文件

:e {filename}打开文件

复制和移动内容

  • :6t.将第六行复制到当前行下面
  • :2m.将第二行移动到当前行下面

复制当前文件

:w newfile

全局替换内容

:%s/content_old/content_new/g

将 content_old 替换为 content_new

手动替换想要替换的内容

假设你想批量替换 contentcopy

你可以使用 :%s/content/copy/g命令,但是这样会全部处理 content内容,我们像自定义要不要替换当前 content

使用 *符号

  1. 光标移动到文本 content
  2. 输入 *,此时会选中所有 content
  3. 输入 cw命令,会删除 content并进入输入模式
  4. 输入 copy退出
  5. n进入下一个 content
  6. .重复操作

总结

通过实战和理解上面的命令,你应该能够解决在 Vim 中遇到的大部分常见场景。我使用 VSCode 和 Vim 插件,解决了一些 Vim 中较为复杂的命令,比如代码格式化和保存等问题。

虽然我才刚从 JetBrains 全家桶迁移到 VSCode + 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:替换文档中的所有 oldnew
  • :s/old/new/g:替换当前行中的所有 oldnew

其他常用命令

  • ::进入命令行模式,可以执行如保存、退出等命令
  • 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,不保存更改
  • :wqZZ:保存并退出文件
  • :x:保存并退出文件(与 :wq 类似,但只有在有修改时才会保存)
  • :e!:重新加载当前文件,丢弃所有未保存的更改
  • :sp:split:水平分割当前窗口并打开一个新文件
  • :vsp:vsplit:垂直分割当前窗口并打开一个新文件
  • :close:关闭当前窗口
  • :only:关闭所有其他窗口,保留当前窗口

搜索与替换

  • :/pattern:在文件中向下搜索 pattern
  • :?pattern:在文件中向上搜索 pattern
  • n:跳到下一个匹配项
  • N:跳到上一个匹配项
  • :%s/old/new/g:在整个文件中替换 oldnew,并替换所有匹配项
  • :s/old/new/g:在当前行替换 oldnew,替换所有匹配项
  • :%s/old/new/gc:在整个文件中替换 oldnew,并在每个替换项时询问确认
  • :s/old/new/c:在当前行替换 oldnew,并询问是否替换

撤销与重做

  • :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 替换所有窗口中的 foobar
  • :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-fCtrl-b:在命令历史中向前和向后浏览

系统命令

  • :!command:执行外部系统命令(例如,:!ls 列出当前目录文件)
  • :sh:进入 shell 环境,在 Vim 中执行 shell 命令
  • :w !sudo tee %:使用 sudo 保存文件(常用于权限不足时保存文件)

退出 Vim

  • :qa:quitall:退出所有打开的文件
  • :qa!:强制退出所有文件,不保存任何更改

参考链接

相关推荐
獨枭1 分钟前
Linux 一键配置 Vim 为开发利器
linux·运维·vim
溯源0067 小时前
vscode调试python(transformers库的llama为例)
vscode·python·llama
Eiceblue10 小时前
Python 在Word中查找并替换文本
vscode·python·word·pip
myloveasuka13 小时前
[Linux]在vim中批量注释与批量取消注释
linux·vim
落淼喵_G13 小时前
【windows搭建lvgl模拟环境(一)之VSCode】
ide·windows·vscode
爱趣五科技15 小时前
H5DS编辑器教程——H5页面触发动画实战指南
编辑器
小猪皮蛋粥16 小时前
VScode配置默认终端为Anaconda Prompt
ide·vscode·prompt
正宗咸豆花16 小时前
利用 VSCode 配置提升 vibe coding 开发效率
ide·vscode·编辑器
徐子竣16 小时前
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
unity·编辑器·游戏引擎
徐子竣18 小时前
Unity编辑器功能及拓展(1) —特殊的Editor文件夹
unity·编辑器·游戏引擎