跳到主要内容

编辑技巧

编辑是 Vim 的核心功能。本章将介绍删除、复制、粘贴、修改等核心编辑操作,这些与移动命令结合,构成 Vim 强大的编辑能力。

操作符(Operator)

Vim 的编辑命令遵循 操作符 + 动作 的模式:

操作符 [数字] 动作

常用操作符

操作符作用
d删除(delete)
c修改(change)
y复制/抽出(yank)
>向右缩进
<向左缩进
=自动缩进
g~切换大小写
gu转为小写
gU转为大写

示例

dw      " 删除一个单词
c$ " 修改到行尾
yiw " 复制当前单词
>> " 当前行向右缩进

删除操作

基本删除

命令作用
x删除光标处字符
X删除光标前字符
dd删除整行
D删除到行尾(同 d$)

配合移动命令删除

dw      " 删除单词(从光标到单词结尾)
db " 删除到单词开头
de " 删除到单词结尾(不含空格)
d$ " 删除到行尾
d0 " 删除到行首
dgg " 删除到文件开头
dG " 删除到文件结尾
dfx " 删除到字符 x

删除多行

5dd     " 删除 5 行
d5j " 删除当前行及以下 5 行
d5k " 删除当前行及以上 5 行

删除并进入插入模式

cc 或 S " 删除整行并进入插入模式
C " 删除到行尾并进入插入模式

复制与粘贴

复制(Yank)

命令作用
yyY复制整行
yw复制单词
y$复制到行尾
yiw复制当前单词
yip复制当前段落

粘贴(Put)

命令作用
p在光标后/下方粘贴
P在光标前/上方粘贴

粘贴规则

  • 复制的是整行:p 在下一行粘贴,P 在上一行粘贴
  • 复制的是部分文本:p 在光标后粘贴,P 在光标前粘贴

交换两行

ddp     " 删除当前行并粘贴到下一行(交换当前行与下一行)

修改操作

修改操作删除文本并立即进入插入模式。

基本修改

命令作用
ccS修改整行
C修改到行尾
cw修改单词
ciw修改当前单词
ci"修改引号内内容
ci(修改括号内内容

修改命令详解

c 命令与 d 命令类似,但删除后会进入插入模式:

cw      " 删除单词并进入插入模式
ct. " 删除到句号并进入插入模式
c$ " 删除到行尾并进入插入模式

文本对象

文本对象(Text Objects)是 Vim 最强大的功能之一,用于操作特定的文本结构。

文本对象格式

[操作符]i[对象]    " 操作对象内部(inner)
[操作符]a[对象] " 操作对象及包围符号(around)

常用文本对象

对象说明示例
w单词diw 删除当前单词
W字串daW 删除当前字串及空格
s句子dis 删除当前句子
p段落dip 删除当前段落
"双引号字符串di" 删除引号内内容
'单引号字符串di' 删除引号内内容
`反引号字符串di`
(b圆括号di(dib
[方括号di[
{B花括号di{diB
<尖括号di<
tHTML 标签dit

文本对象示例

# 示例代码
print("Hello World")
# ^光标在这里

# 操作结果:
di" → print("") # 删除引号内内容
da" → print() # 删除引号及内容
ci" → print("|") # 修改引号内内容(|表示光标)
yi" → 复制 "Hello World"
vi" → 选中 "Hello World"

嵌套结构

对于嵌套的括号,Vim 会自动识别最内层:

# 光标在 inner 上
outer(middle(inner))

# di( 删除最内层括号内容
outer(middle())

# da( 删除最内层括号及内容
outer(middle)

# 再次 da(
outer

撤销与重做

命令作用
u撤销
Ctrl+r重做
U撤销整行修改

撤销分支

Vim 支持撤销分支,可以回到撤销历史中的任意状态:

:undolist       " 查看撤销分支
:undo 3 " 撤销到第 3 个状态
:earlier 10m " 回到 10 分钟前的状态
:later 5m " 前进到 5 分钟后的状态

重复操作

点命令

. 命令是 Vim 最强大的命令之一,用于重复上次修改。

什么是"修改"

  • 插入或删除文本
  • 使用操作符(d, c, y 等)的操作

示例

1. 找到单词 "old"
2. 按 * 搜索该单词
3. 按 ciw 修改该单词,输入 "new"
4. 按 n 跳到下一个匹配
5. 按 . 重复修改
6. 重复步骤 4-5,批量替换

宏录制

虽然宏录制有专门章节,但这里简单介绍:

命令作用
q{寄存器}开始录制
q停止录制
@{寄存器}播放宏
@@重复上次宏

示例

1. qa          " 开始录制到寄存器 a
2. I# Esc " 在行首添加 #
3. j " 移到下一行
4. q " 停止录制
5. 10@a " 对下面 10 行执行相同操作

缩进操作

手动缩进

命令作用
>>当前行向右缩进
<<当前行向左缩进
>ip段落向右缩进
<ip段落向左缩进
=G自动缩进到文件结尾

自动缩进

=       " 自动缩进当前行
=i{ " 自动缩进花括号内代码
=ap " 自动缩进当前段落
gg=G " 自动缩进整个文件

大小写转换

命令作用
~切换光标处字符大小写
g~w切换单词大小写
guw将单词转为小写
gUw将单词转为大写
g~~切换整行大小写
guu整行转为小写
gUU整行转为大写

示例

Hello WORLD

按 guw → hello WORLD(单词变小写)
按 gUw → Hello WORLD(单词变大写)
按 g~~ → hELLO world(整行切换)

连接行

命令作用
J将下一行连接到当前行(加空格)
gJ将下一行连接到当前行(不加空格)
3J连接下面 3 行

示例

Line 1
Line 2
Line 3

按 J → Line 1 Line 2
Line 3

按 gJ → Line 1Line 2
Line 3

实战技巧

技巧 1:快速包裹文本

给选中的文本添加括号:

1. 选中要包裹的文本(可视模式)
2. 按 S" → 用双引号包裹
3. 按 S( → 用圆括号包裹
4. 按 S[ → 用方括号包裹

技巧 2:快速删除包裹符号

文本:"Hello World"

按 ds" → Hello World (删除双引号)
按 cs"' → 'Hello World' (双引号改单引号)
说明

dscs 需要安装 surround 插件。我们将在插件章节介绍。

技巧 3:多行编辑

给多行添加注释:

1. Ctrl+v 进入块可视模式
2. 选中多行的行首
3. I// Esc (在行首插入 //)

技巧 4:快速重命名变量

1. 光标在变量名上
2. * 搜索该变量
3. ciw 修改该变量名
4. n 跳到下一个
5. . 重复修改
6. 重复 4-5 直到全部修改完成

技巧 5:整理代码格式

gg=G        " 自动缩进整个文件
:%retab " 将 Tab 转换为空格

练习

练习 1:基础编辑

创建文件练习基本操作:

1. vim editing.txt
2. 输入以下内容:
Hello World
Vim is awesome
I love editing
3. 练习 dd, yy, p, u, Ctrl+r
4. 练习 dw, cw, yw
5. 练习 ci", di", yi"

练习 2:文本对象

# 练习以下操作
print("Hello World")
function(arg1, arg2)
list = [1, 2, 3, 4, 5]

# 练习:
# 1. ci" 修改字符串
# 2. di( 删除括号内参数
# 3. yi[ 复制列表内容
# 4. vi{ 选中代码块

练习 3:点命令实战

1. 打开一个包含多个 "old" 的文件
2. 用 * 搜索 "old"
3. 用 ciw 修改为 "new"
4. 用 n 和 . 批量替换所有 "old"

编辑命令总结

操作删除复制修改
字符xylcl
单词dwywcw
当前单词diwyiwciw
到行尾Dd$y$Cc$
整行ddyyccS
段落dipyipcip

下一步

掌握了编辑技巧后,下一章我们将学习搜索与替换,这是处理大型文件时的必备技能。