CodeRoad Map 程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。
由 程序员柏风 独立维护 · 关于作者
学习 更多
编辑器与配置
这一课你将能做到
用 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 正式写进去:
在文件末尾 添加(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
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——不打开文件的批量替换 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 一点舒适配置(可选但值得) 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 nginxvimrc/.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——改配置三步曲永远是「备份 → 修改 → 重载生效」。
延伸