Vim 编辑器实战入门:从零基础到离开鼠标写代码

2026-10-16 15:10:24
📌 新手提示:本文结尾提供了一键安装脚本(Windows / macOS / Linux 通用),自动检测网络源、安装 Vim 并生成基础配置文件。想省时间的朋友直接...

📌 新手提示:本文结尾提供了一键安装脚本(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 审查。