Vim 编辑器¶
📌 学习时间:2-3天 📌 难度级别:⭐⭐⭐ 中级 📌 前置知识:Linux基础
📚 章节概述¶
Vim 是 Linux 世界最强大的文本编辑器之一,也是服务器运维的必备技能。本章从 Vim 的三种模式入门,到基础操作、移动命令、搜索替换、多文件编辑、分屏、宏录制、.vimrc 配置和常用插件,最后提供完整的速查表。
🎯 学习目标¶
- 理解 Vim 的三种基本模式
- 掌握基础编辑操作
- 熟练使用移动和跳转命令
- 掌握搜索和替换
- 学会多文件编辑和分屏
- 掌握宏录制和回放
- 能配置 .vimrc 文件
📖 1. Vim 模式¶
Bash
# Vim 有三种基本模式 + 多种扩展模式
# Normal 模式(命令模式)— 默认模式
# 用于导航、删除、复制、粘贴等操作
# 按 Esc 随时回到此模式
# Insert 模式(插入模式)
# 用于输入文本
# 从 Normal 模式进入插入模式:
# i 在光标前插入
# I 在行首插入
# a 在光标后插入
# A 在行尾插入
# o 在下方新开一行插入
# O 在上方新开一行插入
# Visual 模式(可视模式)
# 用于选择文本
# v 字符选择
# V 行选择
# Ctrl+v 块选择(列选择)
# Command-line 模式(命令行模式)
# 按 : 进入,用于执行命令
# :w 保存
# :q 退出
# :wq 保存并退出
# :q! 强制退出不保存
# :x 保存并退出(同 :wq)
# ZZ 保存并退出(Normal 模式快捷键)
# ZQ 不保存退出
📖 2. 基础操作¶
2.1 打开文件¶
Bash
vim file.txt # 打开文件
vim +10 file.txt # 打开并跳到第10行
vim +/pattern file.txt # 打开并跳到匹配处
vim -O file1 file2 # 垂直分屏打开两个文件
vim -o file1 file2 # 水平分屏打开两个文件
vim -R file.txt # 只读模式
2.2 保存和退出¶
Bash
# 命令行模式下(按 : 进入)
:w # 保存
:w filename # 另存为
:w! # 强制保存
:q # 退出
:q! # 强制退出不保存
:wq # 保存并退出
:x # 保存并退出(有修改才写盘)
:e! # 放弃修改,重新读取文件
:saveas newname # 另存为
2.3 插入文本¶
Bash
# Normal → Insert 模式
i # 在光标前插入
I # 在行首插入(第一个非空字符前)
a # 在光标后追加
A # 在行尾追加
o # 在下方新开一行
O # 在上方新开一行
s # 删除光标处字符并进入插入模式
S # 删除整行并进入插入模式
C # 删除从光标到行尾并进入插入模式
2.4 删除操作¶
Bash
# Normal 模式下
x # 删除光标处字符
X # 删除光标前字符(Backspace)
dd # 删除(剪切)整行
dw # 删除到下一个单词开头
de # 删除到单词结尾
d$ # 删除到行尾
d0 # 删除到行首
D # 删除到行尾(同 d$)
3dd # 删除3行
dG # 删除到文件末尾
dgg # 删除到文件开头
2.5 复制和粘贴¶
Bash
yy # 复制(yank)当前行
3yy # 复制3行
yw # 复制一个单词
y$ # 复制到行尾
y0 # 复制到行首
p # 粘贴到光标后/下方
P # 粘贴到光标前/上方
# 与系统剪贴板交互
"+y # 复制到系统剪贴板
"+p # 从系统剪贴板粘贴
"*y # 复制到选择缓冲区(X11)
2.6 撤销和重做¶
📖 3. 移动命令¶
3.1 基础移动¶
Bash
# 字符级
h # 左
j # 下
k # 上
l # 右
5j # 向下移动5行
# 单词级
w # 下一个单词开头
W # 下一个大单词开头(以空白分隔)
b # 前一个单词开头
B # 前一个大单词开头
e # 当前/下一个单词结尾
E # 当前/下一个大单词结尾
# 行内移动
0 # 行首(第一列)
^ # 行首第一个非空字符
$ # 行尾
g_ # 行尾最后一个非空字符
f{char} # 向后查找字符(行内)
F{char} # 向前查找字符
t{char} # 向后查找,停在字符前
T{char} # 向前查找,停在字符后
; # 重复上次 f/F/t/T
, # 反向重复
3.2 屏幕和文件级移动¶
Bash
# 文件级
gg # 文件开头
G # 文件末尾
10G # 跳到第10行
:10 # 跳到第10行
# 屏幕级
H # 屏幕顶部(High)
M # 屏幕中间(Middle)
L # 屏幕底部(Low)
Ctrl+f # 向下翻一页(Forward)
Ctrl+b # 向上翻一页(Backward)
Ctrl+d # 向下翻半页(Down)
Ctrl+u # 向上翻半页(Up)
Ctrl+e # 向下滚动一行
Ctrl+y # 向上滚动一行
zz # 将当前行置于屏幕中央
zt # 将当前行置于屏幕顶部
zb # 将当前行置于屏幕底部
# 段落/句子
{ # 上一段
} # 下一段
( # 上一句
) # 下一句
# 括号匹配
% # 跳到匹配的括号 ()[]{}
3.3 标记(Mark)¶
Bash
ma # 在当前位置设置标记 a
'a # 跳到标记 a 所在行
`a # 跳到标记 a 的精确位置
:marks # 查看所有标记
# 自动标记
'' # 跳到上次跳转前的位置
'. # 跳到上次编辑处
'^ # 跳到上次插入处
📖 4. 搜索和替换¶
4.1 搜索¶
Bash
/pattern # 向下搜索
?pattern # 向上搜索
n # 下一个匹配
N # 上一个匹配
* # 搜索光标下的单词(向下)
# # 搜索光标下的单词(向上)
# 搜索选项(命令行模式设置)
:set hlsearch # 高亮搜索结果
:set nohlsearch # 取消高亮
:noh # 临时取消高亮
:set incsearch # 增量搜索(边输入边搜索)
:set ignorecase # 忽略大小写
:set smartcase # 智能大小写(有大写字母时区分)
4.2 替换¶
Bash
# 替换格式
# :[范围]s/旧文本/新文本/[标志]
:s/old/new/ # 替换当前行第一个
:s/old/new/g # 替换当前行所有
:%s/old/new/g # 替换全文所有
:%s/old/new/gc # 替换全文,逐个确认
:5,10s/old/new/g # 替换第5-10行
:'<,'>s/old/new/g # 替换选中区域(Visual模式选中后按: 自动生成范围)
# 标志
# g — 替换行内所有匹配(不加g只替换第一个)
# c — 确认每次替换
# i — 忽略大小写
# I — 区分大小写
# 实用替换示例
:%s/\s\+$//g # 删除行尾空格
:%s/^\s\+//g # 删除行首空格
:%s/^/# /g # 每行行首添加 "# "
:%s/\n\n\n/\n\n/g # 将三个空行变两个
:%s/\t/ /g # Tab 替换为4个空格
# 使用正则表达式
:%s/\<word\>/WORD/g # 全词匹配替换
:%s/\(foo\)/\U\1/g # 替换并转大写
:%s/\d\+/(&)/g # 数字加括号
📖 5. 多文件编辑¶
5.1 Buffer(缓冲区)¶
Bash
:e file2.txt # 打开另一个文件
:ls # 列出所有 buffer
:b 2 # 切换到 buffer 2
:bn # 下一个 buffer
:bp # 上一个 buffer
:bd # 关闭当前 buffer
:b <Tab> # Tab 补全 buffer 名
5.2 分屏¶
Bash
# 水平分屏
:sp # 水平分割(当前文件)
:sp file2.txt # 水平分割打开新文件
Ctrl+w s # 水平分割快捷键
# 垂直分屏
:vsp # 垂直分割
:vsp file2.txt # 垂直分割打开新文件
Ctrl+w v # 垂直分割快捷键
# 窗口切换
Ctrl+w w # 循环切换窗口
Ctrl+w h/j/k/l # 切换到左/下/上/右窗口
Ctrl+w H/J/K/L # 移动窗口到最左/下/上/右
# 调整窗口大小
Ctrl+w = # 等分窗口
Ctrl+w + # 增加高度
Ctrl+w - # 减少高度
Ctrl+w > # 增加宽度
Ctrl+w < # 减少宽度
:resize 20 # 设置高度为20行
:vertical resize 80 # 设置宽度为80列
# 关闭窗口
Ctrl+w q # 关闭当前窗口
Ctrl+w o # 只保留当前窗口
:only # 同上
5.3 Tab 页¶
Bash
:tabnew # 新建 tab
:tabnew file.txt # 新 tab 打开文件
:tabn # 下一个 tab
:tabp # 上一个 tab
gt # 下一个 tab
gT # 上一个 tab
:tabclose # 关闭当前 tab
:tabonly # 只保留当前 tab
📖 6. 宏录制¶
Bash
# 宏 = 录制一系列操作,然后重复回放
# 录制宏
qa # 开始录制宏到寄存器 a
# ... 执行一系列操作 ...
q # 停止录制
# 回放宏
@a # 执行寄存器 a 中的宏
@@ # 重复上次执行的宏
10@a # 执行宏 10 次
# 实际示例:给每行加引号和逗号
# 原文:
# apple
# banana
# cherry
# 操作:
# qa — 开始录制
# I" — 行首插入 "
# <Esc> — 回到 Normal 模式
# A", — 行尾追加 ",
# <Esc> — 回到 Normal 模式
# j — 移到下一行
# q — 停止录制
# 2@a — 对剩余2行执行宏
# 结果:
# "apple",
# "banana",
# "cherry",
📖 7. 实用功能¶
7.1 代码相关¶
Bash
# 缩进
>> # 向右缩进当前行
<< # 向左缩进当前行
5>> # 缩进5行
>% # 缩进括号之间的内容
= # 自动缩进
gg=G # 全文自动缩进
# 折叠
zf% # 折叠匹配的括号
zo # 打开折叠
zc # 关闭折叠
za # 切换折叠
zR # 打开所有折叠
zM # 关闭所有折叠
# 自动补全
Ctrl+n # 关键字补全(向下选择)
Ctrl+p # 关键字补全(向上选择)
Ctrl+x Ctrl+f # 文件名补全
Ctrl+x Ctrl+l # 整行补全
# 行号
:set number # 显示行号
:set relativenumber # 相对行号
:set nonumber # 关闭行号
7.2 文本对象¶
Bash
# Vim 的文本对象非常强大
# 格式:操作 + i(inner)/a(around) + 对象
# 在括号/引号内操作
ci" # 修改双引号内的内容(change inner ")
ci( # 修改括号内的内容
ci{ # 修改花括号内的内容
ci[ # 修改方括号内的内容
ci' # 修改单引号内的内容
ci` # 修改反引号内的内容
cit # 修改 HTML 标签内的内容
# a 包含分隔符(around)
da" # 删除双引号及其内容
da( # 删除括号及其内容
# 更多文本对象
ciw # 修改当前单词
diw # 删除当前单词
yiw # 复制当前单词
cip # 修改当前段落
dip # 删除当前段落
# 实际场景:修改函数参数
# func("hello", "world")
# 光标在 hello 上,按 ci" 即可输入新参数
📖 8. .vimrc 配置¶
VimL
" ~/.vimrc — Vim 配置文件
" ========== 基础设置 ==========
set nocompatible " 不兼容 vi
set encoding=utf-8 " UTF-8 编码
set fileencoding=utf-8
set termencoding=utf-8
" ========== 界面设置 ==========
set number " 显示行号
set relativenumber " 相对行号
set cursorline " 高亮当前行
set showcmd " 显示输入的命令
set showmode " 显示模式
set ruler " 显示光标位置
set laststatus=2 " 总显示状态栏
set wildmenu " 命令行增强补全
set scrolloff=5 " 光标距上下保持5行
syntax on " 语法高亮
" ========== 搜索设置 ==========
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 搜索忽略大小写
set smartcase " 智能大小写
" ========== 缩进设置 ==========
set tabstop=4 " Tab 显示为4个空格
set shiftwidth=4 " 缩进4个空格
set expandtab " Tab 转为空格
set autoindent " 自动缩进
set smartindent " 智能缩进
filetype plugin indent on " 文件类型检测和对应缩进
" ========== 编辑设置 ==========
set backspace=indent,eol,start " 退格键正常工作
set mouse=a " 启用鼠标
set clipboard=unnamedplus " 使用系统剪贴板
set autoread " 文件变化自动读取
set hidden " 允许切换 buffer 时不保存
set confirm " 退出时确认保存
" ========== 性能设置 ==========
set lazyredraw " 宏执行时不重绘
set ttyfast " 快速终端
" ========== 文件设置 ==========
set nobackup " 不创建备份文件
set noswapfile " 不创建交换文件
set undofile " 持久化撤销历史
set undodir=~/.vim/undodir
" ========== 快捷键映射 ==========
" Leader 键设为空格
let mapleader=" "
" 快速保存
nnoremap <leader>w :w<CR>
" 快速退出
nnoremap <leader>q :q<CR>
" 取消搜索高亮
nnoremap <leader>n :noh<CR>
" 分屏切换
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" 快速移动行
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv
📖 9. Vim 速查表¶
Text Only
=== 模式切换 ===
i/I/a/A/o/O → Insert模式
v/V/Ctrl+v → Visual模式
: → 命令行模式
Esc → Normal模式
=== 保存退出 ===
:w 保存 :q 退出 :wq 保存退出 :q! 强制退出
=== 移动 ===
h/j/k/l 左/下/上/右
w/b/e 词首-下/词首-前/词尾
0/^/$ 行首/非空行首/行尾
gg/G 文件首/文件尾
Ctrl+f/b 翻页 下/上
H/M/L 屏幕 顶/中/底
% 匹配括号跳转
=== 编辑 ===
x 删除字符 dd 删除行
yy 复制行 p 粘贴
u 撤销 Ctrl+r 重做
. 重复上次操作
ci"/ci(/ciw 修改引号内/括号内/单词
=== 搜索替换 ===
/pattern 搜索 n/N 下一个/上一个
:%s/old/new/g 全局替换
=== 分屏 ===
:sp/:vsp 水平/垂直分屏
Ctrl+w h/j/k/l 切换窗口
Ctrl+w q 关闭窗口
=== 宏 ===
qa 录制到a q 停止 @a 回放
📖 10. 面试要点¶
Q1:如何在 Vim 中全局替换?
:%s/old/new/g—%表示全文,s是替换命令,g表示每行所有匹配。加c标志可逐个确认::%s/old/new/gc。
Q2:如何快速跳到文件第100行?
Normal 模式下输入
100G或命令行模式:100。
Q3:Vim 中如何同时编辑多个文件?
方法1:
:e file2打开新文件,:ls查看,:bn/:bp切换。方法2::vsp file2分屏打开。方法3::tabnew file2新 tab 打开。
🔧 练习题¶
- 使用 Vim 创建一个 Shell 脚本,练习插入、删除、复制粘贴
- 使用搜索和替换,将文件中所有
http://替换为https:// - 练习分屏编辑两个文件
- 录制一个宏,将多行文本格式化为 CSV 格式
- 配置自己的 .vimrc 文件
✅ 自我检查¶
- 理解 Normal/Insert/Visual 三种模式
- 能流畅使用 hjkl 和 w/b/e 移动
- 掌握搜索和替换
- 会使用分屏编辑
- 能录制和回放宏
- 配置了自己的 .vimrc
上一章:09-包管理与软件安装 下一章:11-实战项目