1984 字
10 分钟
Vim 教程
2025-05-01

Vim 的核心模式#

在深入了解快捷键之前,首先需要理解 Vim 的几种核心模式:

  • 命令模式 (Normal Mode): 启动 Vim 后默认进入的模式,此模式下所有按键都会被解释为命令,用于移动光标、删除文本等,但不能直接输入文字。这是 Vim 最主要的模式。
  • 插入模式 (Insert Mode): 在此模式下,您可以像在普通编辑器中一样输入文本。在命令模式下按 i, a, o 等键即可进入。
  • 可视模式 (Visual Mode): 用于选中文本块,类似于用鼠标拖拽选择。选中的文本可以进行复制、删除、替换等操作。 在命令模式下按 v (字符选择), V (行选择), 或 Ctrl+v (块选择) 进入。
  • 命令模式 (Command-line Mode): 以冒号 (:) 开始,用于执行保存、退出、查找替换、执行外部命令等复杂操作。

通过按 Esc 键可以从其他模式切换回命令模式,这是 Vim 操作的基石。

Vim 命令的语法结构#

Vim 的许多命令遵循一种类似”语法”的结构:[operator][count][motion]

  • operator (操作符):d (删除), c (修改), y (复制)。
  • count (次数): 表示重复执行的次数。
  • motion (动作): 定义了操作的范围,如 w (一个单词), $ (到行尾)。 例如:
  • d2w: 删除 (d) 2 个 (2) 单词 (w)。
  • 3dd: 删除3行
  • y5j: 向下复制5行

常用快捷键详解#

以下是 Vim 中常用的一些快捷键,主要在 命令模式 下使用:

光标移动#

  • h: 左移一个字符。
  • j: 下移一行。
  • k: 上移一行。
  • l: 右移一个字符。

单词移动:

  • w: 跳转到下一个单词的开头,按标点或单词分割。(word)
  • W: 跳转到下一个单词的开头,仅以空格分割。
  • b: 跳转到上一个单词的开头。(backward)
  • B: 跳转到上一个单词的开头,仅以空格分割。
  • e: 跳转到当前或下一个单词的结尾。(end of word)
  • E: 跳转到当前或下一个单词的结尾,仅以空格分割。

行内移动:

  • 0: 移动到行首。(第 0 列)
  • ^: 移动到行首的第一个非空白字符。
  • $: 移动到行尾。(正则中’$‘表示最后)
  • f{char}: 移动到当前行下一个出现的 {char} 字符上。(find)
  • F{char}: 移动到当前行上一个出现的 {char} 字符上。(Find)
  • t{char}: 移动到当前行下一个出现的 {char} 字符的前一个字符上。(till)
  • T{char}: 移动到当前行上一个出现的 {char} 字符的前一个字符上。(Till)
  • ;: 重复上一次的移动操作。
  • ,: 反向重复上一次的移动操作。

屏幕移动:

  • gg: 移动到文件的第一行。(gogo)
  • G: 移动到文件的最后一行。(Go)
  • H: 移动到屏幕的顶部。(High)
  • M: 移动到屏幕的中间。(Middle)
  • L: 移动到屏幕的底部。(Low)
  • zz: 将当前行置于屏幕中央。
  • zt: 将当前行置于屏幕顶部。(top)
  • zb: 将当前行置于屏幕底部。(bottom)
  • :{行号}: 移动到指定行号。

翻页:

  • Ctrl + f: 向下翻一页。(forward)
  • Ctrl + b: 向上翻一页。(backward)
  • Ctrl + d: 向下翻半页。(down)
  • Ctrl + u: 向上翻半页。(up)

文本编辑#

插入文本:

  • i: 在光标前进入插入模式。(insert)
  • a: 在光标后进入插入模式。(append)
  • I: 在当前行的第一个非空白字符处进入插入模式。(Insert)
  • A: 在当前行的结尾进入插入模式。(Append)
  • o: 在当前行的下方新建一行并进入插入模式。(open a new line below)
  • O: 在当前行的上方新建一行并进入插入模式。(Open a new line above)
  • 5otemplate<class T>: 快速新建

删除、复制和粘贴:

  • d: 删除 (delete)。可以和移动命令结合使用。
    • dd: 删除当前行。
    • dw: 删除从光标到下一个单词开头的内容。(delete word)
    • d$D: 删除从光标到行尾的内容。
  • c: 修改 (change),删除指定内容并进入插入模式。
    • ccS: 删除当前行并进入插入模式。
    • cw: 删除一个单词并进入插入模式。
    • ce: 删除一个单词并进入插入模式。
    • c$C: 修改从光标到行尾。
    • ci(: 删除括号内的内容并进入插入模式。
  • y: 复制 (yank)。可以和移动命令结合使用。(yank)
    • yyY: 复制当前行。
    • yw: 复制一个单词。
  • r: 替换单个字符。
  • R- 进入替换模式
  • p: 在光标后粘贴。(paste)
  • P: 在光标前粘贴。
  • x: 删除光标所在处的字符。
  • X: 删除光标前的字符。
  • .: 重复上一次的修改命令。

撤销与重做:

  • u: 撤销上一步操作。(undo)
  • Ctrl + r: 重做上一步被撤销的操作。(redo)

缩进调整

  • >>: 向右缩进。
  • <<: 向左缩进。
  • =: 自动缩进当前行。
  • ==: 自动缩进。
  • gg=G: 自动缩进全文。
  • gg=G + Ctrl + r: 重做上一步被撤销的自动缩进。

数字

  • Ctrl+a 增加数字
  • Ctrl+x 减少数字

可视模式#

  • v: 进入字符可视模式
  • V: 进入行可视模式
  • Ctrl + v: 进入块可视模式
  • :'<,'> norm I# : 批量操作(示例:添加注释)
  • :1,10 norm C:
  • :1,10 s/old/new/g:
  • vi<: 选中尖括号内的内容
  • va<: 选中尖括号的内容(“)同理

查找与替换#

  • /pattern: 向下查找 pattern
  • ?pattern: 向上查找 pattern
  • n: 重复上一次的查找。(next)
  • N: 反向重复上一次的查找。
  • *: 向下查找光标当前所在的单词。
  • #: 向上查找光标当前所在的单词。
  • :%s/old/new/g: 全文查找 old 并替换为 new。(substitute)
  • :%s/old/new/gc: 全文查找并替换,每次替换前进行确认。(gobal confirm)

窗口与标签页#

  • :sp:split: 水平分割窗口。(Ctrl+w)
  • :vsp:vsplit: 垂直分割窗口。
  • Ctrl+w + hjkl: 切换到左/下/上/右侧的窗口。
  • Ctrl+w + w: 循环切换窗口。
  • :tabnew: 新建一个标签页。
  • gt: 切换到下一个标签页
  • gT: 切换到上一个标签页。
  • :bn :bp: 下一个/上一个缓冲区

宏 (Macro)#

宏可以录制并回放一系列操作,是处理重复性任务的利器。

  1. q{register}: 开始录制宏,并存入指定寄存器 (a-z)。例如 qa 开始录制名为 a 的宏。(query)
  2. 执行你的操作序列。
  3. q: 停止录制。(quite)
  4. @{register}: 回放指定寄存器中的宏。例如 @a 回放宏 a。
  5. @@: 重复上一次执行的宏。
  • :reg

保存与退出#

  • :w: 保存文件。
  • :wqZZ: 保存文件并退出。(write and quite)
  • :q: 退出 (如果文件有未保存的修改则会失败)。
  • :q!: 强制退出,不保存修改。
  • :saveas 路径: 保存文件到指定路径。

set#

  • vim ~/.vimrc: 修改配置文件
  • :set mouse=a: 允许使用鼠标
  • :set nu: 开启行号
  • :set et: Tab转换为空格(expandtab)
  • :set sw=4: 缩进为4个空格(shiftwidth)
  • :set sts=4: 删除缩进为4个空格(softtabstop)
  • :set hlsearch: 高亮显示所有搜索匹配项
  • :set cursorline: 高亮显示当前光标所在行
  • nnoremap <F8> :sh<CR>: 设置在普通模式下按F8键的快捷键
  • nnoremap <F9> :nohlsearch<CR>:
  • :set nohlsearch: 取消高亮显示所有搜索匹配项

! 魔法 (! 表示后面跟的是一个外部 Shell 命令)#

  • %: 代表当前文件名, %<: 代表当前文件名去掉扩展名,

  • :!gcc % -o %< && ./%<: 编译成功执行后,运行

  • :!ls -l: 同理有 mkdir rm cp 等常见命令

  • :!sort -u: 排序并移除重复行

  • :!sort -n: 按数值大小排序

  • :%!jq .: 格式化 JSON

  • :r !ls -l: 读取外部命令的输出并插入到当前光标的下一行

  • :r filename: 将另一个文件的内容插入

  • :!cat /proc/<pid>/map: 查看 /proc

Vim Buffer#

  • vim a b c d: 一次性指定多个文件

  • :e 文件名: 为文件创建 buffer

  • :enew: 创建一个空的、未命名的 buffer(edit new)

  • :badd 文件名: buffer add

  • :ls: 列出所有当前的缓冲区

  • :b 2: 切换到编号为2的 buffer(也支持文件名+Tab补全)

  • :bd 2: buffer delete 2

  • :bn: buffer next

  • :bp: buffer previous

  • :b# / Ctrl + ^: #表示上一个编辑的 Buffer

Vim 教程
https://blog.alinche.dpdns.org/posts/vim/
作者
Oeasy1412
发布于
2025-05-01
许可协议
CC BY-NC-SA 4.0