Linux Vim 解析
Chen Kai CTO

Vim 的精髓在于“模式化编辑”,通过不同模式(普通、插入、可视、命令等)大幅提升文本操作效率,本文详细解析 Vim 常用模式与操作。

一、Vim 常用模式与操作

Vim 的精髓在于“模式化编辑”,不同模式下按键功能不同,组合操作可以极大提升编辑效率。下列是几个核心模式:

  1. 普通模式(Normal Mode):Vim 启动后默认进入的模式,用于导航、删除、复制等操作。
  2. 插入模式(Insert Mode):按 iao 等键进入,可进行正常的文本输入。
  3. 可视模式(Visual Mode):按 v(字符可视模式)、V(行可视模式)或 Ctrl + v(块可视模式)进入,用于批量选定文本后再执行批量操作。
  4. 命令模式(Command Mode):在普通模式下按 : 进入,执行如保存、替换等命令。
  5. 替换模式(Replace Mode):按 R 进入,输入的新字符将覆盖光标后的文本。

退出回到普通模式只需按 Esc

1
2
3
4
5
6
7
8
9
# 例如,在普通模式下执行删除操作:
# dd -> 删除当前行
# dw -> 删除一个单词
# x -> 删除当前字符
#
# 在可视模式下快速选中多行:
# v -> 进入字符可视模式
# j -> 向下移动选中多行
# d -> 删除选中的所有行

1. 文件操作

  • :w:保存文件(Write)。
  • :q:退出(Quit)。
  • :wq:x:保存并退出。
  • :q!:强制退出,不保存更改。
  • :e filename:打开或编辑新的文件。
  • :saveas filename:另存为指定文件。(或者 :w 文件路径

这些命令都需要先进入命令模式(在普通模式下按 :)。

2. 光标移动与翻屏

  • h / j / k / l:分别向左、下、上、右移动一个字符。
  • 0:移动到行首,^:移动到本行第一个非空字符。
  • $:移动到行尾。
  • w / b:向后/向前移动一个单词。
  • Ctrl + f / Ctrl + b:向下/向上翻一屏。
  • gg:移动到文件开头,G:移动到文件末尾。
  • {number}G:移动到指定行号。

3. 删除、复制、粘贴与撤销

  • 删除
    • x:删除当前光标字符。
    • dd:删除当前行。
    • d{motion}:配合移动指令一次性删除,比如 dw 删至下个单词开头、d$ 删至行尾。
    • G:删除当前行的该位置到最后的所有内容
  • 复制(yank)
    • yy:复制当前行。
    • y{motion}:配合移动指令复制一定范围(如 yw 复制一个单词)。
  • 粘贴
    • p:在光标后粘贴(粘贴到下一行或光标右侧)。
    • P:在光标前粘贴(粘贴到上一行或光标左侧)。
    • 要粘贴大量代码或者配置文件,可能会被自动注释,建议先进入 :set paste 模式。
  • 撤销与重做
    • u:撤销最近一次操作。
    • Ctrl + r:重做被撤销的操作。

4. 剪切(移动文本)

  • dd:删除当前行,也可视为剪切当前行。
  • 复制并删除原位置的组合,等效于剪切后粘贴到目标位置。例如:
    1. dd(剪切一行)
    2. 移动光标到目标行
    3. p(粘贴)

5. 命令模式下常用命令

  • :set number:显示行号。
  • :noh:取消搜索高亮。
  • :maps / :verbose map 等:查看当前映射(可用于排查快捷键冲突)。
  • :!命令:执行外部命令,如 :!ls 列出当前目录。

二、Vim 高级应用

1. 多窗口与分屏

对于大文件或多文件协同查看,Vim 提供了强大的分屏与多窗口功能:

  • :split:sp:水平分割当前窗口。

  • :vsplit:vsp:垂直分割当前窗口。

  • Ctrl + w 后跟 h/j/k/l:在分割窗口之间移动光标。

  • :close:关闭当前分割窗口。

  • :only:保留当前窗口并关闭其他所有分屏。

  • :tabnew:新建标签页,类似浏览器多标签模式。

  • gt / gT:在标签页之间切换。

  • 多人打开一个文件,会有一个 swp 文件,vim 该文件会提示你可以进行的操作:继续、不管、退出等。

    ![image-20250113231311535](./Linux Vim 解析/image-20250113231311535.png)

    或者没有正常退出也会出现这个问题,不要数据的话直接删掉 swp 文件就行,要数据的话 vim 原始的文件,进行命令选择,之后再删除 swp 文件。

灵活运用分屏和多标签,可以同时查看多个文件或多个部分,提高编辑与对比效率。

1
2
3
4
# 可以试试在同一文件中查看不同位置:
# :split
# :vsplit
# 然后使用 Ctrl + w + h/j/k/l 在各窗口之间切换

2. 宏录制与应用

在处理重复性操作时,Vim 的宏功能特别高效。可以将一系列操作录制下来,然后对其他文本执行相同操作。

  • q{register}:开始录制宏到指定寄存器(如 q a 录制到 a 寄存器)。
  • 任意编辑操作(如移动、删除、插入文本)。
  • q:停止录制。
  • @{register}:调用宏(执行刚才录制的步骤)。
  • @@:重复上一次调用的宏。

若需多次重复,只需在普通模式下输入 {number}@{register},就能批量执行宏。

1
2
3
4
5
6
7
# 宏录制实例:
#
# 1. 在普通模式下输入:qa (开始录制到寄存器 a)
# 2. 进行一系列操作,如 dd(删除行),p(粘贴),j(下移一行)
# 3. 输入 q 结束录制
# 4. @a -> 执行宏
# 5. 10@a -> 执行宏 10 次

3. 代码折叠

当你需要在大文件中专注于某个代码块或区域时,可以使用折叠功能隐藏不关心的部分:

  • zR:展开所有折叠。
  • zM:折叠所有。
  • za:切换当前块折叠/展开状态。
  • zc:折叠当前代码块。
  • zo:展开当前代码块。

这在查看函数、类或配置文件的片段时尤为实用。

1
2
3
# 若有一个大函数,可以在函数块内键入:
# zc -> 折叠当前块
# za -> 切换当前块折叠状态

4. 批量替换

Vim 支持非常灵活的替换和正则匹配。基本格式为:

:s/旧内容/新内容/g
仅替换当前行所有匹配,不加 g 就只会匹配第一个。

:%s/旧内容/新内容/g
替换整个文件所有匹配。

需要更精细的范围时,可以在命令前加行号或选中可视模式后输入 :s 命令。

  • :10,20s/foo/bar/g:仅在第 10~20 行执行替换。
  • 正则表达式可极大增强替换能力,例如匹配复杂模式并加入分组。
1
2
3
4
5
# 例如,将所有 "TODO" 替换为 "DONE":
# :%s/TODO/DONE/g
#
# 将 10 行到 20 行之间的 "abc" 替换为 "xyz":
# :10,20s/abc/xyz/g

5. 自定义与配置

Vim 可以高度定制,通过修改 ~/.vimrc(或 ~/.config/nvim/init.vim 在 Neovim 中)实现个性化配置:

  • set number:显示行号。
  • set expandtabset tabstop=4set shiftwidth=4:控制 Tab 与缩进。
  • syntax on:开启语法高亮。高亮的两种方式:
    • 修改文件后缀
    • 加文件头,例如:
      • #! /bin/bash
      • #! /usr/bin/python,加完之后退出重进
  • set relativenumber:相对行号,方便行距离计算。
  • 使用 autocmd 设置自动命令,如保存前自动去除行尾空白等。
1
2
3
4
5
6
7
8
# 典型 .vimrc 示例如下:
set number
set expandtab
set tabstop=4
set shiftwidth=4
syntax on
set cursorline
autocmd BufWritePre * :%s/\s\+$//e
  • 本文标题:Linux Vim 解析
  • 本文作者:Chen Kai
  • 创建时间:2025-01-12 00:00:00
  • 本文链接:https://www.chenk.top/Linux Vim 解析/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论