强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 servervim 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)的组合。


扩展阅读