03 - 基础操作
“The most important key to learn in Vim is the Escape key.”
3.1 模态编辑详解
3.1.1 Normal 模式
Normal 模式是 Vim 的"默认"状态,也称为"普通模式"或"命令模式"。在此模式下,按键不是输入字符,而是执行命令。
" 从任何模式返回 Normal
<Esc> " 标准方式
<C-[> " 等效于 Esc(更易按)
<C-c> " 部分情况可用(可能跳过某些行为)
Normal 模式的核心思想:
传统编辑器:按键 = 输入字符
Normal 模式:按键 = 动作命令
对比:
传统编辑器中 "dd" → 输入两个字母 d
Vim Normal 中 "dd" → 删除整行
3.1.2 Insert 模式
进入 Insert 模式的多种方式:
| 按键 | 含义 | 插入位置 |
|---|---|---|
i | insert | 光标前 |
a | append | 光标后 |
I | Insert at line start | 行首第一个非空字符前 |
A | Append at line end | 行尾 |
o | open below | 下方新建行 |
O | Open above | 上方新建行 |
s | substitute char | 删除当前字符并进入插入 |
S | Substitute line | 删除整行内容并进入插入 |
gi | goto last insert | 从上次插入位置继续 |
业务场景:
" 快速在行尾添加分号
A;<Esc>
" 快速在下方新建一行并输入
o " 打开新行
if (condition) { " 输入内容
// ...
}<Esc>
" 在函数调用括号内开始输入
f(a " 跳到 ( 并在后面插入
3.1.3 Visual 模式
| 按键 | 模式 | 选择方式 |
|---|---|---|
v | Visual | 字符选择 |
V | Visual Line | 行选择 |
<C-v> | Visual Block | 块选择 |
" 选择一段文本并操作
vap " 选择一个段落
d " 删除选中内容
" 选择多行并缩进
V3j " 选择当前行及下方 3 行
> " 缩进选中的行
" 列选择
<C-v> " 进入块选择
3j " 向下选择 3 行
$ " 到行尾
A " 在选区末尾进入插入模式
;<Esc> " 输入分号(会应用到每行末尾)
3.1.4 Command-line 模式
| 按键 | 用途 |
|---|---|
: | Ex 命令 |
/ | 向前搜索 |
? | 向后搜索 |
@: | 重复上一个 Ex 命令 |
:w " 保存
:w filename " 另存为
:q " 退出
:wq " 保存并退出
:x " 保存并退出(仅内容变化时写入)
:q! " 强制退出(不保存)
:e filename " 打开文件
:e! " 重新加载当前文件(丢弃修改)
3.2 基本移动
3.2.1 字符级移动
h " 左
j " 下
k " 上
l " 右
注意:虽然方向键也能用,但
hjkl的优势在于手指不需要离开主键区。建议强制自己使用hjkl。
3.2.2 单词级移动
| 按键 | 含义 | 示例 |
|---|---|---|
w | 下一个词首(word) | foo-bar baz → w → bar baz |
b | 上一个词首(back) | foo bar ← b ← foo bar |
e | 当前/下一个词尾(end) | foo bar → e → fo|o bar |
W | 下一个 WORD 首(空格分隔) | foo-bar baz → W → baz |
B | 上一个 WORD 首 | 类比 W |
E | 当前/下一个 WORD 尾 | 类比 W |
word vs WORD 的区别:
This-is-a-test string
^^^^^^^^^^^^
word (按 - 分割)
^^^^^^^^^^^^^^^^^^^^
WORD (按空格分隔)
3.2.3 行内移动
| 按键 | 含义 |
|---|---|
0 | 行首(第 0 列) |
^ | 行首第一个非空字符 |
$ | 行尾 |
g_ | 行尾最后一个非空字符 |
f{char} | 跳到当前行下一个 {char} |
F{char} | 跳到当前行上一个 {char} |
t{char} | 跳到当前行下一个 {char} 之前 |
T{char} | 跳到当前行上一个 {char} 之后 |
; | 重复上次 f/F/t/T |
, | 反向重复 f/F/t/T |
业务场景:
" 快速跳到行尾并追加内容
$A " 跳到行尾,进入追加模式
" 跳到行内的 = 号处修改
f=l " 跳到 = 号,右移一位
caw " 修改这个单词
" 在引号间快速导航
f" " 跳到下一个双引号
; " 继续下一个
, " 返回上一个
3.2.4 屏幕级移动
| 按键 | 含义 |
|---|---|
H | 屏幕顶部(High) |
M | 屏幕中部(Middle) |
L | 屏幕底部(Low) |
zt | 当前行移到屏幕顶部(top) |
zz | 当前行移到屏幕中部 |
zb | 当前行移到屏幕底部(bottom) |
<C-f> | 向下翻页(forward) |
<C-b> | 向上翻页(backward) |
<C-d> | 向下半页(down) |
<C-u> | 向上半页(up) |
<C-e> | 屏幕向下滚动一行 |
<C-y> | 屏幕向上滚动一行 |
3.2.5 文件级移动
| 按键 | 含义 |
|---|---|
gg | 文件开头 |
G | 文件末尾 |
{number}G 或 :{number} | 跳到第 N 行 |
% | 跳到匹配的括号 |
( | 上一个句子 |
) | 下一个句子 |
{ | 上一个段落 |
} | 下一个段落 |
]] | 下一个函数/类(取决于 filetype) |
[[ | 上一个函数/类 |
gd | 跳到局部定义 |
gD | 跳到全局定义 |
<C-o> | 跳转历史后退 |
<C-i> | 跳转历史前进 |
gf | 打开光标下的文件路径 |
3.3 基本编辑操作
3.3.1 常用编辑命令速查
| 命令 | 功能 |
|---|---|
x | 删除当前字符 |
X | 删除前一个字符 |
r{char} | 替换当前字符 |
R | 进入替换模式 |
~ | 翻转大小写并移动 |
J | 合并当前行与下一行 |
. | 重复上次修改 |
>> | 当前行缩进 |
<< | 当前行反缩进 |
3.3.2 复制与粘贴(Yank & Put)
yy " 复制当前行
3yy " 复制 3 行
yw " 复制到下一词尾
y$ " 复制到行尾
yip " 复制段落内容
p " 在光标后粘贴
P " 在光标前粘贴
gp " 粘贴后光标在内容末尾
gP " 粘贴后光标在内容末尾(光标前)
注意:Vim 中叫 “yank”(复制)而非 “copy”,因为
c已经被 “change”(修改)使用了。
3.3.3 删除
dd " 删除当前行
3dd " 删除 3 行
dw " 删除到下一词
d$ " 删除到行尾
D " 等同于 d$
d0 " 删除到行首
dip " 删除段落内容
3.4 帮助系统
3.4.1 使用帮助
:help " 打开帮助主页
:h quickref " 快速参考
:h {topic} " 查看特定主题
:h w " 查看 w 命令的帮助
:h insert-index " 插入模式命令索引
:h visual-index " 可视模式命令索引
:h option-list " 选项列表
:h :w " 查看 :w 命令
3.4.2 帮助中的导航
<C-]> " 跟随链接(tag)
<C-t> " 返回上一个位置
:q " 关闭帮助窗口
CTRL-W _ " 最大化帮助窗口
3.4.3 搜索帮助
:helpgrep pattern " 在所有帮助文本中搜索
:cn " 下一个匹配
:cp " 上一个匹配
:copen " 打开 quickfix 窗口
3.4.4 常用帮助主题
| 命令 | 内容 |
|---|---|
:h motion.txt | 动作/移动 |
:h editing.txt | 编辑命令 |
:h change.txt | 修改文本 |
:h options.txt | 所有选项 |
:h autocmd-events | 自动命令事件列表 |
:h key-notation | 按键符号表示法 |
:h user-manual | 用户手册(完整教程) |
3.5 计数(Count)
大多数命令都可以带数字前缀来重复执行:
3dd " 删除 3 行
5j " 向下移动 5 行
2dw " 删除 2 个单词
10x " 删除 10 个字符
3p " 粘贴 3 次
5>> " 缩进 5 行
9G " 跳到第 9 行
3.6 Vim 的按键表示法
在文档和配置中,Vim 使用特殊的按键表示法:
| 表示法 | 含义 |
|---|---|
<CR> | Enter/回车 |
<Esc> | Escape |
<C-x> | Ctrl+x |
<S-x> | Shift+x |
<M-x> 或 <A-x> | Alt+x |
<BS> | Backspace |
<Del> | Delete |
<Tab> | Tab |
<Space> | 空格 |
<Up>/<Down>/<Left>/<Right> | 方向键 |
<Leader> | Leader 键(默认 \) |
<Bar> | 竖线 | |
3.7 练习:第一次编辑
让我们用一个完整的例子来练习基础操作:
# 创建练习文件
cat > /tmp/vim-practice.txt << 'EOF'
hello world
this is a test file
for vim practice
we will learn many things
including motions and operators
EOF
# 用 Vim 打开
nvim /tmp/vim-practice.txt
练习任务:
任务 1: 将第一行的 "hello" 改为 "Hello"(大写首字母)
→ 0~(跳到行首,翻转大小写)
任务 2: 在第二行后插入一行 "I love vim"
→ j(移到第二行)o(下方新建行)I love vim<Esc>
任务 3: 复制最后两行到文件开头
→ G2yy2ggP
任务 4: 删除包含 "practice" 的行
→ /practice<CR>dd
任务 5: 保存并退出
→ :wq
3.8 业务场景
| 场景 | Vim 操作 |
|---|---|
| 快速修改配置文件 | nvim /etc/nginx/nginx.conf → 编辑 → :wq |
| 查看日志文件 | nvim /var/log/syslog → /error 搜索 |
| 编写 README | nvim README.md → 使用 Insert 模式 |
| 批量修改代码 | 使用 Visual Block + A |
| 远程服务器编辑 | ssh server → vim config.json |
3.9 总结
| 类别 | 核心命令 |
|---|---|
| 模式切换 | i(插入) v(可视) :(命令) Esc(普通) |
| 基本移动 | hjkl(方向) wb(单词) 0$^(行) Ggg(文件) |
| 编辑 | dd(删行) yy(复制) p(粘贴) u(撤销) <C-r>(重做) |
| 帮助 | :help :h topic :helpgrep |
| 生存 | :w(保存) :q(退出) :wq(保存退出) :q!(强制退出) |
下一步:第 04 章 - 动作与文本对象 → 深入学习 Vim 最强大的特性:动作(Motion)和文本对象(Text Object)的组合。
扩展阅读
:h user-manual— Vim 内置完整教程vimtutor— 终端运行交互式教程(推荐新手第一课)- OpenVim - 在线交互式 Vim 教程
- Vim Adventures - 游戏化学 Vim
- Practical Vim by Drew Neil