vim —— 远程编辑必备最小集
一句话定义
vim 是 Linux 上几乎一定有的编辑器(远端机器没 VS Code、没图形)。这篇不教你 vim 全功能——只讲"运维场景下足够用的 30%":进/出文件、增删改查、保存退出、救命操作。
典型场景
- 远端改
/etc/ssh/sshd_config - 看
/var/log/...的日志 - 改 yaml manifest
- 紧急救命模式(系统启不来、只剩 console)
想学完整 vim →
vimtutor(每个 vim 自带)。想替代 vim → 配nano/micro(更傻瓜但远端不一定有)。
装 / 看版本
vim --version | head
发行版默认通常有 vim-tiny(精简)。装完整版:
apt install -y vim # Ubuntu / Debian
yum install -y vim-enhanced # CentOS / RHEL
精简版(vi)没有语法高亮、没 visual 模式、有些坑。vim 装上后 alias vi=vim。
核心:三个模式
vim 反人类的根源——它有模式:
┌─────────────┐
│ Normal mode │ ← 默认进入这里。命令、移动、删除
└──┬──────────┘
│ i / a / o / I / A / O
▼
┌─────────────┐
│ Insert mode │ ← 真正"输入文字"
└──┬──────────┘
│ Esc
▼
(回到 Normal)
│ :
▼
┌────────────────┐
│ Command mode │ ← :w, :q, :wq, :%s/.../.../
└────────────────┘
Esc 永远回到 Normal mode。卡了就疯狂按 Esc。
现代 vim 也支持鼠标和方向键 —— 但学规范键位更快(hjkl)。
一句话救命指南
打开了 vim 不知道怎么退出:
Esc Esc Esc ← 确保在 Normal 模式
: ← 进 command 模式
q! ← 不保存退出
Enter
:q! 是放弃所有改动退出。这一条记牢——其它都是建立在这之上。
打开 / 保存 / 退出
vim file.txt # 打开(不存在就新建)
vim +50 file.txt # 直接跳到第 50 行
vim +/pattern file.txt # 直接跳到匹配 pattern 的位置
vim file1 file2 file3 # 打开多个(用 :n / :prev 切换)
进入 vim 后:
| 命令 | 作用 |
|---|---|
:w | 保存 |
:w newname | 另存为 |
:q | 退出 |
:wq 或 ZZ | 保存 + 退出 |
:q! | 不保存退出 |
:wq! | 强制保存 + 退出(只读文件用,前提是有权限) |
:e file | 打开另一个文件 |
:e! | 放弃改动 reload 当前文件 |
Normal 模式:移动
| 键 | 移动 |
|---|---|
h j k l | 左 下 上 右(方向键也能用) |
w / b | 下一个/上一个单词开头 |
e | 下一个单词末尾 |
0 | 行首 |
^ | 第一个非空字符 |
$ | 行尾 |
gg | 文件第一行 |
G | 文件最后一行 |
50G 或 :50 | 跳到第 50 行 |
Ctrl-f / Ctrl-b | 翻页(Forward / Back) |
Ctrl-d / Ctrl-u | 半页(Down / Up) |
% | 配对的括号 |
最重要 5 个:hjkl 移动、0 行首、$ 行尾、gg 顶、G 底。
进入 Insert 模式(真正输入文字)
| 键 | 作用 |
|---|---|
i | 光标前插入 |
a | 光标后插入 |
I | 行首插入 |
A | 行尾插入 |
o | 下一行新建并进入插入 |
O | 上一行新建并进入插入 |
按完进入插入模式、像普通编辑器一样输入。Esc 退回 Normal。
删除 / 复制 / 粘贴
| 命令 | 作用 |
|---|---|
x | 删当前字符 |
dd | 删整行 |
5dd | 删 5 行 |
dw | 删一个单词 |
d$ | 从光标删到行尾 |
D | 同 d$ |
d0 | 从光标删到行首 |
yy | 复制(yank)整行 |
5yy | 复制 5 行 |
yw | 复制单词 |
p | 粘贴在光标后 |
P | 粘贴在光标前 |
记忆:
d= delete(剪切,自动放剪贴板)y= yank(复制)- 加数字 + 动作 = 重复 N 次
撤销 / 重做
| 命令 | 作用 |
|---|---|
u | 撤销 |
Ctrl-r | 重做 |
. | 重复上一个操作(vim 杀手锏) |
. 是 vim 比 nano 强的根本——比如想给 100 行末尾加分号,先 A;<Esc> 一行做完、再 j. 一次重复一行。
查找 / 替换
查找
/pattern 前向找 pattern
?pattern 反向找
n 下一个匹配
N 上一个匹配
/error 找 "error"
n n n 继续找下一个
替换(改配置必备)
:s/old/new/ 当前行第一个
:s/old/new/g 当前行全部
:%s/old/new/g 全文件全部 ← 最常用
:%s/old/new/gc 全文件全部、每次确认
:1,10s/old/new/g 1-10 行全部
% 是"全文件"。g 是"一行内全部"。
例子:把配置里所有 PasswordAuthentication yes 改 no:
:%s/PasswordAuthentication yes/PasswordAuthentication no/g
但这种生产改配置首选 sed 而不是 vim 交互——可重复 / 可脚本化。
看大文件
vim huge.log # 一般 vim 能开几 GB(用 SwapFile 缓冲)
大日志推荐 less / tail,vim 会全文件 hash / 索引、慢。
less 模式
view huge.log # 等价 vim -R(只读模式)
或者直接 less huge.log(less 不是 vim、但很多键位类似)。
visual 模式(可视区块选择)
| 键 | 作用 |
|---|---|
v | 字符级选择 |
V | 行级选择 |
Ctrl-v | 矩形块选择(列编辑用) |
选完之后:
d删y复制>缩进<反缩进:s/.../.../在选中区跑替换
列编辑(K8s yaml 缩进调整必用):
Ctrl-v # 进矩形选择
方向键选中要改的列
I (大写) # 在前面插入
输入要插的字符
Esc # 应用到所有选中行
缩进
>> # 当前行右缩进 1 个 shiftwidth
<< # 左缩进
5>> # 5 行右缩进
=G # 从当前行到文件末尾、自动缩进(**改完 yaml 重排必用**)
gg=G # 全文件自动重缩进
多文件 / 多窗口
vim file1 file2 file3
:n 下一个文件
:prev 上一个
:ls 列已打开
:sp file 水平分屏打开
:vsp file 垂直分屏
Ctrl-w hjkl 在窗口间切
Ctrl-w q 关当前窗口
一份运维实用 ~/.vimrc
" 基本
syntax on
set number " 行号
set relativenumber " 相对行号(移动方便)
set hlsearch " 搜索高亮
set incsearch " 边输入边找
set ignorecase " 忽略大小写
set smartcase " 含大写就大小写敏感
" 缩进
set tabstop=4
set shiftwidth=4
set expandtab " tab 转空格
set autoindent
filetype plugin indent on
" yaml 专用:2 空格
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2 expandtab
autocmd FileType yml setlocal tabstop=2 shiftwidth=2 expandtab
" Makefile 例外:保留 TAB
autocmd FileType make setlocal noexpandtab
" 文件历史 / 撤销
set undofile
set undodir=~/.vim/undo
" 编码
set encoding=utf-8
" mouse
set mouse=a
" 让 Esc 在 K8s yaml 等编辑时不卡
set ttimeoutlen=10
" 显示行尾空格 / tab
set list listchars=tab:▸\ ,trail:·
放 ~/.vimrc。
实战例子
1. 紧急修 fstab(系统起不来)
物理 console 进 emergency mode:
mount -o remount,rw /
vim /etc/fstab
# 用 `dd` 删除出错的行,或者 / 前面加 # 注释
:wq
reboot
2. 改 yaml manifest
vim deployment.yaml
# 找镜像版本
/image:
# 跳到行
A # 行尾插入
# 改完 Esc
:wq
或者用 sed 更快 —— vim 适合"复杂改、要看上下文"。
3. 看 K8s 配置文件
vim /etc/kubernetes/admin.conf
:set nowrap # 不自动换行
:set list # 显示 tab / 空格
# 看完 :q 走人
4. 比较两个文件
vimdiff file1 file2
# 或
vim -d file1 file2
左右对比。do 把右边改动接受到左边、dp 反过来。
常见踩坑
坑 1:进不去就出不来
vim file
# 屏幕黑了,键盘没反应
90% 是在 Normal 模式但你不知道。Esc Esc Esc,然后 :q! 退出。
坑 2:误改了只读文件
:w
E45: 'readonly' option is set (add ! to override)
:w! # 强制写(需要文件系统权限)
如果是 / 只读 mount(emergency mode):先 mount -o remount,rw /。
坑 3:Caps Lock 当成 Esc 用让 vim 难用
按完 Esc 必须每次都到键盘左上 → 反人类。
修:把 Caps Lock 映射成 Ctrl(更通用)/ 或者用 jj / jk 当 Esc:
inoremap jk <Esc> " 插入模式按 jk 等于 Esc
坑 4:粘贴时缩进炸了
# 复制一段已缩进的 yaml 进 vim
# vim 自动缩进 → 缩进变得乱七八糟
:set paste " 进入 paste 模式
# 粘贴
:set nopaste " 退出
或者在 .vimrc 里:
set pastetoggle=<F2> " F2 切换 paste
新 vim 8+ 配合 bracketed paste 模式不需要这个。
坑 5:vimrc 改完 vim 起不来
vim
# 报错某个插件不存在
vim -u NONE file " 跳过加载 vimrc
# 或
vim -u NONE -N file " 跳过 vimrc 但启用 vim 模式
修 vimrc 之后再正常用。
坑 6:远端 vim 颜色不对
echo $TERM
# screen-256color / xterm
export TERM=xterm-256color
vim ...
或者 .tmux.conf 里设(详见 tmux.md)。
坑 7:swap 文件冲突
vim /etc/sshd_config
# E325: ATTENTION
# Found a swap file by the name "/etc/.sshd_config.swp"
上次 vim 异常退出留下 swap。R 恢复 / D 删除 / A 取消。通常 D 删。
坑 8:误把日志打开导致 vim 卡死
vim 10gb.log
# 卡几分钟
大日志用 less / tail,不要 vim:
less 10gb.log
vim 真要看:vim -R file(只读模式快些)。
坑 9:忘了 root 没 vimrc
sudo vim /etc/foo.conf
# 没颜色、缩进乱
sudo vim 用 root 的 vimrc(没 vimrc 时用默认)。要带自己的:
sudo -E vim ... " 保留环境
# 或
sudo HOME=$HOME vim ...
或者把自己 .vimrc 复制到 /root/。
坑 10:在 vim 里运行 shell 命令
需要临时跑 shell 命令但不退 vim:
:!ls " 跑 ls
:!kubectl get pods " 跑 kubectl
:r !date " 把 date 输出读进文件
! 是 vim 的 shell 执行。
替代:nano / micro
| 编辑器 | 特点 |
|---|---|
vim | 强大、普及、学习陡 |
nano | 傻瓜、底部菜单提示 / 多数发行版默认有 |
micro | 现代 nano、和桌面快捷键一致 |
emacs | 另一派、运维场景少见 |
紧急救命想用 nano:
nano file.conf
# 底部菜单提示 Ctrl-O 保存、Ctrl-X 退出 / 直观
但 nano 在精简发行版可能没装、远端不一定能用。至少要会 vim 退出。