Vim 编辑器实战入门:从零基础到离开鼠标写代码
2026-10-16 15:10:24📌 新手提示:本文结尾提供了一键安装脚本(Windows / macOS / Linux 通用),自动检测网络源、安装 Vim 并生成基础配置文件。想省时间的朋友直接拉到文末运行即可。
导读:为什么学 Vim?#Vim 是一个运行在终端里的文本编辑器——也就是说你不需要点鼠标,只需要键盘就能完成所有编辑工作。它在程序员中非常流行,因为一旦熟练了,编辑速度远超鼠标 + 图形界面。更重要的是:绝大多数远程服务器(尤其是 Linux 服务器)都自带 Vim,当你通过 SSH 连到一台空荡荡的机器时,Vim 几乎是你唯一可用的编辑器。
学习 Vim 的最大门槛是"打破直觉":它不像 Word 或 VS Code 那样用按钮操作,而是靠模式切换 + 快捷键组合。好消息是,你其实只需要掌握不到 30 个命令就能完成日常编辑——剩下的都是进阶玩法,可以慢慢积累。
下面我们从最基础的三大模式讲起,一步步带你上手。
参考文档:Runoob Vim 教程(国内可直接访问,内容详尽)官方网站:https://www.vim.org/(国内用户如果打开慢,可以用镜像 https://ghfast.top/https://www.vim.org/ 先逛逛介绍页)
一、三大核心模式:Vim 的灵魂#Vim 的核心思想是"每种模式有每种模式的职责"。你不可能在打字的时候同时执行删除命令——必须切换到对应模式。这听起来麻烦,但熟练后会发现非常清晰高效。
1. 普通模式(Normal Mode)—— 默认模式#启动 Vim 后自动进入此模式。这里的每一个按键都是一条命令,而不是输入字符。
按键功能白话解释h / j / k / l左 / 下 / 上 / 右不摸方向键也能精准移动w跳到下一个词开头word = “单词"的意思b跳到上一个词开头back = 回退$跳到行尾end of line0(数字零)跳到行首zeroG跳到文件末尾Go to endgg跳到文件开头Go to top(连按两次 G)nG(如 5G)跳到第 n 行比如 42G 直接跳到第 42 行2. 插入模式(Insert Mode)—— 像记事本一样打字#想要打字、粘贴内容?先切换到插入模式。这是唯一的"写入"模式。
按键功能i在光标前面进入插入模式(最常用)a在光标后面进入插入模式(append)I(大写)跳到行首再进入插入模式A(大写)跳到行尾再进入插入模式o在当前行下方新建一行并进入插入模式O(大写)在当前行上方新建一行并进入插入模式3. 可视模式(Visual Mode)—— 选中文字块#和普通编辑器的"拖拽选中文本"类似,只不过这里用键盘操作。
按键功能v逐字符选择(拖动式选中)V(大写)逐行选择(选中整行)Ctrl + v列选择(矩形区域,适合多行对齐修改)选中的文字可以接着做 d(删除)、c(更改)、y(复制)、>(缩进)等操作。
三个模式怎么切换?一张图看懂#┌──────────┐ i/a/o/O ┌──────────┐
│ NORMAL │ ────────────────► │ INSERT │
│ 普通模式 │ ◄──────────────── │ 插入模式 │
│ │ Esc (万能键) │ │
└────┬─────┘ └──────────┘
│ ▲
│ v Esc│
▼ │
┌──────────┐ │
│ VISUAL │ ───────────────────────┘
│ 可视模式 │ Esc
└──────────┘
💡 核心口诀:Esc 是万能的返回键——不管你从哪个模式来的,按一次 Esc 就回到普通模式。记住这一个键,你就不会被困在任何模式里。
二、常用移动命令:手不离家#“家"指的是主键盘区 hjkl 这几个字母的位置——左手四个手指分别放在 h-j-k-l 上,就可以不用移到方向键来移动光标。这种打字方式被称作"指法定位”,是 Vim 效率的来源之一。
基本移动#命令功能举例h左移一格想往左?推 hj下移一行比向下箭头好用k上移一行比向上箭头好用l右移一格有时可省略(空格也行)w跳到下一个词的首字母Word 的第一个字母e跳到下一个词的末尾End of wordb跳回上一个词的开头Back0跳到行首(字母 o)Zero$跳到行尾Dollar sign,"$“在这里代表"行尾”gg跳到文件第一行双 GG跳到文件最后一行大写 GnG跳转到第 n 行50G → 跳到第 50 行Ctrl + f下一页Forward pageCtrl + b上一页Backward pageCtrl + d下半页Down halfCtrl + u上半页Up half数字前缀:几乎所有移动命令都可以加数字。比如 5j 就是"下移 5 行”,10w 就是"往后跳 10 个词"。
行内快速跳转#命令功能^跳到该行第一个非空字符f + 字母跳到当前行该字母处(forward)t + 字母跳到当前行该字母前一位(to);重复上一次 f/t 操作,反向重复 f/t例如 fw 会跳到当前行的下一个 w 字母处,之后按 ; 继续往后找,按 , 往回找。
三、编辑命令:增删改查#在普通模式下,这些编辑命令遵循"动作 + 范围“的语法结构。比如 dd 的意思是"删除当前行”(d = delete,第二个 d 表示作用范围是整行)。
删除#命令功能x删除光标处的一个字符(向前删)X删除光标前的一个字符(向后删)dd删除整行(cut,剪切到缓冲区)ndd删除 n 行(如 5dd = 删 5 行)dw删除从光标到词尾的内容d$删除从光标到行尾的所有内容d0删除从光标到行首的所有内容⚠️ 注意:Vim 的"删除"其实是剪切——删除的内容会存在剪贴板里,随时可以粘贴回来。
复制与粘贴#命令功能yy复制当前行(yank = 拉取/复制)nyy复制 n 行(如 3yy = 复制 3 行)yw复制当前词p在光标下方/右侧粘贴P在光标上方/左侧粘贴(大写倒着粘)撤销与重做#命令功能u撤销上一步操作(undo)Ctrl + r重做被撤销的操作(redo)这两个命令是程序员的好朋友——写错了不用担心,按 u 撤销就行,反复试错成本低得多。
点号.:最强复制器#. 键的作用是重复上一次编辑操作。比如:
移动到某行,输入 3dw(删掉 3 个词)移动到另一行,按.结果:同样的"删 3 个词"操作又执行了一遍这个".“被称为 Vim 的"宏快捷键”,配合可视模式选中多行、按 : 自动补全 '<,'>s/old/new/g 做批量查找替换,效率极高。
四、搜索与替换#搜索#命令功能/关键词向下搜索(forward search)?关键词向上搜索(backward search)n跳到下一个匹配项(Repeat in same direction)N(大写)跳到上一个匹配项(Reverse direction)搜索时支持正则表达式的基础用法:
/\.py$ — 搜索以 .py 结尾的行/\d\+ — 搜索连续数字(\d\+ 匹配一个或多个数字)替换#格式::起点,终点 s/旧内容/新内容/标志
命令效果:%s/foo/bar/g全文把 foo 替换成 bar(g = global,全部替换):5,20s/foo/bar/g只替换第 5 到 20 行:%s/foo/bar/gc同上,但每次替换前都问你确认(c = confirm):s/^/#/g给当前行加上注释符号 #(^ 代表行首)提示:% 在 Vim 里代表"整个文件"。:%s 就是"全文替换"。
五、保存与退出#命令效果白话解释:w保存(write)仅保存,不退出:q退出(quit)没改过文件才能退出:wq保存并退出最常用的退出方式:x保存并退出(同 :wq)如果没改动则只退出:q!强制退出,不保存放弃所有修改:w file.txt另存为 file.txt导出到另一个文件六、分屏显示:同时看两个文件#Vim 支持在同一窗口里分割出多个面板,让你可以同时编辑多个文件或查看同一文件的不同位置。
水平分屏(上下排列)#在普通模式下输入:
:sp " split,水平分屏(上下排列)
然后 Ctrl + ww 可以切换到另一个窗口。在各自窗口里用 :e 文件名 打开不同文件。
垂直分屏(左右排列)#:vsplit " vsplit,垂直分屏(左右排列)
同样用 Ctrl + ww 在窗口间切换。
关闭某个窗口#:q " 关闭当前窗口,回到单窗口
分屏对代码审查(一边看函数定义一边看调用处)特别有用——不需要开多个终端窗口来回切换。
七、写一份你的第一个 .vimrc#Vim 的配置文件叫 .vimrc(macOS/Linux 下位于 ~/.vimrc,Windows 下位于 %USERPROFILE%\_vimrc)。你可以用它自定义 Vim 的行为——比如让行号显示出来、让缩进变整齐。如果你是第一次接触 Vim 的配置体系,觉得一头雾水也没关系:网上有不少开发者分享的社区 .vimrc 模板可以参考,也可以把需求丢给 AI 助手帮你生成一份。当然自己动手也很简单,下面是一份新手友好型起步配置:
" ---------- 行号 ----------
set number " 显示行号(简写 set nu 也可以)
" set relativenumber " 进阶:显示相对行号(方便 jjjdd 删行)
" ---------- 缩进 ----------
set tabstop=2 " Tab 等于 2 个空格宽度
set shiftwidth=2 " 自动缩进量 2 空格
set expandtab " Tab 键实际输出空格而非制表符(推荐)
" ---------- 视觉反馈 ----------
set cursorline " 高亮当前所在行(方便定位)
set hlsearch " 搜索结果高亮显示
set incsearch " 输入搜索词时即时高亮(不等按回车)
" ---------- 其他实用设置 ----------
set showmatch " 输入括号时短暂跳到匹配的括号
set mouse=a " 启用鼠标(滚轮翻页、点击跳转)
set backspace=indent,eol,start " 让退格键在插入模式下正常工作
syntax on " 开启语法高亮(有些发行版默认已开)
如何应用?#在终端运行 vim ~/.vimrc按 i 进入插入模式,把上面的配置粘贴进去按 Esc,输入 :wq 保存退出下次启动 Vim 就会生效;想让当前会话也生效,可以 :source ~/.vimrc⚠️ 重要提醒:不要一次性粘贴全部配置!先加几条试试看,每加一条都要理解它的作用。否则出了问题都不知道是哪条引起的。
八、练习路径:从生疏到肌肉记忆#学 Vim 的关键不在于背命令,而在于多用。以下是一个渐进式练习计划:
第一天:只用 hjkl 移动,不碰方向键。目标是在任意文件中从头走到尾。第二天:加入删除和复制——dd、yy、p。试着把一段文字复制并重新排序。第三天:练搜索——/关键词、n、N。找一个长文件中特定的内容。第四天:体验可视模式——v 和 V,选中几行,按 > 缩进或按 d 删除。第五天:尝试用 . 重复操作,看看能省下多少敲击次数。一周后:打开 .vimrc,逐步加入上面推荐的配置。坚持一周,你会发现自己的手逐渐形成肌肉记忆,回头看"原来我以前一直用鼠标点点点,效率那么低"。
九、不想背命令?让 AI 教你#每个人的编程习惯不一样,有些人就是记不住 hjkl 的方向,或者嫌自己手短够不到 Esc。没关系——现在有了更省事的做法:让 AI 帮你写命令。
比如你想在 Vim 里批量把所有英文句首字母改成大写,但你不知道用什么命令,可以直接把光标放到那行,打开终端里的 AI 助手(很多是基于 OpenAI 兼容接口调用的),问它一句:“Vim 里怎么批量大写每个单词首字母?” AI 会给你答案。
如果你想尝试这类 AI 辅助工具,挑一个支持 OpenAI 兼容接口的终端 AI 助手就行——背后接入哪家的模型服务、什么价位,由你自己选择和比较,本文不做推荐。
当然,建议你还是花一天时间把手动起来——哪怕只是记住 i 进入编辑、Esc 回到普通模式这两个键,你也已经比纯鼠标用户快了一步。等你对 Vim 有了感觉,再用 AI 加速后面的进阶之路,事半功倍。
十、速查卡(打印出来贴桌上)#类别命令一句话进入插入i光标前打字返回普通Esc万能返航行内移动hjkl左下右上跳转词w / b下一词 / 上一词跳转行0 / $行首 / 行尾跳转文件gg / G顶部 / 底部删行dd剪一刀复制行yy克隆一行粘贴p在下边粘撤销u后悔药搜索/xxx → Enter搜下去替换:%s/a/b/g全文换保存退出:wq走人不保存退出:q!跑了跑了分屏:vsplit左右看附:一键安装脚本(Windows / macOS / Linux)#下面提供了两个版本的完整源码——.sh(适用于 macOS / Linux / WSL)和 .ps1(适用于 Windows PowerShell)。脚本会自动检测网络环境选择最佳源,安装 Vim,并生成一份基础 .vimrc 配置文件。
透明声明:脚本开源无加密,欢迎复制给任何 AI 审查。不想跑脚本的同学也可以手动照着上面的步骤装。
不方便下载的同学可以直接复制下方完整源码,新建文本文档粘贴后改后缀为 .sh 或 .ps1 运行。也可从 https://cleanresolver.com/scripts/install-vim-guide.sh(.ps1)下载。
Linux / macOS / WSL 版##!/usr/bin/env bash
set -u
# ============================================================
# Vim 编辑器实战入门 一键脚本(macOS / Linux / WSL)
# 公开源码,欢迎审查 —— 不放心可先复制给 AI 判断
# 功能:检测是否安装 Vim → 未装则自动安装 → 生成基础 .vimrc
# ============================================================
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step() { echo -e "${CYAN}[STEP]${NC} $1"; }
detect_network() {
step "检测网络环境(国内 / 国外)..."
if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
info "可直连 claude.ai,判定为海外网络"
echo "overseas"
else
warn "无法直连 claude.ai,判定为国内网络环境"
echo "domestic"
fi
}
check_vim() {
if command -v vim >/dev/null 2>&1; then
info "Vim 已安装:$(vim --version | head -1)"
return 0
fi
warn "未检测到 Vim,将自动安装..."
return 1
}
install_vim() {
local net="$1"
step "安装 Vim..."
if command -v apt-get >/dev/null 2>&1; then
# Debian / Ubuntu
info "检测到 apt 包管理器"
if [ "$net" = "domestic" ]; then
info "使用国内源安装..."
if sudo sed -i.bak 's|http://archive.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null; then
sudo apt-get update --allow-releaseinfo-change -o Dir::Etc::sourcelist="sources.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" 2>/dev/null || true
fi
fi
if sudo apt-get install -y vim >/dev/null 2>&1; then
info "Vim 安装成功(apt)"
return 0
fi
elif command -v yum >/dev/null 2>&1 || command -v dnf >/dev/null 2>&1; then
# CentOS / RHEL / Fedora
local pkg_mgr="yum"
command -v dnf >/dev/null 2>&1 && pkg_mgr="dnf"
info "检测到 $pkg_mgr 包管理器"
if sudo $pkg_mgr install -y vim-enhanced >/dev/null 2>&1; then
info "Vim 安装成功($pkg_mgr)"
return 0
fi
elif command -v brew >/dev/null 2>&1; then
# macOS Homebrew
info "检测到 Homebrew"
if brew install vim >/dev/null 2>&1; then
info "Vim 安装成功(Homebrew)"
return 0
fi
elif command -v pacman >/dev/null 2>&1; then
# Arch Linux
if sudo pacman -Sy --noconfirm vim >/dev/null 2>&1; then
info "Vim 安装成功(pacman)"
return 0
fi
fi
error "自动安装失败。请手动执行你的包管理器安装:"
echo " · Debian/Ubuntu: sudo apt-get install vim"
echo " · CentOS/RHEL: sudo yum install vim-enhanced"
echo " · macOS: brew install vim"
echo " · Arch Linux: sudo pacman -Sy vim"
return 1
}
setup_vimrc() {
step "生成基础 .vimrc 配置文件..."
local vimrc="$HOME/.vimrc"
if [ -f "$vimrc" ]; then
warn "发现已有 $vimrc,备份为 ${vimrc}.bak.$(date +%Y%m%d%H%M%S)"
cp "$vimrc" "${vimrc}.bak.$(date +%Y%m%d%H%M%S)"
fi
cat > "$vimrc" << 'VIMEOF'
" ---------- 行号 ----------
set number
" set relativenumber " 进阶:相对行号,方便删除多行
" ---------- 缩进 ----------
set tabstop=2
set shiftwidth=2
set expandtab
" ---------- 视觉反馈 ----------
set cursorline
set hlsearch
set incsearch
" ---------- 其他实用设置 ----------
set showmatch
set mouse=a
set backspace=indent,eol,start
syntax on
VIMEOF
info ".vimrc 已生成:$vimrc"
echo " 如果想临时加载不重启 Vim,可以在 Vim 中输入:source ~/.vimrc"
}
main() {
echo "============================================"
echo " Vim 编辑器实战入门 一键脚本"
echo " 适用于 macOS / Linux / WSL"
echo "============================================"
echo ""
if check_vim; then
info "跳过安装步骤"
else
local NET
NET=$(detect_network)
if ! install_vim "$NET"; then
error "Vim 安装失败。请先手动安装后再运行本脚本以生成 .vimrc。"
exit 1
fi
fi
setup_vimrc
echo ""
echo "============================================"
info "全部完成!"
echo " 快速测试:vim test.txt (进入后按 i 开始编辑,Esc 后 :wq 保存退出)"
echo " 配置文件:$HOME/.vimrc"
echo " 练习建议:第一天只用 hjkl 移动,第二天加 dd/yy/p"
echo "============================================"
}
main "$@"
Windows PowerShell 版## ============================================================
# Vim 编辑器实战入门 一键脚本(Windows PowerShell)
# 公开源码,欢迎审查 -- 不放心可先复制给 AI 判断
# 说明:Vim 在 Windows 上通过 WSL 运行体验最佳,
# 本脚本检测 WSL,在 WSL 内安装 Vim 并生成 .vimrc。
# ============================================================
$ErrorActionPreference = "Stop"
function Write-Info { Write-Host "[INFO] $args" -ForegroundColor Green }
function Write-Warn { Write-Host "[WARN] $args" -ForegroundColor Yellow }
function Write-Err { Write-Host "[ERROR] $args" -ForegroundColor Red }
function Write-Step { Write-Host "[STEP] $args" -ForegroundColor Cyan }
# 1. 检测 WSL
Write-Step "检查 WSL 环境..."
if (-not (Get-Command wsl -ErrorAction SilentlyContinue)) {
Write-Err "未找到 wsl 命令。请先安装 WSL:"
Write-Host " PowerShell(管理员)执行:wsl --install"
Write-Host " 重启后安装 Ubuntu 发行版,再运行本脚本。"
exit 1
}
# 安全策略说明:Set-ExecutionPolicy -Scope Process 仅对本进程生效
# 关闭窗口即恢复,不会改动系统全局策略
if ($ExecutionPolicy -ne "Unrestricted" -and $ExecutionPolicy -ne "RemoteSigned") {
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
}
try {
$wslHome = (wsl -e sh -c 'echo $HOME' 2>$null).Trim()
} catch {
$wslHome = "/root"
}
if ([string]::IsNullOrWhiteSpace($wslHome)) { $wslHome = "/root" }
Write-Info "WSL 主目录:$wslHome"
# 2. 网络检测 & 安装
Write-Host ""
Write-Step "正在 WSL 内安装 Vim(如未安装)并生成 .vimrc..."
$installScript = @"
#!/usr/bin/env bash
set -u
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info() { echo -e "\${GREEN}[INFO]\${NC} \$1"; }
warn() { echo -e "\${YELLOW}[WARN]\${NC} \$1"; }
error() { echo -e "\${RED}[ERROR]\${NC} \$1"; }
step() { echo -e "\${CYAN}[STEP]\${NC} \$1"; }
detect_network() {
if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
echo "overseas"
else
echo "domestic"
fi
}
if command -v vim >/dev/null 2>&1; then
info "Vim 已安装:\$(vim --version | head -1)"
else
step "安装 Vim..."
local NET
NET=\$(detect_network)
if command -v apt-get >/dev/null 2>&1; then
if sudo apt-get install -y vim >/dev/null 2>&1; then
info "Vim 安装成功"
else
error "apt 安装失败,请手动执行: sudo apt-get install vim"
exit 1
fi
elif command -v yum >/dev/null 2>&1; then
if sudo yum install -y vim-enhanced >/dev/null 2>&1; then
info "Vim 安装成功"
else
error "yum 安装失败,请手动执行: sudo yum install vim-enhanced"
exit 1
fi
elif command -v dnf >/dev/null 2>&1; then
if sudo dnf install -y vim >/dev/null 2>&1; then
info "Vim 安装成功"
else
error "dnf 安装失败,请手动执行: sudo dnf install vim"
exit 1
fi
fi
fi
VIMRC="$wslHome/.vimrc"
if [ -f "\$VIMRC" ]; then
cp "\$VIMRC" "\${VIMRC}.bak.\$(date +%Y%m%d%H%M%S)"
fi
cat > "\$VIMRC" << 'VIMEOF'
set number
set tabstop=2
set shiftwidth=2
set expandtab
set cursorline
set hlsearch
set incsearch
set showmatch
set mouse=a
set backspace=indent,eol,start
syntax on
VIMEOF
info ".vimrc 已生成:\$VIMRC"
"@
remotePath="/tmp/install-vim-wsl.sh"
echo "$installScript" | wsl -e tee "$remotePath" >/dev/null 2>&1
Write-Info "脚本已传入 WSL:$remotePath"
Write-Host ""
Write-Host "正在 WSL 内执行安装...(日志如下)"
Write-Host "============================================"
wsl -e bash "$remotePath"
$code = $LASTEXITCODE
Write-Host "============================================"
if ($code -ne 0) {
Write-Err "WSL 内安装失败(退出码 $code)。请对照上方报错处理。"
Write-Host "也可手动在 WSL 中执行:"
Write-Host " sudo apt-get install vim"
Write-Host " 然后在 WSL 中运行 vim ~/.vimrc 手动添加配置"
exit 1
}
Write-Host ""
Write-Host "============================================"
Write-Info "全部完成!"
Write-Host " 在 WSL 中测试:vim test.txt"
Write-Host " Windows 也可以直接装 gVim:choco install vim (需先装 Chocolatey)"
Write-Host "============================================"
本文系清澈解码(CleanResolver.com)原创教程,采用 CC BY-NC-SA 4.0 许可。脚本公开源码,欢迎复制给任何 AI 审查。