找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖
Claude、GPT 海外模型 API 接入Claude skills 从入门到精通 吴恩达亲授 AI Agent 核心技能2026 瞪哥公务员考试全攻略 行测申论一站式系统备考
Agent 文心智能蒸馏模型实战 90G 课程智泊 AI 大模型训练营 基于 LangChain 的 RAG 与提示工程实战构建企业级 AI 大脑:大模型微调与 RAG / Agent 全栈实战

6116

积分

0

好友

786

主题
发表于 1 小时前 | 查看: 1| 回复: 0

一、问题背景

Vim 是每个 Linux 运维、DBA、后端工程师绕不开的工具。哪怕你不是天天写代码,看日志、改配置、写脚本、排错 几乎都要碰 Vim。可大多数人对 Vim 的印象还停留在“按 i 进入编辑、ESC 退出、:wq 保存退出”这一层,剩下的全靠 ↑↓←→ 和方向键慢慢摸。

熟练 Vim 的好处非常直接:

  • 编辑速度从分钟级压到秒级
  • 远程服务器上没法装 IDE,唯一能用的就是 Vim
  • 大文件编辑效率吊打 nano、sed
  • 配置文件改错可以一键 undo

肌肉记忆不是靠背,是靠练。下面这 20 个技巧选的是最高频、最有杠杆效应的动作,每天花 10 分钟连续练三天就能基本定型。

二、适用场景

  • 远程服务器改配置、改脚本
  • 看日志、过滤日志、统计日志
  • 写 shell、Python、yaml、ini
  • 编辑大文件(GB 级)
  • 在容器内调试
  • 在 CI 流水线 出错时手动改代码
  • 应急救援时没有 IDE
  • 老旧系统只有 Vi
  • 面试被问到 Vim
  • 团队 vimrc 不一致时的统一配置
  • 嵌入式设备调试
  • 文本处理(替代 awk、sed 简单场景)
  • 代码 review 时标注
  • 写 Markdown、技术文档

三、核心知识点

3.1 Vim 的四个模式

Vim 不是单一编辑器,而是模式化编辑器:

  1. Normal(普通模式):默认模式,移动光标、操作文本
  2. Insert(插入模式):i/a/o 进入,输入字符
  3. Visual(可视化模式):v/V/Ctrl-v,选择文本
  4. Command(命令模式):: 进入,执行命令

另外还有 Replace(替换模式):R 进入。

3.2 模式之间的切换

  • i:插入到光标前
  • a:插入到光标后
  • o:在下方新行插入
  • O:在上方新行插入
  • I:在行首插入
  • A:在行尾插入
  • ESC:从任意模式回 Normal
  • Ctrl-[:ESC 的等价快捷键

3.3 Normal 模式下的核心动作

  • 光标移动:h/j/k/l
  • 词移动:w/b/e
  • 行首行尾:0/$/^
  • 上下翻页:Ctrl-u/Ctrl-d
  • 文件首尾:gg/G
  • 字符查找:f/t + char
  • 行内查找:F/T + char
  • 删除:d + motion
  • 复制:y + motion
  • 粘贴:p/P
  • 撤销:u/Ctrl-r

3.4 数字前缀的力量

Vim 几乎所有命令都可以加数字:

  • 5j:下移 5 行
  • 3w:前进 3 个词
  • 2dd:删除 2 行
  • 4yy:复制 4 行
  • 10G:跳到第 10 行

数字前缀是 Vim 提速的核心。

3.5 operator + motion

Vim 的核心是 operator + motion:

  • d:delete
  • y:yank(复制)
  • c:change(删除 + 进入插入模式)
  • >:缩进
  • <:反缩进
  • v:visual

motion 是动作范围:

  • w:词
  • $:到行尾
  • 0:到行首
  • G:到文件尾
  • gg:到文件首
  • /pattern:到下一个匹配
  • ?pattern:到上一个匹配

3.6 text object

text object 是 Vim 的另一个杀器:

  • iw:inner word(当前词)
  • aw:a word(含空格)
  • i":inner " " 内容
  • a":含 " " 的内容
  • i):括号内
  • it:tag 内(HTML/XML)

3.7 寄存器和宏

  • 默认寄存器:无名 "
  • 命名寄存器:a-z
  • 系统剪贴板:+(需 vim-x11 或 vim-gtk)
  • 黑洞寄存器:_(丢弃内容)
  • 录制宏:q + 字母 开始,q 结束,@ + 字母 执行

3.8 窗口与缓冲区

  • :split:水平切窗
  • :vsplit:垂直切窗
  • Ctrl-w + 方向键:切换窗口
  • :tabnew:新建标签页
  • gt/gT:切换标签页
  • :b:切换到第 N 个缓冲区

3.9 命令历史

Vim 会记住你的命令历史:

  • q/:搜索历史
  • q::命令历史
  • q?:搜索历史(旧语法)

四、整体学习路径

按下面的顺序练,每个动作每天练 10 次:

第一周:模式切换 + 基础移动(i/a/o、ESC、hjkl、0/$、gg/G)

第二周:operator + motion(d/y/c + 各种 motion)

第三周:text object + 数字前缀

第四周:搜索替换 + 寄存器 + 宏

第五周起:配置、插件、组合技

把每天的高频操作全部走一遍,三周就能形成肌肉记忆。

五、20 个肌肉记忆技巧

下面这 20 个,按“高频 + 高杠杆”排序。

技巧 1:模式切换用 i/a/o/O/I/A + ESC,不要用方向键

不要用 ↑↓←→ 移动光标,那会浪费大量按键。用 h/j/k/l。

进入插入模式的最佳位置:

  • i:当前位置前
  • a:当前位置后
  • o:下方新行
  • O:上方新行
  • I:行首
  • A:行尾

ESC 可以按 Ctrl-[,更快。

肌肉记忆:每次想“开始打字”就 i,要“换一行继续”就 o,要“在这一行结尾加东西”就 A。

技巧 2:hjkl 移动,不要用方向键

hjkl 移动的好处:

  • 不需要离开主键区
  • 距离短
  • 与其他快捷键组合方便

练法:把方向键当成“作弊器”,强迫自己用 hjkl。两天就能改掉。

肌肉记忆:移动光标 = hjkl。

技巧 3:词移动 w/b/e,比 hjkl 跨多个字符快

  • w:到下一个词首
  • b:到上一个词首
  • e:到当前/下一个词尾

对于长变量名、长行,w 比 j 效率高 5-10 倍。

肌肉记忆:跨多字符 = w/b/e。

技巧 4:行内跳转 0/$/^,比 END/HOME 键快

  • 0:行首
  • $:行尾
  • ^:行首第一个非空白字符

肌肉记忆:行首 = 0,行尾 = $,第一个字符 = ^。

技巧 5:文件级跳转 gg/G

  • gg:到文件首
  • G:到文件尾
  • NG:到第 N 行
  • :N:同样到第 N 行

肌肉记忆:到文件头 = gg,到文件尾 = G。

技巧 6:f/F/t/T 字符跳转

  • fX:到行内下一个 X 字符
  • FX:到行内上一个 X 字符
  • tX:到行内下一个 X 字符前
  • TX:到行内上一个 X 字符后

加 ; 重复 f,逗号 , 反向重复。

例如:df;a 表示跳到下一个分号然后删除到行尾(简化版写法)。

肌肉记忆:在行内找字符 = f/F/t/T。

技巧 7:删除 d + motion(dw、d$、d0、dd)

  • dd:删除当前行
  • dw:删除到下一个词首
  • d$:删除到行尾
  • d0:删除到行首
  • 3dd:删除 3 行
  • dG:删除到文件尾

肌肉记忆:删除 = d + 范围。

技巧 8:复制 y + motion(yw、y$、yy)

  • yy:复制当前行
  • yw:复制一个词
  • y$:复制到行尾
  • yG:复制到文件尾

肌肉记忆:复制 = y + 范围。

技巧 9:粘贴 p/P

  • p:粘贴到光标后(行下)
  • P:粘贴到光标前(行上)

粘贴行为会按删除/复制的内容自动调整。

肌肉记忆:粘贴 = p。

技巧 10:撤销与重做 u/Ctrl-r

  • u:撤销
  • Ctrl-r:重做
  • U:撤销当前行的所有改动

肌肉记忆:u 是“后悔药”。

技巧 11:搜索 / + n/N

  • /pattern:向下搜
  • ?pattern:向上搜
  • n:下一个匹配
  • N:上一个匹配
  • *:搜索光标下的词(向下)
  • #:搜索光标下的词(向上)

肌肉记忆:搜索 = / + Enter,跳转 = n。

技巧 12:替换 :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。

技巧 13:可视化选择 v/V/Ctrl-v

  • v:字符可视化
  • V:行可视化
  • Ctrl-v:块可视化(矩形)

选中后可以:

  • d:删除
  • y:复制
  • >:缩进
  • :命令:对选中区域执行

Ctrl-v 块选择是注释、编辑多行的利器。

肌肉记忆:v 选字符,V 选行,Ctrl-v 选块。

技巧 14:缩进 >> 和 <<

  • >>:缩进当前行
  • <<:反缩进
  • > motion:缩进一个范围
  • 在 V 模式下 > 缩进选中行

肌肉记忆:缩进 = >>,反缩进 = <<。

技巧 15:插入模式下的快捷键

  • Ctrl-h:删除前一个字符(等同 backspace)
  • Ctrl-w:删除前一个词
  • Ctrl-u:删除到行首
  • Ctrl-a:插入上一个 insert 的内容
  • Ctrl-e:插入下一行同列内容
  • Ctrl-r + 寄存器:插入寄存器内容

例如 Ctrl-r " 插入无名寄存器。

肌肉记忆:插入模式下的 Ctrl 键是隐藏快捷键。

技巧 16:寄存器 " + 命令

  • "ayy:复制当前行到寄存器 a
  • "ap:粘贴寄存器 a 的内容
  • "+yy:复制到系统剪贴板
  • "+p:从系统剪贴板粘贴
  • "_d:删除到黑洞(不污染剪贴板)

在写脚本时,多寄存器能极大减少切换。

肌肉记忆:寄存器 = " + 字母。

技巧 17:宏 q + 字母 + q + @ + 字母

录制宏:

  1. q + 字母(如 qa):开始录制到寄存器 a
  2. 执行操作
  3. q:结束录制
  4. @a:执行宏
  5. @@:重复执行上一个宏
  6. 数字 + @a:执行多次

例:把每一行的末尾加分号:

qa
A;<Esc>
q
:%normal @a

肌肉记忆:宏 = q + 字母 + 操作 + q + @ + 字母。

技巧 18:窗口 :split / :vsplit / Ctrl-w

  • :split:水平切窗
  • :vsplit:垂直切窗
  • :split file:水平切窗并打开文件
  • Ctrl-w + h/j/k/l:切换窗口
  • Ctrl-w + w:循环切换窗口
  • Ctrl-w + c:关闭当前窗口
  • Ctrl-w + =:等分窗口

肌肉记忆:分屏 = :vsplit,切换 = Ctrl-w。

技巧 19:常用 :! 与 :r 执行 shell

  • :!command:执行 shell 命令
  • :r !command:把命令输出读入文件
  • :r file:读入文件内容

例如 :!ls 执行 ls,:r !date 把当前日期插入到光标位置。

肌肉记忆:临时执行命令 = :!。

技巧 20:常用设置 set

:set nu              " 显示行号
:set relativenumber  " 相对行号(移动神器)
:set hlsearch        " 高亮搜索
:set incsearch       " 增量搜索
:set ignorecase      " 忽略大小写
:set smartcase       " 智能大小写(大写含大写时精确)
:set tabstop=4       " Tab 显示宽度
:set shiftwidth=4    " 缩进宽度
:set expandtab       " Tab 转空格
:set autoindent      " 自动缩进
:set cursorline      " 高亮当前行
:set showmatch       " 显示配对括号
:set laststatus=2    " 总是显示状态栏
:set scrolloff=5     " 光标上下留 5 行
:syntax on           " 语法高亮
:filetype on         " 文件类型检测

肌肉记忆::set 是配置神器,常用配置放在 .vimrc。

六、常用的 .vimrc 配置

6.1 基础配置

" 基础设置
set nocompatible
syntax on
filetype on
filetype plugin indent on

set encoding=utf-8
set fileencoding=utf-8

set number
set relativenumber
set cursorline
set scrolloff=5

set showmatch
set showcmd

set ignorecase
set smartcase
set incsearch
set hlsearch

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab

set autoindent
set smartindent

set laststatus=2
set ruler

set wildmenu
set wildmode=longest:list,full

set backspace=indent,eol,start
set history=1000

set ttimeoutlen=100
set notimeout ttimeout

6.2 键位映射

" 快速移动
nnoremap <C-j> 5j
nnoremap <C-k> 5k
nnoremap <C-h> 5h
nnoremap <C-l> 5l

" 快速保存
nnoremap <C-s> :w<CR>
inoremap <C-s> <Esc>:w<CR>a

" 快速退出
nnoremap <C-q> :wq<CR>

" 清除搜索高亮
nnoremap <Esc><Esc> :nohlsearch<CR>

" 翻页
nnoremap <C-d> <C-d>
nnoremap <C-u> <C-u>

" 块编辑
vnoremap <C-c> "+y
vnoremap <C-x> "+x

" 自动补全
inoremap <C-n> <C-n>
inoremap <C-p> <C-p>

" 切换 buffer
nnoremap <Tab> :bnext<CR>
nnoremap <S-Tab> :bprevious<CR>

6.3 主题与外观

" 颜色
colorscheme desert
" 或
colorscheme molokai
" 或
colorscheme solarized

" 字体
set guifont=Monaco:h13

6.4 文件类型配置

" Python
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType python setlocal textwidth=79

" Shell
autocmd FileType sh setlocal tabstop=2 shiftwidth=2 expandtab

" YAML
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2 expandtab

" Markdown
autocmd FileType markdown setlocal textwidth=0 wrapmargin=0

6.5 自动命令

" 去除 Windows 换行
autocmd BufRead * set fileformat=unix

" 退出时自动保存 session
autocmd VimLeavePre * mksession! ~/.vim/session.vim

" 进入目录自动加载 session
autocmd VimEnter * silent! source ~/.vim/session.vim

七、常用命令

7.1 基础命令

:e <file>          " 打开文件
:w                 " 保存
:q                 " 退出
:wq                " 保存退出
:q!                " 强制退出
:x                 " 保存退出(无改动时不改 mtime)
:e!                " 放弃改动重新加载
:r <file>          " 读入文件
:r! <cmd>          " 读入命令输出
:! <cmd>           " 执行命令

7.2 搜索命令

:set hlsearch      " 启用高亮
:set nohlsearch    " 关闭高亮
:nohlsearch        " 临时关闭高亮
:grep <pattern>    " 用 grep 搜索
:cnext             " 下一个 quickfix
:cprevious         " 上一个 quickfix

7.3 替换命令

:s/old/new         " 当前行第一个
:s/old/new/g       " 当前行全部
:%s/old/new/g      " 全文全部
:%s/old/new/gc     " 全部并确认
:'<,'>s/old/new/g  " 选中区域
:5,10s/old/new/g   " 5-10 行

7.4 缓冲区命令

:ls                " 列出所有 buffer
:b <N>             " 切换到第 N 个 buffer
:bd                " 删除当前 buffer
:bn                " 下一个 buffer
:bp                " 上一个 buffer
:bf                " 第一个 buffer
:bl                " 最后一个 buffer

7.5 窗口命令

:split             " 水平分屏
:vsplit            " 垂直分屏
:split <file>      " 水平分屏打开文件
:vsplit <file>     " 垂直分屏打开文件
Ctrl-w + q         " 关闭窗口
Ctrl-w + c         " 关闭窗口(同上)
Ctrl-w + s         " 水平分屏(与 split 同)
Ctrl-w + v         " 垂直分屏(与 vsplit 同)

7.6 标签页

:tabnew            " 新建标签
:tabnew <file>     " 新建标签打开文件
:tabnext           " 下一个标签(gt)
:tabprevious       " 上一个标签(gT)
:tabfirst          " 第一个标签
:tablast           " 最后一个标签
:tabclose          " 关闭标签

7.7 折叠

:foldenable        " 启用折叠
:foldmethod=manual " 手动折叠
:zf                " 创建折叠
:zo                " 打开折叠
:zc                " 关闭折叠
:zR                " 打开所有折叠
:zM                " 关闭所有折叠

7.8 标记

ma                 " 设置 a 标记
'a                 " 跳到 a 标记
:marks             " 列出所有标记
:delmarks a        " 删除 a 标记

7.9 宏

qa                 " 录制到寄存器 a
q                  " 停止录制
@a                 " 执行宏 a
@@                 " 重复上次宏
100@a              " 执行 100 次

7.10 diff 模式

vimdiff a.txt b.txt
:diffupdate
:diffget
:diffput
:diffoff

八、日志或指标观察方法

8.1 看编辑历史

:changes           " 列出所有改动
:earlier 5m        " 回到 5 分钟前的状态
:later 5m          " 前进到 5 分钟后的状态
:undo              " 撤销
:redo              " 重做

8.2 看编辑时间

:ed                " 重新加载并显示编辑时间

判断:能看到文件最后一次修改时间。

8.3 看命令历史

q:                 " 进入命令历史窗口
:<Up>              " 上一条命令

8.4 看搜索历史

q/                 " 进入搜索历史

8.5 看寄存器内容

:registers         " 列出所有寄存器

判断:能看到每个寄存器的当前内容。

8.6 看 buffer 列表

:ls                " 列出所有 buffer
:buffers           " 同上

8.7 看 jump 列表

:ju                " 列出 jump 历史
:ju!               " 列出 jump(含当前位置)

判断:Ctrl-o / Ctrl-i 在 jump 中前后跳。

8.8 看 mark 列表

:marks             " 列出所有 mark

8.9 看宏统计

:reg a             " 看寄存器 a 的内容

8.10 编辑时间统计

:set showcmd       " 显示已输入的命令

九、常见场景的快捷键组合

9.1 改一个变量名

"*                 " 选中变量名(先 / 搜索)
ciw                " 改 inner word

更系统的方法:

:%s/oldname/newname/g

9.2 在多行行尾加分号

:%normal A;

或块选择:

Ctrl-v             " 进入块模式
G                  " 到文件尾
$                  " 到行尾
A;                 " 在所有选中行尾加分号
Esc

9.3 注释多行(Python)

Ctrl-v             " 进入块模式
j5                 " 向下选 5 行
I#                 " 在所有选中行首插入 #
Esc

9.4 删除多行

5dd                " 删除 5 行

9.5 移动多行

V                  " 行选择
3j                 " 选 3 行
:move +5           " 向下移动 5 行

9.6 排序

:sort              " 排序
:sort!             " 反向排序
:sort u            " 去重排序

9.7 数字递增

:let i=0
:g/^/s//\=i/|let i=i+1

或:

:put =range(1,100)

9.8 大小写转换

guw                " 当前词转小写
gUw                " 当前词转大写
guu                " 当前行转小写
gUU                " 当前行转大写
g~w                " 当前词反转大小写

9.9 文件编码转换

:e ++enc=gbk       " 以 GBK 编码打开
:set fenc=utf-8    " 设置输出编码
:w                 " 保存为 utf-8

9.10 十六进制查看

:%!xxd             " 转为十六进制
:%!xxd -r          " 转回二进制

十、风险提醒

  • :w! 强制写只读文件:可能改错配置
  • :q! 强制退出不保存:丢失改动
  • :set 选项设错:可能影响正常编辑
  • 替换命令没有 /g:只替换每行第一个
  • 替换命令没有 /c:批量替换可能改错
  • 宏录制后立即全文件执行:可能造成大范围改动
  • 不备份改配置文件:改错无法恢复
  • 在大文件上录制宏:可能很慢
  • 块选择后用错命令:可能错删
  • :! 执行破坏性命令:可能误操作
  • 误按 Ctrl-z:vim 被挂起到后台
  • 误按 Ctrl-s:vim 被锁定(Ctrl-q 解锁)
  • 误删字符 u 撤销后又 Ctrl-r 重做:可能搞混历史
  • 改 .vimrc 后未 source:以为生效实际未生效
  • 用方向键破坏肌肉记忆

十一、验证方式

  • 模式切换是否能丝滑
  • hjkl 移动是否流畅
  • 数字 + motion 是否熟练
  • 搜索替换是否正确
  • 块选择能否多行编辑
  • 宏能否批量处理
  • .vimrc 是否正确加载
  • 配色是否符合预期
  • 自动补全是否正常
  • 配置文件改完后业务是否正常

十二、回滚方案

12.1 改配置文件回滚

cp /etc/my.cnf.bak /etc/my.cnf

12.2 改 .vimrc 回滚

cp ~/.vimrc.bak ~/.vimrc

12.3 Vim 内撤销

u                  " 撤销
:earlier 5m        " 回到 5 分钟前

12.4 替换回滚

:undo              " 撤销替换

12.5 宏回滚

录制宏后未执行前,用 u 撤销。

12.6 块编辑回滚

u

12.7 插件回滚

mv ~/.vim ~/.vim.bak
git clone <plugin repo> ~/.vim

12.8 配色回滚

:colorscheme default

12.9 全部撤销

:q!
:e!

12.10 文件级回滚

git checkout file

十三、生产环境注意事项

  • 生产环境改配置文件要备份
  • 用 vim 改 nginx/apache/my.cnf 等要小心
  • 改完要 reload/restart 前必须验证
  • 改完要业务测试
  • 多人共用服务器时 .vimrc 要统一
  • 在容器内使用 vim 可能没有高亮
  • 远程服务器 vim 版本可能很老
  • 远程 vim 可能没有 clipboard 寄存器
  • 修改 systemd unit 要 systemctl daemon-reload
  • 修改 cron 要 crontab -e,不要改 /etc/crontab 后忘重启
  • 不要在 vim 内直接执行破坏性 :! 命令
  • 改完立即 :w + 备份

十四、总结

Vim 是工具,肌肉记忆是熟能生巧。这 20 个技巧是杠杆最高的起点,每天练 10 分钟,三周就能定型:

  1. 模式切换 i/a/o + ESC
  2. hjkl 移动
  3. 词移动 w/b/e
  4. 行内 0/$/^
  5. 文件级 gg/G
  6. 字符查找 f/F/t/T
  7. 删除 d
  8. 复制 y
  9. 粘贴 p
  10. 撤销 u
  11. 搜索 /
  12. 替换 :s
  13. 可视化 v/V/Ctrl-v
  14. 缩进 >>/<<
  15. 插入模式 Ctrl 键
  16. 寄存器 "
  17. 宏 q + @
  18. 窗口 :split / :vsplit
  19. :! 执行 shell
  20. :set 配置

把这 20 个练熟,再根据自己的工作场景拓展。Vim 是越用越快、越用越顺的工具,前期慢一点没关系,三个月后会感谢自己。

十五、Vim 的进阶方向

15.1 文本对象深入

ci"                " 改双引号内
ci'                " 改单引号内
ci(                " 改括号内
ci[                " 改中括号内
ci{                " 改大括号内
cit                " 改 HTML tag 内
di"                " 删双引号内
yi"                " 复制双引号内
va(                " 选含括号的内容

15.2 命令模式的高级用法

:read !date                    " 读入日期
:%!python -c "..."             " 用外部命令处理
:g/pattern/d                   " 删除匹配行
:v/pattern/d                   " 删除不匹配行
:g/pattern/s/old/new/          " 匹配行内替换
:'<,'>!column -t               " 格式化对齐

15.3 寄存器的进阶用法

:let @a = "long text"          " 设置寄存器
:let @a = ""                   " 清空寄存器
"ayw                           " 复制到 a
:put a                         " 粘贴 a

15.4 表达式寄存器

"=1+2<CR>p                    " 粘贴计算结果
"=system('date')<CR>p         " 粘贴命令输出

15.5 自动命令深入

autocmd FileType python nmap <buffer> <F5> :!python %<CR>
autocmd BufWritePost *.py !python -m py_compile %
autocmd InsertLeave * set cul
autocmd InsertEnter * set nocul

15.6 状态行自定义

set statusline=%f\ %y\ %m\ %r\ %=Line\ %l\/%L\ Col\ %c

15.7 命令补全

:command -nargs=* MyCmd echo <q-args>

15.8 函数

:function! Hello()
:  echo "Hello"
:endfunction
:call Hello()

15.9 插件入门

推荐新手友好的插件:

  • vim-commentary(注释)
  • vim-surround(包围符)
  • vim-repeat(重复 operator)
  • nerdtree(文件树)
  • fzf.vim(模糊搜索)
  • coc.nvim / YouCompleteMe(补全)
  • vim-airline(状态栏)
  • vim-gitgutter(git 标记)

15.10 学习路径

  1. 一周:掌握 20 个肌肉记忆
  2. 两周:熟悉 .vimrc 配置
  3. 一月:掌握插件使用
  4. 三月:根据自己的工作流定制

十六、推荐配置和工具

16.1 vim-plug 插件管理

call plug#begin('~/.vim/plugged')
Plug 'tpope/vim-surround'
Plug 'tpope/vim-commentary'
Plug 'scrooloose/nerdtree'
Plug 'junegunn/fzf.vim'
call plug#end()

16.2 实用搜索工具

  • ack
  • ag (silver searcher)
  • rg (ripgrep)
  • fzf

16.3 远程编辑

  • ssh + vim
  • scp + vim
  • rsync + vim
  • vim + netrw (内置)

16.4 IDE 替代品

  • SpaceVim
  • LunarVim
  • NvChad
  • AstroVim

十七、Vim 与其他工具的搭配

17.1 Vim + tmux

tmux 分屏 + vim 分屏,编辑器与终端双分屏。

17.2 Vim + fzf

fzf 模糊搜索文件,vim 编辑。

17.3 Vim + ripgrep

:grep! -n pattern %
:copen

17.4 Vim + git

  • vimdiff:git difftool
  • vim-fugitive:vim 内 git
  • gv.vim:commit browser

17.5 Vim + SSH

vim scp://user@host//etc/my.cnf

判断:vim 内置 netrw 支持 scp 编辑。

十八、典型场景的 vimrc 模板

18.1 运维工程师 vimrc

set nocompatible
syntax on
filetype plugin indent on

set number relativenumber cursorline scrolloff=5

set tabstop=2 shiftwidth=2 expandtab

set ignorecase smartcase incsearch hlsearch

set history=1000 undolevels=1000

" 运维相关映射
nnoremap <F5> :!bash %<CR>
nnoremap <F6> :!./%<CR>

" 文件类型
autocmd FileType sh setlocal tabstop=2 shiftwidth=2
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2
autocmd FileType nginx setlocal commentstring=#\ %s

" 自动保存
autocmd BufWritePre *.sh !shfmt -i 2 -w %

18.2 DBA vimrc

set tabstop=4 shiftwidth=4 expandtab

" SQL 高亮
autocmd FileType sql setlocal commentstring=--\ %s

" 大写关键字
nnoremap <leader>u :s/\b\(SELECT\|FROM\|WHERE\|JOIN\)\b/\U\1/g<CR>

18.3 开发者 vimrc

" 通用配置
set nocompatible
syntax on
filetype plugin indent on

set number relativenumber cursorline scrolloff=5
set tabstop=4 shiftwidth=4 expandtab
set ignorecase smartcase incsearch hlsearch

" 代码折叠
set foldmethod=indent
set foldlevel=2

" 自动补全
set completeopt=menuone,noinsert,noselect
set omnifunc=syntaxcomplete#Complete

十九、面试常见的 Vim 问题

  1. Vim 有几种模式? 4 种:Normal、Insert、Visual、Command,还有 Replace。
  2. 如何从 Insert 模式快速回 Normal? ESC 或 Ctrl-[。
  3. 如何跳到行首/行尾? 0 行首、$ 行尾、^ 第一个非空白字符。
  4. 如何跳到文件头/文件尾? gg / G。
  5. 如何搜索替换? /pattern + n/N;:s/old/new/g。
  6. 如何复制粘贴? yy / p;"+y / "+p 跨系统剪贴板。
  7. 如何录制宏? q + 字母,操作,q,@ + 字母执行。
  8. 如何分屏? :split 水平、:vsplit 垂直,Ctrl-w 切换。
  9. 如何块编辑? Ctrl-v 进入块模式。
  10. 如何快速注释? Ctrl-v 选行,I//,Esc。

二十、写在最后

Vim 是工具,肌肉记忆是技能。每天花 10 分钟,把这 20 个技巧练熟,遇到常用的操作就用 Vim 而不是方向键,三周就能定型。

Vim 的学习曲线前期陡峭,但一旦过去就一劳永逸。比 IDE 更快、比 nano 更强、比 sed 更友好,是运维、DBA、开发者都该掌握的工具。

记住一句话:肌肉记忆不是背下来的,是用出来的。打开 Vim,用 hjkl 移动,用 / 搜索,用 :s 替换,用 dd 删除。十天之后,你会感谢现在的自己。

二十一、扩展:每个技巧的实战场景

21.1 技巧 1(i/a/o/O/I/A)实战

场景 1:在文件第 5 行末尾加注释。

gg
4j
A
# 这是注释
Esc

场景 2:在文件中间插入一段。

50G
o
新内容
Esc

21.2 技巧 2(hjkl)实战

场景 1:上下移 1 行。

  • j:下移 1 行
  • k:上移 1 行

场景 2:左右移动。

  • h:左移 1 字符
  • l:右移 1 字符

21.3 技巧 3(w/b/e)实战

场景 1:在长变量名之间跳转。

  • var_one_two_three
  • w 跳到 var_one_two_three 下一个词

场景 2:在代码中跳到下一个函数。

  • w 反复按可以跨多个标识符

21.4 技巧 4(0/$/^)实战

场景 1:在长行中快速到行尾。

  • $ 比 End 键快

场景 2:从行尾回到行首。

  • 0 直接到行首,比 Home 键快

21.5 技巧 5(gg/G)实战

场景 1:查看文件总行数。

  • G 然后 Ctrl-g 可以看到行数

场景 2:到指定行。

  • 100G 到第 100 行

21.6 技巧 6(f/F/t/T)实战

场景 1:在 SQL 中跳到 WHERE 关键字。

  • fW 跳到下一个 W

场景 2:删除到分号。

  • df; 删除到分号

21.7 技巧 7(d)实战

场景 1:删除一行。

  • dd

场景 2:删除一个词。

  • dw(光标在词首)或 daw(任何位置)

场景 3:删除到行尾。

  • D 或 d$

21.8 技巧 8(y)实战

场景 1:复制一行。

  • yy

场景 2:复制一个词。

  • yw

场景 3:复制多行。

  • 5yy

21.9 技巧 9(p/P)实战

场景 1:复制后粘贴。

  • yyp

场景 2:从寄存器粘贴。

  • "ayy,"ap

21.10 技巧 10(u)实战

场景 1:撤销最近改动。

  • u

场景 2:重做。

  • Ctrl-r

21.11 技巧 11(/)实战

场景 1:搜索关键字。

  • /keyword Enter

场景 2:搜索当前光标下的词。

  • *(向下)或 #(向上)

21.12 技巧 12(:s)实战

场景 1:替换所有。

  • :%s/old/new/g

场景 2:替换并确认。

  • :%s/old/new/gc

21.13 技巧 13(v/V/Ctrl-v)实战

场景 1:选择 5 行注释。

  • V 然后 4j,然后 I#,然后 Esc

场景 2:在多行末尾加分号。

  • Ctrl-v 然后 4j,然后 A; 然后 Esc

21.14 技巧 14(>)实战

场景 1:缩进当前行。

  • >>

场景 2:缩进多行。

  • V 选中,>

21.15 技巧 15(Ctrl 键)实战

场景 1:删除刚输入的词。

  • Ctrl-w(写一半发现错了)

场景 2:撤销最近删除。

  • Ctrl-r

21.16 技巧 16(" + 字母)实战

场景 1:复制到 a,剪切到 b。

  • "ayy,"bdd,"ap

场景 2:保留原剪切板内容。

  • "_d(删到黑洞)

21.17 技巧 17(q + 字母)实战

场景 1:把每行加 .bak。

  • qa I.bak Esc q,:%normal @a

场景 2:批量格式化。

  • qa 录制格式化动作 q,:%normal @a

21.18 技巧 18(窗口)实战

场景 1:左右分屏。

  • :vsplit + 文件名

场景 2:在窗口间跳转。

  • Ctrl-w + h/j/k/l

21.19 技巧 19(:!)实战

场景 1:插入当前时间。

  • :r !date

场景 2:执行命令。

  • :!ls

21.20 技巧 20(:set)实战

场景 1:行号。

  • :set nu

场景 2:自动缩进。

  • :set autoindent

二十二、Vim 在不同场景下的实战

22.1 改 nginx 配置

/etc/nginx/nginx.conf
:1
/worker_processes
dw
i4
Esc
:w
:!nginx -t

22.2 改 my.cnf

/etc/my.cnf
/innodb_buffer_pool_size
daW
i8GEsc
:w

22.3 看日志并标记异常

/var/log/messages
/ERROR
n
:bn

22.4 改 K8s manifest

deployment.yaml
/containers
j
/image:
ciw
Esc

22.5 批量改配置

:%s/localhost/db.internal/g
:%s/127.0.0.1/db.internal/g

22.6 临时加注释

:s/^/# /
:%s/^/# /
:%s/^# //

22.7 调整缩进

:1,20>>
:20,$<<
gg=G

22.8 合并行

J
3J
gJ

22.9 多文件编辑

vim a.txt b.txt c.txt
:bn
:bp
:ls
:b 2
:bd

22.10 远程编辑

:e scp://user@server//etc/my.cnf
:w !sudo tee %

二十三、Vim 的隐藏神器

23.1 Ctrl-r 寄存器

在插入模式下:

Ctrl-r "
Ctrl-r a
Ctrl-r +
Ctrl-r =

23.2 gq 格式化

gqq
gq}
:set formatoptions+=a

23.3 :try / :catch

:try
:  /pattern
:catch /^Vim:E/
:  echomsg "pattern not found"
:endtry

23.4 :set list

:set list
:set listchars=eol:$,tab:>-,trail:·,nbsp:_

23.5 :set path

:set path+=**
:find filename
:gf

23.6 :args 文件列表

:args *.txt
:next
:prev

23.7 :cfile 错误列表

:grep -r pattern .
:copen
:cnext

23.8 :DiffOrig

:Diffoff
:DiffOrig

23.9 :w !sudo tee %

:w !sudo tee %
:!chmod 644 %

23.10 :Termdebug

vim 8.1+ 内置 debug:

:packadd termdebug
:Termdebug

二十四、Vim 的高效组合键

24.1 改全文

:%s/foo/bar/g

24.2 全局缩进

gg=G

24.3 多行合并为一行

:v/^$/,/^$/-j!

24.4 多行拆分为多行

:%s/,/<CR>/g

24.5 删除空行

:g/^$/d

24.6 删除重复行

:sort u

24.7 反转行

:g/^/m0

24.8 大小写反转

:g/^/s/.*/\U&/

24.9 数字求和

:put =eval(getline(1,'$'))

24.10 计算当前列数字之和

:'<,'>s/.*/\=eval(submatch(0))/

二十五、Vim 与 Git 的协作

25.1 vimdiff 作为 git difftool

git config --global diff.tool vimdiff
git diff

25.2 vim-fugitive

:Git status
:Git diff
:Git commit
:Git log
:Git blame

25.3 gv.vim

:GV

25.4 提交时编辑 message

git config --global core.editor "vim"

25.5 在 vim 内做 code review

:tabnew file
:vsp file.bak
Ctrl-w + h/l

二十六、Vim 的故障排查思路

26.1 Vim 启动报错

vim -u NONE
vim -u NONE -N

判断:排查 .vimrc 问题。

26.2 插件冲突

mv .vim .vim.bak
git clone <plugin repo> .vim

26.3 快捷键不生效

:verbose map <key>

判断:能看到快捷键的来源。

26.4 高亮丢失

:syntax on
:filetype on

26.5 中文乱码

:set encoding=utf-8
:set fileencoding=utf-8
:set termencoding=utf-8

26.6 中文宽度

:set ambiwidth=double

判断:CJK 字符宽度。

26.7 删除键问题

set backspace=indent,eol,start

26.8 方向键问题(A 字母乱出)

Vim 兼容模式:set nocompatible。

26.9 Ctrl-S 锁定

Ctrl-Q

判断:Ctrl-S 是终端的 XOFF,按 Ctrl-Q 解锁。

26.10 编辑大文件卡

:set lazyredraw
:set undolevels=-1
:set noswapfile

判断:大文件需要关闭部分功能。

二十七、运维工程师的 vimrc 推荐

set nocompatible
set encoding=utf-8
set fileencoding=utf-8
syntax on
filetype plugin indent on

set number relativenumber
set cursorline
set scrolloff=5
set laststatus=2
set showcmd
set ruler

set ignorecase
set smartcase
set incsearch
set hlsearch
nnoremap <Esc><Esc> :nohlsearch<CR>

set tabstop=2 shiftwidth=2 expandtab
set autoindent
set smartindent

set history=1000
set undolevels=1000

autocmd FileType sh setlocal tabstop=2 shiftwidth=2
autocmd FileType yaml setlocal tabstop=2 shiftwidth=2
autocmd FileType python setlocal tabstop=4 shiftwidth=4
autocmd FileType json setlocal tabstop=2 shiftwidth=2

nnoremap <C-s> :w<CR>
inoremap <C-s> <Esc>:w<CR>a
nnoremap <C-q> :wq<CR>
nnoremap <F5> :!bash %<CR>
nnoremap <F6> :!./%<CR>
nnoremap <C-j> 5j
nnoremap <C-k> 5k

autocmd BufWritePre *.sh !shfmt -i 2 -w %
autocmd BufWritePre *.yaml !python -c "import yaml,sys; yaml.safe_load(open(sys.argv[1]))" %

set backup
set backupdir=~/.vim/backup
set directory=~/.vim/tmp

colorscheme desert
syntax on

二十八、本文总结与行动计划

28.1 行动计划

  1. 第 1-3 天:练模式切换 + hjkl + 基础移动
  2. 第 4-7 天:练 d/y + 数字前缀
  3. 第 8-14 天:练 w/b/e、0/$/^、gg/G、f/F/t/T
  4. 第 15-21 天:练搜索、替换、可视化、缩进
  5. 第 22-30 天:练寄存器、宏、窗口、配置文件

28.2 配套练习

  • 用 vim 改 100 个配置文件
  • 用 vim 改 100 个 shell 脚本
  • 用 vim 写 100 个 Markdown 文档
  • 用 vim 处理 100 个日志文件

28.3 检验标准

  • 30 秒内能用 vim 完成任意编辑任务
  • 能用宏批量处理 100 行
  • 能用块编辑改多行
  • 能用 :! 执行命令并插入结果
  • 能用 netrw 远程编辑

28.4 推荐资源

  • vimtutor:vim 自带教程(必学)
  • :help:vim 帮助(详尽)
  • vim help tags:标签搜索
  • Practical Vim(书籍)
  • vimcasts.org(视频)
  • Brendan Gregg vim 配置

28.5 持续学习

vim 是终身学习的工具。每天学一个新技巧,每月读一篇高级用法,每年读一遍 :help,都会让 vim 更顺手。

把 vim 用熟,比 IDE 更纯粹,比 nano 更强大,比 sed 更友好。




上一篇:CodeGraph 本地代码图谱实操:嵌入式 AI 编程 Token 省一半、提速近五成
下一篇:多Agent协作系统开发实录:AutoGen与CrewAI选型避坑指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-9-25 02:09 , Processed in 1.095201 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表