Skip to content

Vim 编辑器

服务器上改配置没有图形界面,SSH 终端里能用的编辑器只有命令行的。Vim 是几乎所有 Linux 发行版的默认编辑器,但它的操作逻辑跟桌面文本编辑器完全不一样——不是打开就能打字,而是分模式操作。第一次用 Vim 的人最常遇到的就是"我进来了,但不知道怎么打字,更不知道怎么退出",卡在终端里只能强关窗口。

一、模式

Vim 有三个常用模式,不同模式下同一个按键的含义完全不同。这是 Vim 跟普通编辑器最大的区别,也是新人最容易懵的地方。

模式怎么进入干什么用
普通模式Esc移动光标、复制粘贴、删除、执行命令
插入模式iao输入和修改文本
命令模式普通模式下按 :保存、退出、搜索替换、设置

打开文件之后默认是普通模式,不能直接打字。如果不知道当前在什么模式,按一下 Esc 回到普通模式——这是个安全基准,从普通模式出发什么操作都能做。

bash
vim /etc/hosts

最最基础的退出操作,务必记住:

vim
:w          " 写入(保存)
:q          " 退出
:wq         " 保存并退出
:q!         " 强制退出,不保存修改

给新人的一条救命准则:不管你刚才误触了什么键导致界面变成什么样,先按 Esc 回到普通模式,再输入 :q! 就能安全退出(不保存任何改动)。这条比什么都实用,刚接触 Vim 的时候靠它避免了好多次"卡死在 Vim 里只能重开终端"的尴尬。

二、光标移动

普通模式下的光标移动:

移动方向
h j k l左 下 上 右
gg跳到文件开头
G跳到文件末尾
0当前行行首
$当前行行尾
w下一个单词开头
b上一个单词开头

h j k l 这四个键排成一排,熟练之后手不用离开主键区,效率比方向键高。不过现代终端里方向键一般也能用,刚开始记不住 hjkl 用方向键也没问题,慢慢就习惯了。记忆口诀可以这样记:j 像个向下的钩子(往下),kj 上面(往上)。

跳到指定行号:

vim
:120          " 跳到第 120 行

排查报错的时候这个特别有用——错误信息通常会告诉你在第几行(nginx: [emerg] ... in /etc/nginx/nginx.conf:42),直接 :42 跳过去,比一页页翻快多了。

三、编辑操作

从普通模式进入插入模式(开始打字)的几种方式:

效果
i在光标前插入
a在光标后插入
o在下面新建一行并进入插入模式
O在上面新建一行并进入插入模式

o 这个键很常用——想在当前行下面加一行新内容,按 o 直接开新行进入插入模式,不用先移到行尾再回车。

普通模式下的删除和复制(这些操作不需要进入插入模式):

命令效果
x删除光标处字符
dd删除整行(并放到剪贴板)
yy复制整行
p在光标后粘贴
u撤销上一步
Ctrl+r重做(取消撤销)

数字前缀可以批量执行,比如:

vim
5dd         " 删除 5 行
3yy         " 复制 3 行
10x         " 删除 10 个字符

这个"数字+命令"的组合是 Vim 效率的核心之一,熟练之后比反复按同一个键快得多。

四、搜索和替换

普通模式下按 / 进入搜索:

vim
/listen          " 搜索 "listen"

n 跳到下一个匹配,N 跳到上一个。查配置里的某个指令(比如 listenserver_nameproxy_pass)用搜索最快。

替换操作用 :s 命令,记住几个常用形态:

vim
:s/old/new/           " 替换当前行第一个匹配
:s/old/new/g          " 替换当前行所有匹配
:%s/old/new/g         " 替换整个文件所有匹配
:%s/old/new/gc        " 替换前逐个确认(c = confirm)

改线上配置文件的时候,替换 IP、域名、路径这类内容,建议带 c(确认)。全文替换一旦替换错了,影响面比手工一行行改大得多——比如你想把旧 IP 10.0.0.1 换成新 IP,结果配置里还有个 10.0.0.10 也被误匹配了,服务直接连错地方。带 c 一个个确认,慢一点但安全。

五、可视模式

可视模式用来选中文本块,选中之后再做批量操作(删除、复制、替换、注释)。

进入哪种模式
v按字符选择
V按行选择
Ctrl+v按列块选择(块可视模式)

块选择在批量注释多行时特别好用,比如临时注释掉一段配置:

vim
Ctrl+v          " 进入块选择模式
选择多行(用 j/k 移动光标)
I               " 按 Shift+i,在选中块的行首插入
#               " 输入注释符
Esc             " 按两次 Esc,应用到所有选中行

这套操作适合临时注释掉一段配置做测试。不过正式的配置变更还是要保留备份文件——u 撤销不是可靠的回滚方案,万一 Vim 进程异常退出或者你不小心保存了,撤销记录就没了。

六、多文件和分屏

同时打开多个文件:

bash
vim nginx.conf default.conf

文件之间切换:

vim
:n              " 下一个文件
:prev           " 上一个文件
:ls             " 列出所有打开的 buffer
:b 2            " 切换到编号为 2 的 buffer

分屏显示,对照两个文件改配置的时候很有用:

vim
:sp file        " 上下分屏(horizontal split)
:vsp file       " 左右分屏(vertical split)

分屏之间移动光标:Ctrl+w 之后再按方向键(h j k l),或者用 Ctrl+w w 在窗口之间循环切换。

七、基础配置

Vim 的个人配置放在 ~/.vimrc 里。服务器上的 Vim 配置建议保持简单,接近默认就行——配置太花哨,换一台新机器没有你的 .vimrc 就不会用了,反而别扭。运维场景下能舒服地改配置就够了,不需要装各种插件。

几条实用的基础配置:

vim
set number              " 显示行号
set tabstop=4           " Tab 显示为 4 个空格宽度
set shiftwidth=4        " 自动缩进宽度
set expandtab           " 输入 Tab 时自动转成空格
set ignorecase          " 搜索忽略大小写
set smartcase           " 搜索内容有大写时自动区分大小写
set hlsearch            " 高亮搜索结果
syntax on               " 语法高亮

expandtab 这条要特别注意——Python 和 YAML 配置文件对缩进极敏感,Tab 和空格混用直接报语法错误。改 Kubernetes YAML 或者 Ansible 配置的时候,如果不小心混进了 Tab,排查半天才发现是缩进问题,非常浪费时间。expandtab 强制 Tab 转空格,能从根上避免这个坑。