loading...
Featured image of post Vim编辑器完全使用教程

Vim编辑器完全使用教程

你应该放下一切,立刻学习宇宙第一编辑器Vim😎

VIM使用方式

vim键盘图

img

vim操作文件基本方式

打开文件

  • 单个文件

    vim file1
    
  • 多个文件

    vim file1 file2 ... filen
    

    该方式打开文件,显示屏默认显示第一个文件也就是 file1

文件之间的切换

  • :ls – 列出 VIM 打开的所有文件
image-20250309200724231
  • :bn – 显示屏上显示第n个文件
image-20250309200823642

显示多个文件

  • 左右分屏

    vim -On file1 file2 ... filen
    

    这里的 n 是代表有几个文件需要分屏,从左至右依次显示 n 个文件

    image-20250309201414346
  • 上下分屏

    vim -on file1 file2 ... filen
    

    跟上一个命令不同的是 -on 中的 o 是小写,这样将会上下依次显示 n 个文件

    image-20250309201606096

分屏操作(ctrl+w系列)

左右分屏

  • Ctrl+w+s – 上下分割当前打开的文件
  • :sp file – 上下分割当前文件和新打开的 file

上下分屏

  • Ctrl+w+v – 左右分割当前打开的文件
  • :vsp file – 左右分割当前文件和新打开的 file

移动分屏

大写字母

  • Ctrl+w+H – 将当前的分屏移动到左边
  • Ctrl+w+L – 将当前的分屏移动到右边
  • Ctrl+w+J – 将当前的分屏移动到上边
  • Ctrl+w+K – 将当前的分屏移动到下边

在文件间切换光标

小写字母

  • Ctrl+w+h – 将当前光标定位到左边的屏幕
  • Ctrl+w+l – 将当前光标定位到左边的屏幕
  • Ctrl+w+j – 将当前光标定位到左边的屏幕
  • Ctrl+w+k – 将当前光标定位到左边的屏幕

关闭分屏

  • Ctrl+w+c – 关闭当前的分屏(多个分屏就只关闭光标所在的分屏)
  • Ctrl+w+q – 关闭当前的分屏,如果是最后一个分屏将会退出 VIM

vim五大模式

普通模式

用户刚刚启动 vi/vim,便进入了普通模式

此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符

普通模式移动光标

  • 快速移动光标

    输入[数字n+方向],代表向某个方向移动n

    • h / ← / [backspace]:向左移动光标
    • j / ↓:向下移动光标
    • k / ↑:向上移动光标
    • l / → / [space]:向右移动光标
  • 在当前行上移动光标

    • 0 或功能键[Home] – 移动到行头
    • ^ – 移动到本行的第一个不是 blank 字符
    • $ 或功能键[End] – 移动到行尾
    • g_ – 移动到本行最后一个不是 blank 字符的位置
    • w – 光标移动到下一个单词的开头
    • e – 光标移动到下一个单词的结尾
    • fa – 移动到本行下一个为 a 的字符处
    • nfa – 移动到本行光标处开始的第 n 个 字符为 a 的地方
    • Fa – 同fa一样,光标移动方向同fa相反
    • nFa – 同 nfa 类似,光标移动方向同 nfa相反
    • ta – 移动光标至 a 字符的前一个字符
    • nta – 移动到第n个 a 字符的前一个字符处
    • Ta – 同ta移动光标方向相反
    • nTa – 同 nta 移动光标方向相反
    • ; & , – 当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用**;可以快速跳转到下一个指定的字符,,** 是跳到前一个指定的字符
  • 跨行移动光标

    • nG – 光标定位到第 n 行的行首
    • gg – 光标定位到第一行的行首
    • G – 光标定位到最后一行的行首
    • H – 光标定位到当前屏幕的第一行行首
    • M – 光标移动到当前屏幕的中间
    • L – 光标移动到当前屏幕的尾部
    • zt – 把当前行移动到当前屏幕的最上方,也就是第一行
    • zz – 把当前行移动到当前屏幕的中间
    • zb – 把当前行移动到当前屏幕的尾部
    • % – 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上
    • * & # – 匹配光标当前所在的单词, ***** 是下一个,# 是上一个
  • 翻页操作

    • ctrl+u – 向滚动
    • ctrl+b – 向滚动
    • ctrl+d – 向滚动
    • ctrl+f – 向滚动

普通模式操作文本

  • 删除

    d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:

    • dw – 删除一个单词
    • dnw – 删除 n 个单词,
    • dfa – 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
    • dnfa – 删除光标处到第 n 个 a 的字符处
    • dd – 删除一整行
    • ndd – 删除光标处开始的 n 行
    • d$ – 删除光标到本行的结尾
    • d0 – 删除游标所在处到该行的最前面一个字符
    • dH – 删除屏幕显示的第一行文本到光标所在的行
    • d1G – 删除光标所在到第一行的所有数据
    • dG – 删除光标所在到最后一行的所有数据
    • x – 删除光标当前所在的字符**(delete)**
    • X – 删除光标前面的一个字符**(backspace)**
    • nx – 向后连续删除n个字符
  • 复制

    y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:

    • yw – 复制一个单词,还有ynw
    • yfa – 复制光标到下一个 a 的字符处,还有ynfa
    • yy – 复制一行,还有nyy
    • y$ – 复制光标到本号的结尾
    • yH – 复制屏幕显示的第一行文本到光标所在的行
    • y1G – 复制光标所在行到第一行的所有数据
    • yG – 复制光标所在行到最后一行的所有数据
  • 粘贴

    p是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来

    • p(小写) – 在光标后开始黏贴

    • P(大写) – 在光标前开始粘贴

  • 撤销操作和恢复

    • u – 撤销刚才的操作
    • ctrl+r – 恢复撤销操作
  • 大小写转换

    • ~ – 将光标下的字母改变大小写
    • 3~ – 将光标位置开始的3个字母改变其大小写
    • g~~ – 改变当前行字母的大小写
    • gUU – 将当前行的字母改成大写
    • guu – 将当前行的字母全改成小写
    • 3gUU – 将从光标开始到下面3行字母改成大写
    • gUw – 将光标下的单词改成大写
    • guw – 将光标下的单词改成小写
  • 重复操作

    • . – 重复上一个操作的命令
    • n<command> – 重复某个命令 n 次,如 10p复制 10 次,10dd 删除十次
  • 其他

    • J – 将光标所在行与下一行的数据结合成同一行
    • c – 重复删除多个数据,例如向下删除 10 行,10cj

插入模式

进入插入模式

命令 说明
i, I i – 从目前光标所在处输入
I – 在目前所在行的第一个非空格符处开始输入
a, A a – 从目前光标所在的下一个字符处开始输入
A – 从光标所在行的最后一个字符处开始输入
o, O o – 在目前光标所在的下一行处输入新的一行
O – 在目前光标所在的上一行处输入新的一行
s,S s – 删除光标所在处的字符然后插入需要录入的文本
S – 删除光标所在行,在当前行的行首开始插入需要录入的文本
cw 删除从光标处开始到该单词结束的所有字符,然后插入需要录入的文本

插入模式的命令

必须知道的:#是vim中的注释符号

在输入模式中,可以使用以下按键:

  • 字符按键以及Shift组合,输入字符
  • ENTER,回车键,换行
  • BACK SPACE,退格键,删除光标前一个字符
  • DEL,删除键,删除光标后一个字符
  • 方向键,在文本中移动光标
  • HOME/END,移动光标到行首/行尾
  • Page Up/Page Down,上/下翻页
  • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
  • ESC退出输入模式,切换到命令模式

替换模式

进入替换模式

  • R – 进入替换模式,此时新输入的文本将直接替代/覆盖已经存在的内容,点击ESC键返回常规模式

  • r – 进入单字符替换模式,此时新输入的字符将替代光标之下的当前字符,然后自动返回到常规模式

  • gR – 进入虚拟替换模式,其与替换模式最主要的区别在于,对<Tab>键和换行符的不同处理方式

  • gr – 进入单字符虚拟替换模式,在替换光标下的当前字符之后,将自动返回到常规模式

虚拟替换模式

  • <Tab>键

    替换模式(REPLACE)下,在原有<Tab>键处输入字母’a’,将直接替代<Tab>键所占用的所有空格的位置

    虚拟替换模式(VREPLACE)下,在原有<Tab>键处输入字母’a’,将仅仅替代单个空格

  • <NL>换行

    替换模式(REPLACE)下,输入<Enter>回车键将增加新行

    虚拟替换模式(VREPLACE)下,输入<Enter>回车键将用新行替代当前行内容(即清空当前行):

命令模式

在命令模式下按下 :(英文冒号)就进入了底线命令模式

有的命令要输入 / 执行

命令模式常用命令

  • :w – 保存文件
  • :q – 退出 Vim 编辑器
  • :wq – 保存文件并退出 Vim 编辑器
  • :q! – 强制退出Vim编辑器,不保存修改
  • :set nu – 显示行号
  • :set nonu – 取消行号
  • :n – 定位到第n行
  • :n1,n2d – 删除行号n1至n2之间的内容(n1和n2都代表数字)

按 ESC 键可随时退出底线命令模式

命令模式处理文件

  • :w [filename] – 将编辑的数据储存成另一个文件(类似另存新档)
  • :r [filename] – 在编辑的数据中,读入另一个档案的数据,即将filenam的内容加到光标所在行后面
  • :n1,n2 w [filename] – 将 n1 到 n2 的内容储存成 filename

命令模式搜索文本

  • ?{目标字符串} – 向光标之寻找一个目标字符串
  • /{目标字符串} – 向光标之寻找一个目标字符串
  • n – 重复前一个搜寻的动作
  • N反向进行前一个搜寻动作
  • :set ic – 编辑器将不会区分大小写
  • :set noic – 编辑器将区分大小写

命令模式替换文本

格式::(作用范围)s/{目标}/{替换}(/替换的标志)

  • 替换的作用范围

    标志 作用
    s 当前行替换
    %s 全文替换
    n1,n2s 指定行替换,替换n1到n2间所有行的目标,n2可以是$,代指最后一行
    ’<,’>s 指定区域替换
  • 替换的标志

    标志 作用
    [无] 只替换作用范围内,每行第一次出现的目标
    g 一次性替换所有作用范围内所有的目标
    i 大小写不敏感查找
    I 大小写敏感查找
    c 对作用范围内的目标逐个替换,替换前需进行确认

    替换标志可以使用多个,比如/gic

命令模式执行linux命令

  • :![command]

    打开终端窗口并打印执行命令的结果,不会改变当前编辑的文件的内容

    可以使用:!bash打开bash shell并执行命令

    :!date		//执行 date 命令显示时间,执行完命令以后按下键盘上的 Enter 就会返回到文件
    
  • :r ![command]

    将shell命令command的结果插入到当前行的下一行

    :r !date		//读取系统时间并插入到当前行的下一行
    
  • n1,n2 ![command]

    将n1至n2行范围内的内容交给命令command处理,并将处理结果替换起始行号和结束行号指定范围中的内容

    :1,4 !sort		//将第1行到第4行的内容进行排序
    

    可以只指定起始行

    :1 !tr [a-z] [A-Z]		//将第1行的小写字母转为大写字母
    

    可以用.表示当前光标所在行 (输入!!会变成:.!)

    :. !tr [a-z] [A-Z]		//将当前行的小写转为大写
    
  • n1,n2 w ![command]

    将起始行号和结束行号所指定范围的内容作为命令command的输入,不会改变当前编辑的文件的内容

    可以使用:1 w !bash,将会把第1行的内容作为bash命令来执行并显示结果,而且不会改变当前编辑的文件的内容

    同样的 : . w !bash将当前行的内容作为bash命令来执行

  • !!

    重新执行最近一次运行过的命令

  • :shell / :terminal

    打开命令终端(输入exit结束并返回vim)

    使用:version命令(按q退出),查看是否包含+terminal关键字,以确认是否能使用 :terminal

命令模式定义快捷键

  • 基本格式

    模式 基本格式 描述
    普通模式 :nmap <key> <command> 仅在普通模式下有效,定义普通模式下的快捷键
    插入模式 :imap <key> <command> 用于定义插入模式下的快捷键
    可视模式 :vmap <key> <command> 用于定义可视模式下的快捷键
    命令行模式 :cmap <key> <command> 用于定义命令行模式下的快捷键
    总体映射 :map <key> <command> 定义快捷键,适用于普通、可视、操作和选择模式,但不建议用于有冲突的情况。
    总体不可递归映射 :noremap <key> <command> 类似:map,但是不会递归地扩展已经存在的映射,避免意外行为。
    普通模式不可递归 :nnoremap <key> <command> 在普通模式下使用,避免递归映射
    插入模式不可递归 :inoremap <key> <command> 在插入模式下使用,避免递归映射
    可视模式不可递归 :vnoremap <key> <command> 在可视模式下使用,避免递归映射
    缩写 :ab [缩写] [完整文本] 输入缩写后空格,自动扩展为完整文本。例如::ab email xxxx@gmail.com

    什么是<key>?

    <key> 对应的是 ^[A-Z] , 定义快捷键时使用ctrl+v+[a-z],使用快捷键时用对应的ctrl+[a-z]

    什么是递归映射?

    :nmap j gg
    :nmap Q j
    

    如果已经做了以上映射,那么按下Q,执行的将是gg而不是j

    为了避免以上问题,应该这样定义:

    :nnoremap j gg
    :nnoremap Q j
    
  • 几个例子

    • :map ^D Ahelloworld<ESC>
      

      在文件的光标所在行的行尾,添加 helloworld 字符串,按住组合键 ctrl + d 就会执行操作

    • :map ^M I#<ESC>
      

      在文件光标处所在行的行首插入#,按住组合键 ctrl + m 就会执行操作

    • :ab email xxxx@gmail.com
      

      输入 email+空格 会把输入的 email 自动替换成 xxxx @gmail.com

可视化模式

进入可视化模式

可视化模式可以分为以下三种:

  • v字符可视化模式,文本选择是以字符为单位的
  • V行可视化模式,文本选择是以行为单位的
  • ctrl-V块可视化模式,可以选择一个矩形内的文本

在任意可视化模式下使用以上命令,将会切换到对应模式

在任意可视化模式下使用I(大写i),将会切换到插入模式

  • gv – 进入上一次的可视化模式,并选中当时选中的文本**(命令模式也能用此命令)**

按 ESC 键可随时退出可视化模式

可视化模式下移动光标

命令模式下的光标移动方法仍然适用

进入任意可视化模式,移动光标,会从当前位置开始,以相应方式高亮选中字符

  • o – 移动光标到已经选取的文本的结尾处或者开头处(根据现在光标所在位置确定)

    如果是块可视化模式,移动光标到对角处
    
  • O – 在块可视化模式下,移动光标到同一行的结尾处或者开头处

可视化模式下编辑

大部分命令模式对内容操作的命令都能在可视化模式下使用,比如:

  • d – 删除高亮文本

  • D – 删除一整行文本,即使只有一部分被选中了

  • c – 删除高亮文本并进入插入模式

  • y – 复制高亮文本

  • Y – 复制一整行文本

  • p – 黏贴复制的文本

  • ~ – 对高亮文本进行大小写转换

  • > / < – 对高亮文本增加/减少缩进,幅度为一个Tab键

  • r – 输入单个字符,把高亮文本所有字符逐个替换为该字符

vim宏录制

宏录制的录制操作

假设需要将文本的每一行的行首插入入一个 tab 键

  1. 先将光标移动到第一行,在普通模式下按下 q 键(宏录制是 q 键启动的)
  2. 按一个 a (字母随意),表示该宏注册为 a
  3. 按下 I 在行首插入一个 tab 键
  4. 按下ESC退出编辑模式
  5. 按下 j 将光标移动到下一行行首
  6. 按下 q 键完成录制操作(宏录制是 q 键结束的

主要步骤:q(开始)-> a(命名) -> 操作 -> q(结束)

宏录制的使用

  • @a – 执行a宏录制的一系列动作,注意a是录制的操作名称
  • n@a – 执行n次a宏
  • @@ – 重复上一次使用的宏操作

VIM相关案例

vim缓存泄露

vim交换文件

在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容

现在用vim打开文件1.txt,直接关闭终端,再次试图用vim打开1.txt时会出现如下提示:

image-20250311194714710

选择恢复(R),弹出如下提示:

Vim 中,当处理同一个文件发生多次异常退出时,它会依次使用不同的后缀来命名交换文件。按照你给出的模式,首次产生的交换文件名为 .index.php.swp,再次意外退出后产生 .index.php.swo,第三次产生的交换文件为 .index.php.swn

从第四次开始及之后的交换文件,Vim 会循环使用这三个后缀(.swp, .swo, .swn)

例题

在这里插入图片描述

使用以下命令获取网站中的vim文件缓存:

wget http://xxx/.index.php.swp -P /home       //-P指定下载位置

使用vim -r恢复文件并打开:

vim -r .index.php.swp

获取到网站源码后,进行代码审计即可

距离小站第一行代码被置下已经过去
使用 Hugo 构建
主题 StackJimmy 设计
...当然还有kakahuote🤓👆