大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
编辑器与配置
这一课你将能做到
- 用 vim 完成「打开 → 定位 → 修改 → 保存退出」闭环,包括搜索、跳到行首/行尾/指定行、撤销
- 实际编辑两类生产配置:给
~/.bashrc加别名、改一份 nginx 配置(改完知道要 reload) - 用
sed -i不打开文件完成批量替换(改端口、换域名),并先备份防手滑
为什么要学
服务器上没有 VS Code。SSH 进去之后,改 nginx 配置、改 Spring Boot 的 application-prod.yml、改 systemd 单元文件、改 crontab——全部要在终端里完成。vim 几乎是所有发行版的标配(nano 也能用,但 vim 是面试和运维圈的通用语言)。
初学者对 vim 的恐惧来自一件事:进得去出不来。本课先用 5 分钟解决「打开和退出」,再给够「改得动」的最小命令集,最后补上 sed 这个「不打开文件也能改」的批量神器。目标是:在任何服务器上,你能独立完成一次配置修改并让它生效。
先建立图像
vim 的核心是模式(mode),这是它和 VS Code 最大的不同:
┌──────────────────────────────────────────────────┐
│ NORMAL 普通模式 │
│ (打开后的默认状态:移动/删除/复制/搜索) │
│ │
│ i a o :wq :q! ZZ │
│ (进入插入模式) (底行命令:保存/退出) │
│ │ ▲ │
│ ▼ │ Esc │
│ ┌─────────────────┐ Esc 回到普通模式 │
│ │ INSERT 插入模式 │──────────────────────► │
│ │ (像普通编辑器打字)│ │
│ └─────────────────┘ │
└──────────────────────────────────────────────────┘
记住两条铁律,vim 就困不住你:
- Esc 永远能回到普通模式——慌了就先按 Esc
- 普通模式下
:q!不保存强退,:wq保存退出——这一进一出会了,剩下全是加分项
跟着做
步骤 1:进得去,出得来(5 分钟脱困训练)
mkdir -p ~/vim-lab && cd ~/vim-lab
echo "server.port=8080" > app.properties
vim app.properties
进入 vim 后按顺序演练(每步都在 vim 里操作):
1. 什么都别按,观察底部是否有 -- INSERT --(没有=普通模式,正确)
2. 按 i → 底部出现 -- INSERT --,现在是打字模式
3. 输入 # test,然后按 Esc → 回到普通模式
4. 输入 :q! → 回车,不保存退出(! 表示放弃修改强退)
5. 再 vim app.properties 进去,按 i,随便打几个字,Esc
6. 输入 :wq → 回车,保存退出
到此你已经掌握了 vim 的「生死开关」。后面全部内容都建立在这个安全感之上。
步骤 2:移动与定位(改配置找得快)
cp /etc/hosts ~/vim-lab/hosts-sample # 拿系统文件做练习副本(别改原件)
vim hosts-sample
普通模式下的定位键(练一遍形成手感):
h j k l ← ↓ ↑ →(也可用方向键)
gg 跳到第一行
G 跳到最后一行(看长日志最常用)
:50 回车 跳到第 50 行(配合报错里的行号用)
0 / $ 行首 / 行尾
w / b 下一个 / 上一个单词
/关键词 回车 向下搜索;n 下一个命中,N 上一个
试一遍:G 到底、gg 回顶、/localhost 搜索 hosts 里的条目、按 n 跳下一个。
步骤 3:编辑操作(改得动的最小集)
普通模式下:
i 光标前插入 a 光标后插入
o 下方新开一行插入 O 上方新开一行
x 删除光标处字符 dd 删除(剪切)整行
5dd 删 5 行 dw 删一个单词
u 撤销(多按多退) Ctrl+r 重做
yy 复制整行 3yy 复制 3 行
p 粘贴到光标下方 P 粘贴到上方
演练:进 vim → yy 复制一行 → p 粘贴 → dd 删掉刚粘贴的 → u 撤销删除 → :wq 保存退出,diff /etc/hosts hosts-sample 看你改了什么。
步骤 4:实战一——给 ~/.bashrc 加配置
上一课的 alias 现在用 vim 正式写进去:
vim ~/.bashrc
在文件末尾添加(G 跳到末尾 → o 新开一行插入):
# 我的常用别名
alias ll='ls -alF'
alias logs='tail -f /www/wwwroot/coderoadmap/logs/backend.log'
alias codecd='cd /www/wwwroot/coderoadmap'
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
:wq 保存退出后让它生效并验证:
source ~/.bashrc
type ll # ll is aliased to `ls -alF' → 生效
echo $JAVA_HOME # 路径存在才对(没装 JDK 则先留着,包管理课会装)
步骤 5:实战二——改一份 nginx 配置
没有 nginx 就先造一份等效的练习文件;有 nginx 则走真实路径:
mkdir -p ~/vim-lab/nginx && cd ~/vim-lab/nginx
cat > default.conf <<'EOF'
server {
listen 80;
server_name old.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
EOF
vim default.conf
任务:把 old.example.com 改成 new.example.com,并把 listen 80; 下面加一行 server_name 注释说明。
/old 回车 定位到 old.example.com
cw 删除当前单词并进入插入模式(change word)
输入 new.example.com,Esc
G o 到末尾新开一行
输入 # updated by deploy 2026-10-06,Esc
:wq
cat default.conf 核对结果
真实 nginx 场景的差异只有两点:文件在 /etc/nginx/sites-available/(Ubuntu)需要 sudo vim,改完要 sudo nginx -t && sudo systemctl reload nginx 让它生效。改配置 ≠ 配置生效,这个意识从今天建立。
步骤 6:sed——不打开文件的批量替换
改单处用 vim,改多处/脚本化用 sed:
cd ~/vim-lab/nginx
cp default.conf default.conf.bak # 养习惯:sed -i 前先备份
sed -i 's/3000/3001/' default.conf # 把代理端口 3000 改成 3001
grep proxy_pass default.conf # 验证:http://127.0.0.1:3001
sed -i 's/new\.example\.com/prod.example.com/g' default.conf
grep server_name default.conf # g 全局替换;. 要转义
# 不改文件,只预览替换效果(去掉 -i 就是干跑):
sed 's/prod/staging/' default.conf | grep server_name
# 行号操作:只看第 2-5 行 / 删除第 3 行
sed -n '2,5p' default.conf
sed '3d' default.conf
sed -i 的威力在自动化:CI 部署时给配置「换数据库地址」就是一条 sed,不需要人打开编辑器。
步骤 7:给 vim 一点舒适配置(可选但值得)
vim ~/.vimrc
写入(每行作用见注释):
syntax on " 语法高亮
set number " 显示行号(对报错定位关键)
set tabstop=4 " Tab 宽 4 格
set expandtab " Tab 转空格(yml 文件刚需)
set hlsearch " 搜索结果高亮
set encoding=utf-8
:wq 后新开 vim 即生效。yaml 类配置(Spring Boot 的 application.yml)对缩进敏感,expandtab 能救命。
讲清楚要点
- vim 的所有「怪」都源于模式制:打字是插入模式的事,导航/删除/保存是普通模式的事。卡住的第一反应永远是 Esc。
- nano 是合法的退路:
nano 文件底部有快捷键提示(Ctrl+O 保存、Ctrl+X 退出),初学者可先用 nano 建立信心;但 vim 的搜索、跳行、批量操作是 nano 给不了的,建议两周内切换。 sudo vim编辑系统文件,普通 vim 编辑自己的文件:/etc下的东西(nginx、systemd、fstab)需要 root 权限,忘加 sudo 会遇到只读警告(E45),此时可用:w !sudo tee %应急保存。- 改配置 ≠ 生效:不同服务生效方式不同——nginx 要
reload、systemd 单元要daemon-reload、bashrc 要source、crontab 保存即生效。这是「为什么我改了没用」的第一大原因。 - sed -i 是脚本化的编辑器:
s/old/new/g替换、-n 'Np'取行、Nd删行。批量、重复、无人值守的场景选 sed;一次性、需要判断的场景选 vim。用 -i 前先备份或先用不带 -i 的版本预览。 - vim 操作是「动词+数字+名词」的语法:
d删、y复制、c改;3次数;dd行、w词、G到尾。理解了这个语法,5dd、3yy、dw不用背就懂了。
你可能会懵的地方
- 不小心按到了什么,屏幕行为全变了?
大概率误入了可视模式(按过
v/V/Ctrl+v)或替换模式(R)。Esc 退出即可。偶尔按到Ctrl+s会让终端「假死」(XOFF 流控),按Ctrl+q恢复。 - vim 里粘贴代码全乱了缩进?
自动缩进叠加了粘贴内容自身的缩进。解决:粘贴前先
:set paste,粘完:set nopaste;或在普通模式用+p从系统剪贴板粘贴。 - 编辑时提示 E45: 'readonly' option is set?
文件无写权限(多半忘了 sudo)。有两条路:
:q!退出后sudo vim重开;或确需保存时:w !sudo tee %。 - vim 和 vi 是同一个东西吗?
vi 是 1976 年的鼻祖,vim(Vi IMproved)是增强版。Ubuntu 里
vi通常软链到 vim.tiny,功能阉割。认准vim命令。 - 改了 .vimrc/.bashrc 当前窗口没反应?
这类文件只在 shell/vim 启动时读取。让当前会话生效:shell 用
source ~/.bashrc,vim 里用:source ~/.vimrc或重开。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 进 vim 后一顿乱按想「试出」退出 | 命令被误解释,文件越改越乱 | Esc → :q! 强退重开 |
:wq 保存了不想改的内容 | 误改被固化,配置坏了 | 拿不准就 :q!;改动前先 cp 文件 文件.bak |
sudo vim /etc/nginx/nginx.conf 忘加 sudo | 只读保存失败 E45 | 加 sudo;或 :w !sudo tee % 应急 |
直接 sed -i 改生产配置 | 替换错了没退路 | 先 cp x x.bak,或先跑不带 -i 的预览版 |
| yml 文件用 Tab 缩进 | Spring Boot 对 yml 缩进敏感,解析报错 | vimrc 设 expandtab,统一空格缩进 |
| 改完 nginx 配置不 reload 就测试 | 改动未生效,误判「改了没用」 | nginx -t 语法检查 + systemctl reload nginx |
| vimrc/.bashrc 写错导致 vim/shell 启动报错 | 每次打开都刷错误 | vim -u NONE 或 cp /etc/skel/.vimrc 恢复 |
卡点急救
- 卡在 vim 里出不去:连续按几次 Esc → 输入
:q!回车(不保存强退);要保存就:wq。若底部出现输入过的残缺命令,Esc 清掉重来。 - vim 打开二进制文件(如 JAR)全是乱码:立即
:q!退出,别保存。看二进制用strings 文件 | head或xxd 文件 | head。误写坏二进制文件只能重新上传——所以编辑前先确认是文本。 - 误删/误改且已保存:若编辑的是配置且有
.bak直接还原;没有备份时 vim 的:earlier 5m(回到 5 分钟前的内容)或:e!(放弃当前所有修改重读文件)是最后的绳索。 - 终端假死敲什么都没反应:先
Ctrl+q(解除 Ctrl+s 造成的流控锁),无效再从另一个窗口 SSH 进来kill卡住的进程。 - 改完配置服务不生效排查链:① 改的文件对不对(
grep 关键词 配置路径);② 语法对不对(nginx -t);③ 有没有 reload(systemctl reload nginx/daemon-reload);④ 浏览器/CDN 有没有缓存。
面试常问
-
vim 的三种常用模式?如何保存退出与不保存退出? 普通模式(默认,导航与编辑命令)、插入模式(i/a/o 进入,打字)、底行/命令模式(
:引出,如:wq保存退出、:q!不保存强退、:set number设行号)。核心心智:Esc 随时回普通模式。 -
在 vim 中如何把文件里所有 foo 替换为 bar?跳到第 100 行? 全局替换
:%s/foo/bar/g(% 表示全文,g 表示行内所有命中;加 c 每处确认::%s/foo/bar/gc);跳行:100回车或100G。 -
服务器上没有 vim 只有 vi,或你更喜欢 nano,怎么选? 都行,关键是能改、能存、能退。vim 优势在搜索跳行和 sed 式批量编辑;nano 上手零成本。团队协作认 vim 更多(运维脚本、面试默认)。
sudo apt install vim即可补齐。 -
如何不打开文件批量修改配置?举个部署中的例子。
sed -i。例如 CI 发布时替换数据库连接:sed -i 's/DB_HOST=dev/DB_HOST=prod/g' application.properties;改 nginx 监听端口:sed -i 's/listen 8080/listen 80/' site.conf。规范做法是先备份或用版本管理。 -
改了配置文件为什么不生效?给出你的排查顺序。 ① 确认改对了文件(服务加载的可能不是你以为的路径,如 nginx 的 sites-enabled 软链);② 语法检查(
nginx -t);③ 是否执行了重载动作(reload/daemon-reload/source);④ 是否有缓存层(浏览器、CDN、连接池里的旧配置)。
自测三问
- 不保存并退出 vim 的完整按键序列是什么?保存并退出呢?
- 在 vim 中搜索
proxy_pass、跳到文件末尾、删除当前行,分别用什么命令? - 把
default.conf里所有127.0.0.1替换为0.0.0.0(先备份),写出完整命令序列。
小结一句话
vim 用「模式」换来极致效率:Esc 保平安、i 进插入、:wq/:q! 管生死、/ 搜索 G 跳行 dd/yy/p 编辑;批量与自动化交给 sed -i——改配置三步曲永远是「备份 → 修改 → 重载生效」。
延伸
- vim 官方交互教程 vimtutor(终端直接输
vimtutor中文版可练) - Vim 中文文档
- 下一课预告:进程与服务——
nohup起的服务 SSH 一断就死?学 systemd 让你的 JAR 开机自启、崩了自动拉起、日志自动归档,这才是生产级进程管理。