Vim高级用法

一、替代

vi 的替代功能远比普通的查找替换强大,它支持正则表达式和精确的范围控制。

1. 基本语法

1
:[range]s/{pattern}/{string}/[flags]
  • [range]:作用范围,如不写则默认为当前行。
  • s:substitute(替代)的缩写。
  • {pattern}:要查找的模式(支持正则表达式)。
  • {string}:替换成的字符串。
  • [flags]:标志位,用来控制替换行为。

2. 范围 [range] 的妙用

范围 含义
当前行
% 整个文件(最常用)
n,m 从第 n 行到第 m 行
. 当前行
$ 最后一行
'<,'> 可视模式下选中的范围(极其有用)

3. 标志位 [flags] 的力量

标志 含义
g 全局替换。默认只替换每行第一次出现的匹配项。
c 确认。每次替换前都会询问你(y/n/a/q/l)。
i 忽略大小写
I 不忽略大小写(覆盖 ignorecase 设置)。

4. 高级实战示例

示例1:全局替换
将文件中所有的 “foo” 替换为 “bar”。

1
:%s/foo/bar/g

示例2:带确认的替换
将第10行到第30行中所有的 “old” 替换为 “new”,每次都询问。

1
:10,30s/old/new/gc

示例3:在选中区域内替换

  1. vV 进入可视模式,选中一段文本。
  2. : 进入命令行,你会发现命令行自动填充了 '<,'>
  3. 输入替换命令,如 s/TODO/DONE/g,只会在选中的区域内生效。

示例4:使用正则表达式(捕获组)
将所有 name: "John" 格式的字符串,替换为 John's name

1
:%s/name: "\(\w\+\)"/\1's name/g
  • \(\w\+\):这是一个捕获组,匹配一个或多个单词字符,并捕获它们。
  • \1:引用第一个捕获组的内容。

二、查找

vi 的查找功能与正则表达式紧密结合,是快速定位的利器。

1. 基本查找

  • /pattern向下查找 pattern
  • ?pattern向上查找 pattern
  • n:查找下一个匹配项。
  • N:查找上一个匹配项。

2. 高级查找模式

模式 含义 示例
^ 匹配行首 /^TODO 查找以 TODO 开头的行
$ 匹配行尾 /error$ 查找以 error 结尾的行
\< 匹配单词开头 /\<in 查找以 in 开头的单词(如 input,但不会匹配 win
\> 匹配单词结尾 />ing\> 查找以 ing 结尾的单词
\c 忽略大小写(写在模式里) /\cError 会匹配 error, Error, ERROR
\v 非常魔法模式(减少转义) `/\v(error

3. 查找与操作结合

这是 vi 最强大的功能之一:只对匹配的行进行操作

语法:[range]g/{pattern}/[command]

  • g:global(全局)的缩写。
  • {pattern}:要匹配的行。
  • [command]:要执行的命令(如 d 删除, s 替换, normal 执行普通模式命令等)。

实战示例:

示例1:删除所有包含 “debug” 的行

1
:g/debug/d

示例2:删除所有空行

1
:g/^$/d

示例3:将所有包含 “TODO” 的行复制到文件末尾

1
:g/TODO/t$
  • tcopy 的缩写,$ 代表最后一行。

示例4:在不包含 “FIXME” 的行首添加 //

1
:v/FIXME/^s/^/\/\/ /
  • vg! 表示反向匹配,即对不匹配的行操作。
  • ^s/^/\/\/ / 是一个替换命令,将行首(^)替换为 //

三、列选

列选(或称块选择)允许你操作一个矩形区域内的文本,对于处理表格数据或代码对齐极其方便。

1. 进入列选模式

  • Ctrl + v (Windows/Linux) 或 Cmd + v (macOS):进入可视块模式
  • 然后使用 h, j, k, l 或方向键来扩展你的矩形选择区域。

2. 列选核心操作

进入可视块模式并选中区域后:

按键 功能
dx 删除选中的块
y 复制选中的块
p 在光标后粘贴块
P 在光标前粘贴块

3. 列选的“杀手级应用”

应用1:批量插入文本

假设你有以下代码,想在每行前面添加 const

1
2
3
name = "John";
age = 30;
city = "New York";

操作步骤:

  1. 将光标移动到 namen 上。
  2. Ctrl + v 进入列选模式。
  3. 2j 向下选中三行。
  4. Shift + i (I) 进入插入模式(注意是 I 不是 i)。
  5. 输入 const
  6. Esc
  7. 见证奇迹const 会同时出现在所有选中的行首!

应用2:批量替换文本

假设你想把上面代码中的 = 符号全部替换为 = 前后加空格。

操作步骤:

  1. 将光标移动到第一行的 = 上。
  2. Ctrl + v 进入列选模式。
  3. 2j 向下选中三行的 =
  4. c 进入更改模式
  5. 输入 =(注意前后有空格)。
  6. Esc
  7. 所有选中的 = 都被替换成了 =
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信