Vim 编辑器
Vim(Vi IMproved)是 Linux 世界里几乎每台服务器都自带的编辑器。当你 SSH 到一台没图形界面的远程服务器,要改配置文件时,Vim 几乎是唯一选择。它的学习曲线出名地陡峭("如何退出 Vim"是个网络名梗),但掌握几个核心操作就够日常用了。这一篇我们只讲最实用的 20%。
1. 核心理念:模式
Vim 和普通编辑器(记事本、VS Code)最大的区别是模式——同一个键在不同模式下含义完全不同。这是它高效的根本,也是新手崩溃的原因。
# 打开 Vim
vim file.txt # 打开(不存在就新建)
vim +20 file.txt # 打开并跳到第 20 行
vim +/keyword file.txt # 打开并跳到第一个 keyword
vim -R file.txt # 只读模式(view 命令同理)
# Vim 的核心理念:模式(mode)
# 普通模式(Normal) - 默认,按键是命令,不输入文字
# 插入模式(Insert) - 像普通编辑器,输入文字
# 命令模式(Command) - 输入冒号开头的命令(:w :q)
# 可视模式(Visual) - 选中文本块(类似鼠标拖选)
# 刚打开是普通模式。按 i 进入插入模式开始打字。
# 任何时候按 Esc 回到普通模式(你的"安全键")。新手记住一条铁律:迷路了就按 Esc。Esc 把你带回普通模式,这是 Vim 的"安全屋"。普通模式下按 u 撤销、:q! 强制退出,无论如何都不会卡死。
2. 移动:把右手放在 hjkl 上
Vim 不需要鼠标也不需要方向键,移动全靠键盘。核心是 hjkl 四个键:
# 普通模式下的移动(保持双手在主键盘区)
# 基本移动(hjkl,右手食指放在 j 上)
# h 左 j 下 k 上 l 右
# (记忆:j 像钩子向下,k 像向上指)
# 词级移动
w 下一个词开头(word)
b 上一个词开头(back)
e 当前/下一个词结尾(end)
# 行内移动
0 行首(绝对)
^ 第一个非空字符(行首)
$ 行尾(注意和正则的行尾一致)
# 文档级移动
gg 文档开头
G 文档结尾
5G 跳到第 5 行
Ctrl+G 显示当前行号信息
# 屏幕级移动
Ctrl+f 下一页(forward)
Ctrl+b 上一页(backward)
H 屏幕顶(High)
M 屏幕中(Middle)
L 屏幕底(Low)记忆法:h 在最左(向左),l 在最右(向右),j 像一个向下的钩子,k 像向上翘。开始会很别扭,坚持两天形成肌肉记忆后比方向键快得多。
高频组合:数字 + 移动 = 重复。5j 下移 5 行,3w 跳 3 个词,2dd 删 2 行。这是 Vim 高效的精髓。
3. 编辑:进入插入模式
普通模式下按 i / a / o 进入插入模式,才能像普通编辑器一样输入文字。
# 插入模式:进入插入(在普通模式下按)
i 在光标前插入(insert)
a 在光标后插入(append)
I 在行首插入
A 在行尾追加
o 下方新开一行并进入插入(open)
O 上方新开一行并进入插入
# 删除与修改
x 删光标所在字符
dd 删整行(2dd 删两行)
dw 删一个词
d$ 删到行尾
D 删到行尾(等于 d$)
cw 改一个词(删词后进入插入)
cc 改整行
r 替换一个字符(不进入插入)
u 撤销(undo)
Ctrl+r 重做(redo)
# 复制与粘贴(在 Vim 里叫 yank 和 put)
yy 复制整行(yank,2yy 复制两行)
yw 复制一个词
y$ 复制到行尾
p 粘贴到光标后(小写)
P 粘贴到光标前(大写)
dd + p = 剪切粘贴(移动行)
# 重复
. 重复上一次修改命令(超有用,豆操作)关键操作速记:
i在光标前插入,a在光标后(append);o下方新开一行最常用。dd删整行、yy复制整行、p粘贴——这三个组合够日常 80% 的编辑。u撤销、Ctrl+r重做。.(点号)重复上一次修改命令,强大的"批量操作"。
4. 搜索与替换
# 搜索
/keyword 向下搜索 keyword(回车确认)
?keyword 向上搜索
n 下一个匹配(Next)
N 上一个匹配
* 搜索光标所在的词(向下)
# 搜索光标所在的词(向上)
# 搜索时设置高亮忽略大小写
:set hlsearch # 高亮所有匹配
:set ignorecase # 忽略大小写
:set smartcase # 智能大小写(全小写时忽略,有大写时区分)
# 替换(substitute)
:s/old/new/ 当前行第一个 old 换成 new
:s/old/new/g 当前行所有 old 换成 new(g=global)
:%s/old/new/g 全文档替换
:%s/old/new/gc 全文档替换,每个确认(c=confirm)
:5,10s/old/new/g 第 5 到 10 行替换
:%s/old/new/gi 不分大小写最常用的替换是 :%s/旧/新/g——全文档替换。:%s/旧/新/gc 加 c(confirm)每个都问一下,适合谨慎操作。
5. 保存与退出(最关键!)
"如何退出 Vim"是个出圈的名梗,真的很多人卡在这里:
# 保存与退出(命令模式,以冒号开头)
:w 保存(write)
:q 退出(quit)
:wq 保存并退出(等价 Shift+Z+Z 或 :x)
:q! 强制退出不保存(! = 强制)
:w! 强制保存(只读文件可能用 sudo 才行)
# 多文件
:e other.txt 编辑另一个文件
:w newname.txt 另存为
:bn 下一个文件(buffer next)
:bp 上一个文件
:bd 关闭当前文件(buffer delete)
# 常见新手困境:改完不知道怎么退出!
# 记住这个口诀:
# 1. 按 Esc 回到普通模式
# 2. 输入 :wq 回车 保存退出
# 3. 不想保存就 :q!
# 网上梗 "如何退出 Vim" 不是开玩笑,真的很多人卡住记住口诀:Esc → :wq → 回车。改坏了不想保存就 :q!。从此再也不会被困在 Vim 里。
6. 可视模式:选中操作
可视模式相当于鼠标拖选,选中后可以做批量操作:
# 可视模式(选中文本)
v 进入字符可视模式(逐字选)
V 进入行可视模式(逐行选)
Ctrl+v 进入块可视模式(矩形选,批量注释神器)
# 选中后可以:
d 删除选区
y 复制选区
> 缩进右移
< 缩进左移
~ 大小写反转
# 经典应用:批量加注释
# 1. Ctrl+v 进入块选择
# 2. 上下方向键选要注释的行
# 3. Shift+i 输入 # 或 //
# 4. 按 Esc 等一下,所有选中的行都加上注释了块可视模式(Ctrl+v)是批量注释/取消注释的神器,这是 VS Code 也要装插件才能做的事,Vim 原生支持。
7. 配置 .vimrc 让 Vim 更友好
默认的 Vim 比较朴素,写几行配置就能变得好用得多:
# ~/.vimrc:Vim 配置文件(让 Vim 更好用)
# 创建文件:vim ~/.vimrc,加入下面内容
set number " 显示行号
set relativenumber " 相对行号(方便 5j 这种移动)
set tabstop=4 " Tab 显示宽度
set shiftwidth=4 " 缩进宽度
set expandtab " Tab 转空格
set autoindent " 自动缩进
set smartindent " 智能缩进
set hlsearch " 搜索高亮
set ignorecase " 忽略大小写
set smartcase " 智能大小写
set wrap " 自动折行
set cursorline " 高亮当前行
syntax on " 语法高亮
filetype plugin indent on " 文件类型检测
# 装插件(进阶):vim-plug 或 packer
# 现代替代:NeoVim(更强大,LSP 支持)把这段配置保存到 ~/.vimrc,立刻就有行号、语法高亮、智能缩进。每次打开 Vim 自动生效。
8. 速查表(必备 20 个操作)
- 进入插入:
i前插 /a后插 /o下行 /O上行 - 移动:
hjkl/wb词 /gg开头 /G结尾 /0行首 /$行尾 - 编辑:
x删字 /dd删行 /yy复制行 /p粘贴 /u撤销 /.重复 - 搜索:
/词搜索 /n下一个 /*搜当前词 - 保存退出:
:wq保存退 /:q!不保存退
9. Vim 的现代替代
Vim 的理念虽然好,但配置成本高。如果觉得原生 Vim 太朴素,有几个选择:
- NeoVim:Vim 的现代分支,支持 LSP、Treesitter,配合插件可以做到 VS Code 的体验。
- nano:极简编辑器,Ubuntu 默认带,适合"我就改一下配置"的场景。
nano file.txt打开,Ctrl+O 保存,Ctrl+X 退出。 - VS Code Remote:本地 VS Code 通过 Remote-SSH 插件直接编辑远程文件,体验和本地一样,这是现代开发的主流。
但即便如此,Vim 的基本操作还是要会——SSH 进出服务器、Git 提交信息、Docker exec 进容器,这些场景里只有 Vim/nano 可用。它是工程师的"急救技能"。
小结
这一篇你学会了 Vim 的核心:四种模式、hjkl 移动、i/a/o 进入插入、dd/yy/p 编辑、/搜索、:s 替换、:wq 保存退出。坚持用一周形成肌肉记忆,你会发现它比鼠标快得多。下一篇讲远程登录——SSH。
← 上一篇 Linux 环境变量
下一篇 SSH 远程连接 →