Vim / Neovim 完全指南 / 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