跳转至

Vim 编辑器

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 撤销和重做

Bash
u         # 撤销(Undo)
U         # 撤销当前行的所有修改
Ctrl+r    # 重做(Redo)
.         # 重复上一次操作(非常强大!)

📖 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 打开。


🔧 练习题

  1. 使用 Vim 创建一个 Shell 脚本,练习插入、删除、复制粘贴
  2. 使用搜索和替换,将文件中所有 http:// 替换为 https://
  3. 练习分屏编辑两个文件
  4. 录制一个宏,将多行文本格式化为 CSV 格式
  5. 配置自己的 .vimrc 文件

✅ 自我检查

  • 理解 Normal/Insert/Visual 三种模式
  • 能流畅使用 hjkl 和 w/b/e 移动
  • 掌握搜索和替换
  • 会使用分屏编辑
  • 能录制和回放宏
  • 配置了自己的 .vimrc

上一章09-包管理与软件安装 下一章11-实战项目