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

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 模式的多种方式:

按键含义插入位置
iinsert光标前
aappend光标后
IInsert at line start行首第一个非空字符前
AAppend at line end行尾
oopen below下方新建行
OOpen above上方新建行
ssubstitute char删除当前字符并进入插入
SSubstitute line删除整行内容并进入插入
gigoto last insert从上次插入位置继续

业务场景

" 快速在行尾添加分号
A;<Esc>

" 快速在下方新建一行并输入
o    " 打开新行
if (condition) {    " 输入内容
    // ...
}<Esc>

" 在函数调用括号内开始输入
f(a   " 跳到 ( 并在后面插入

3.1.3 Visual 模式

按键模式选择方式
vVisual字符选择
VVisual 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 搜索
编写 READMEnvim 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)的组合。


扩展阅读