📌 新手提示:本文结尾提供了一键安装脚本(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 line
0(数字零)跳到行首zero
G跳到文件末尾Go to end
gg跳到文件开头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左移一格想往左?推 h
j下移一行比向下箭头好用
k上移一行比向上箭头好用
l右移一格有时可省略(空格也行)
w跳到下一个词的首字母Word 的第一个字母
e跳到下一个词的末尾End of word
b跳回上一个词的开头Back
0跳到行首(字母 o)Zero
$跳到行尾Dollar sign,"$“在这里代表"行尾”
gg跳到文件第一行双 G
G跳到文件最后一行大写 G
nG跳转到第 n 行50G → 跳到第 50 行
Ctrl + f下一页Forward page
Ctrl + b上一页Backward page
Ctrl + d下半页Down half
Ctrl + 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 撤销就行,反复试错成本低得多。

点号.:最强复制器

. 键的作用是重复上一次编辑操作。比如:

  1. 移动到某行,输入 3dw(删掉 3 个词)
  2. 移动到另一行,按.
  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 的配置体系,觉得一头雾水也没关系:云间 API 中转站里有很多开发者分享的社区 .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           " 开启语法高亮(有些发行版默认已开)

如何应用?

  1. 在终端运行 vim ~/.vimrc
  2. i 进入插入模式,把上面的配置粘贴进去
  3. Esc,输入 :wq 保存退出
  4. 下次启动 Vim 就会生效;想让当前会话也生效,可以 :source ~/.vimrc

⚠️ 重要提醒:不要一次性粘贴全部配置!先加几条试试看,每加一条都要理解它的作用。否则出了问题都不知道是哪条引起的。


八、练习路径:从生疏到肌肉记忆

学 Vim 的关键不在于背命令,而在于多用。以下是一个渐进式练习计划:

  1. 第一天:只用 hjkl 移动,不碰方向键。目标是在任意文件中从头走到尾。
  2. 第二天:加入删除和复制——ddyyp。试着把一段文字复制并重新排序。
  3. 第三天:练搜索——/关键词nN。找一个长文件中特定的内容。
  4. 第四天:体验可视模式——vV,选中几行,按 > 缩进或按 d 删除。
  5. 第五天:尝试用 . 重复操作,看看能省下多少敲击次数。
  6. 一周后:打开 .vimrc,逐步加入上面推荐的配置。

坚持一周,你会发现自己的手逐渐形成肌肉记忆,回头看"原来我以前一直用鼠标点点点,效率那么低"。


九、不想背命令?让 AI 教你

每个人的编程习惯不一样,有些人就是记不住 hjkl 的方向,或者嫌自己手短够不到 Esc。没关系——现在有了更省事的做法:让 AI 帮你写命令

比如你想在 Vim 里批量把所有英文句首字母改成大写,但你不知道用什么命令,可以直接把光标放到那行,打开终端里的 AI 助手(很多是基于 OpenAI 兼容接口调用的),问它一句:“Vim 里怎么批量大写每个单词首字母?” AI 会给你答案。

如果你想尝试这类 AI 辅助工具,可以看看云间 API 中转站(https://cloudzone-api.cyou/)——这是一个面向开发者的 API 聚合平台,支持 90+ 模型,包括 OpenAI 兼容和 Anthropic 兼容接口,国内直连无需翻墙,价格 0.05 折起,还有香港节点可用。无论你是想用 Claude 还是 GPT 系列模型,里面基本都能找到合适的。而且它是按量计费没有月租压力,对于偶尔用一下 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"
  echo "  · 或使用云间中转站线上学习(https://cloudzone-api.cyou/,国内直连、90+ 模型按量计费)"
  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 "  想省事也可以试试云端 AI(如 https://cloudzone-api.cyou/,"
Write-Host "   国内直连,90+ 模型按量计费,不用自己配环境)"
Write-Host "============================================"

本文系清澈解码(CleanResolver.com)原创教程,采用 CC BY-NC-SA 4.0 许可。脚本公开源码,欢迎复制给任何 AI 审查。