Bram Moolenaar 去世后,Vim 9.0 引入了 Vim9script 等大幅变更,社区对"要不要跟"产生了分歧。Vim Classic 就是在这个背景下诞生的——它从 Vim 8.2 分叉出来,只做维护,不追新功能。首个版本 8.3.0 基于 Vim 8.2.0148,并保守地回移了部分后续补丁。如果你日常用 Vim 写代码、改配置,并不需要 Vim9script 的语法革新,这个分支值得关注。
为什么有人需要 Vim Classic
Vim 9.0 的核心变化是引入了 Vim9script——一种新的脚本语言,声称执行速度更快、语法更接近主流编程语言。但现实是:
- 大量现有插件和 vimrc 配置用的是传统 Vimscript,迁移成本不低。
- Vim9script 的生态还在早期,很多插件作者没有动力重写。
- 部分 Linux 发行版和长期维护的系统仍然停留在 8.x 系列,升级 9.0 可能带来兼容性风险。
Vim Classic 的定位很明确:长期维护 8.2 这条线,只修 bug,不加新功能。它接受 8.2 到 9.0 之间的上游补丁,但前提是经过调整、不会引入破坏性变更。这本质上是一个"稳定版"的概念,类似 Linux 内核的 LTS 分支。
8.3.0 里有什么
这个版本的基础是 Vim 8.2.0148,也就是 8.2 系列早期的一个快照。在此基础上,Vim Classic 回移了部分后续的 bug 修复,但刻意避开了:
- Vim9script 相关的所有改动
- 可能改变现有行为的"功能增强"类补丁
- 涉及新命令或新选项的补丁
这意味着,如果你从 Vim 8.2 升级到 Vim Classic 8.3,体验几乎无缝——你的 vimrc、插件、键映射都不会出问题。差异主要在内部:一些崩溃修复、边界条件处理、边缘平台的编译问题被修正了。
安装与共存:把 Vim Classic 跑起来
Vim Classic 目前需要从源码编译。下面是一套完整的编译流程,编译后的二进制命名为 vimclassic,这样它可以和系统自带的 vim 共存,不会互相干扰。
# 克隆仓库
git clone https://github.com/vim-classic/vim-classic.git
cd vim-classic
# 查看当前版本标签
git tag -l | tail -5
# 切到 8.3.0 发布标签(具体标签名以仓库实际为准)
git checkout v8.3.0
# 配置编译——关键:把二进制名改为 vimclassic,避免覆盖系统 vim
./configure \
--with-features=huge \
--enable-multibyte \
--enable-python3interp \
--with-compiledby="vimclassic-local" \
--prefix=/usr/local \
--with-vim-name=vimclassic
# 编译并安装
make -j$(nproc)
sudo make install
安装完成后验证:
# 检查版本
vimclassic --version | head -3
# 确认和系统 vim 不冲突
which vim
which vimclassic
--with-vim-name=vimclassic 是关键参数。它让编译产物叫 vimclassic 而不是 vim,这样你系统里原有的 Vim(可能是 8.0 或 9.0)不受影响。想用稳定版时敲 vimclassic,想试新版时敲 vim,各走各的路。
日常配置:让 Vim Classic 用起来顺手
如果你决定把 Vim Classic 作为主力编辑器,可以给它一个独立的配置文件入口,避免和原有 vimrc 混在一起:
# 创建别名,指向独立 vimrc
echo 'alias vc="vimclassic -u ~/.vimclassicrc"' >> ~/.bashrc
source ~/.bashrc
然后写一个最小但实用的 ~/.vimclassicrc:
" Vim Classic 专属配置——稳定优先,不追新特性
set nocompatible
set encoding=utf-8
set fileencoding=utf-8
" 基础编辑行为
set number
set relativenumber
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent
set smartindent
" 搜索
set hlsearch
set incsearch
set ignorecase
set smartcase
" 撤销持久化——Vim 8.2 已支持
set undofile
set undodir=~/.vimclassic/undo
" 确保撤销目录存在(Vim 不会自动创建)
if !isdirectory(&undodir)
call mkdir(&undodir, 'p', 0700)
endif
" 插件管理——用 Pathogen,轻量且兼容传统 Vimscript
runtime autoload/pathogen.vim
if exists('g:loaded_pathogen')
call pathogen#infect('~/.vimclassic/bundle/{}')
endif
" 键映射——只做增强,不改默认行为
nnoremap <Space> <Nop>
let mapleader = "\<Space>"
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
nnoremap <Leader>b :buffers<CR>
这套配置刻意避开了 Vim9script 语法,全部使用传统 Vimscript,保证在 Vim Classic 上零问题运行。持久化撤销(undofile)是 Vim 8.x 的原生功能,不需要任何插件,重启编辑器后也能恢复之前的撤销历史。
选择建议:谁该用,谁不该用
适合用 Vim Classic 的场景:
- 服务器运维、嵌入式开发等环境,工具链升级节奏慢,稳定性优先。
- 有大量传统 Vimscript 配置和插件,短期内不想迁移到 Vim9script。
- 团队统一编辑器版本,不想因为 Vim 版本差异导致行为不一致。
不适合的场景:
- 你正在开发 Vim9script 插件,或依赖只支持 9.0+ 的插件。
- 你需要 Vim 9.0 引入的具体新功能(如 Vim9script 的
def函数、新终端模式行为等)。
风险提示:
- Vim Classic 是社区维护项目,不是官方分支。维护者的精力和节奏决定了它能走多远。
- 它只回移"经过调整"的补丁,这意味着某些上游安全修复可能延迟到达,或者因为调整而改变了行为范围。如果你的环境对安全补丁响应时间有严格要求,需要自行跟踪上游变更日志。
一个简单的自查清单:
- [ ] 现有 vimrc 和插件在 8.2 上是否全部正常?→ 如果是,迁移到 Vim Classic 几乎零成本。
- [ ] 是否依赖任何只声明支持 Vim 9.0+ 的插件?→ 查插件文档的兼容性声明。
- [ ] 编译环境是否满足
hugefeature 集的需求(Python3、multibyte 等)?→ 用vimclassic --version确认 feature 列表。 - [ ] 是否需要和系统 vim 共存?→ 编译时务必用
--with-vim-name改名。
Vim Classic 不是要替代 Vim 9.0,而是给那些"8.2 够用了、别给我加东西"的用户一个安心的选择。编辑器是每天摸的工具,稳定比时髦重要——如果你属于这个阵营,花十分钟编译一个 vimclassic,试试看。