Linux小课堂: Vim与Emacs之Linux文本编辑器的双雄格局及Vim安装启动详解
概述
在 Linux 和 Unix-like 系统的文本编辑领域,Vim 与 Emacs 被誉为“上古神器”,长期主导着终端环境下的代码编写、配置管理与系统运维任务。二者不仅具备强大的文本处理能力,更构建了完整的插件生态与社区文化。
在Linux系统中,文本编辑器是开发者日常工作中不可或缺的核心工具。尽管已有诸如nano这类基础编辑器的存在,但其功能相对有限,适用于初学者快速上手
Vim(Vi Improved)是传统 vi 编辑器的增强版本,其名称即表明其设计目标——对原始 vi 的功能进行现代化扩展。作为多数类 Unix 系统中默认集成的编辑工具,Vim 因其轻量、高效、模式化操作而深受开发者青睐。其官网为 https://www.vim.org,提供详尽文档、插件资源及源码下载
macs 则由 Richard Stallman 发起并主导开发,隶属于 GNU 项目,官网为 https://www.gnu.org/software/emacs/。它不仅仅是一个文本编辑器,更被广泛称为“可编程的编辑环境”或“操作系统之上的操作系统”。Emacs 支持 Lisp 扩展语言(Elisp),可通过插件实现网页浏览、邮件收发、日程管理、终端模拟等复杂功能,甚至可运行游戏和 IRC 客户端
值得注意的是,Nano 也是 GNU 项目的一部分,与 Emacs 同属一个开源体系,但定位更为基础,适合初学者快速上手简单编辑任务
而对于追求效率、灵活性与深度控制的专业用户而言,Vim 和 Emacs 才是真正的“上古神器”,二者长期主导着命令行文本编辑领域的技术生态
Vim:VI的进化形态,程序员的极客利器
尽管大多数主流 Linux 发行版已预装 Vim,但仍存在部分精简系统未包含该工具的情况
因此,掌握手动安装流程至关重要
Vim 的命名由来与历史背景
- Vim 是 “Vi Improved” 的缩写,意为“改进版 Vi”,由 Bram Moolenaar 于 1991 年基于原始 Unix 编辑器 Vi 开发
- 在绝大多数基于 Unix 衍生的操作系统(包括 CentOS、Ubuntu、Debian 等)中,Vim 已成为事实上的默认文本编辑器
对于基于 Red Hat 系列的发行版(如 CentOS、RHEL、Fedora),推荐使用 yum 或 dnf 包管理器执行安装:
使用 yum 安装 vim(适用于较老版本)
sudo yum install -y vim或使用 dnf(现代 Fedora/RHEL)
sudo dnf install -y vim
对于 Debian/Ubuntu 系列系统,则使用 apt:
sudo apt update
sudo apt install -y vim
安装完成后,可通过以下命令验证 Vim 是否正确安装并查看其详细信息:
vim --version
此命令将输出 Vim 的编译选项、支持特性(如 Python 脚本支持、GUI 支持)、补全功能、正则表达式引擎类型等关键元数据,便于后续高级定制
Vim(Vi Improved) 是对原始 vi 编辑器的重大改进版本,名称中的 “Improved” 明确表达了其作为增强型编辑器的定位。它不仅保留了 vi 的高效键盘操作逻辑,还引入了语法高亮、多级撤销、宏录制、插件系统等现代开发所需的关键特性。
绝大多数基于 Unix 的操作系统,包括常见的 Linux 发行版(如 CentOS、Ubuntu、Debian 等),默认预装 vi 命令,而实际运行的往往是 vim 的软链接。可通过以下命令验证:
ls -l $(which vi)
输出示例:
lrwxrwxrwx 1 root root 4 Feb 10 12:34 /usr/bin/vi -> vim
这表明 vi 实际指向 vim 可执行程序,说明系统已集成 Vim。
访问 Vim 官网 可获取最新版本信息、源码下载及社区支持资源
Vim 的核心优势与程序员适配性分析
Vim 被明确定义为 a programmer’s text editor(程序员专用文本编辑器),其设计理念围绕“减少手指移动”、“提升编辑效率”展开。通过模态编辑机制(Modal Editing),用户可在不同操作模式间切换,从而以极低的键盘位移完成复杂的文本修改任务。
相较于 Nano 这类线性编辑器,Vim 提供了:
- 高度可定制性:通过
.vimrc配置文件定义缩进规则、语法高亮、快捷键映射等; - 强大的正则搜索替换:支持 Perl 兼容正则表达式进行跨行匹配与捕获组替换;
- 多缓冲区与分屏编辑:允许同时打开多个文件并在窗口间跳转;
- 宏录制功能:可记录一系列操作并批量应用于其他文本片段;
- 插件架构:借助 Vundle、Pathogen 或原生 package 支持,集成 LSP、自动补全、Git 集成等功能。
这些特性使其成为软件开发、DevOps 自动化脚本编写、配置文件调试等场景的理想选择
内建教程 vimtutor 的使用方法与学习价值
为了降低新手入门门槛,Vim 内置了一个名为 vimtutor 的交互式教学程序。该程序本质是一个预设内容的只读 Vim 会话,引导用户逐步掌握基本操作。
启动方式极为简单:
vimtutor
该命令默认加载英文教程。如需使用中文版本(若系统语言包支持),可尝试:
LANG=zh_CN.UTF-8 vimtutor
vimtutor 教程结构清晰,包含以下几个核心章节:
- Lesson 1.1: 移动光标
掌握h,j,k,l分别对应左、下、上、右移动; - Lesson 1.2: 退出 Vim
学习:q(quit)、:q!(强制退出不保存)、:wq(保存并退出)等命令; - Lesson 1.3: 文本插入与删除
练习i(插入模式)、x(删除字符)、dd(删除整行)等基础操作; - Lesson 1.4: 文本修改与重复
使用cw修改单词、.重复上次操作; - Lesson 1.5: 撤销与重做
u撤销、Ctrl+r重做; - Lesson 1.6: 搜索与跳转
/pattern搜索、n下一个匹配项、N上一个匹配项。
整个教程约需 30 分钟完成,完成后即可具备独立使用 Vim 编辑文件的能力。虽无法覆盖全部高级功能(如宏、寄存器、可视模式),但足以建立坚实的操作直觉。
退出 vimtutor 的方式与普通 Vim 相同:
:q<Enter>
Emacs:不只是编辑器,更是操作系统级别的扩展平台
Emacs(全称:GNU Emacs)由 Richard Stallman 发起并主导开发,是 GNU 项目的重要组成部分之一。作为一个高度可定制的文本编辑器,Emacs 的设计理念远超传统编辑范畴——它本质上是一个以 Lisp 为核心脚本语言的运行时环境。
Emacs 默认未在多数 Linux 发行版中安装,需通过包管理器手动部署。例如:
# RedHat/CentOS/Fedora 使用 dnf 或 yum
sudo yum install emacs
# 或
sudo dnf install emacs # Ubuntu/Debian 使用 apt
sudo apt install emacs# 或从源码编译安装(适用于定制需求)
git clone https://git.savannah.gnu.org/git/emacs.git
cd emacs && ./autogen.sh && ./configure && make && sudo make install
Emacs 的强大之处在于其近乎无限的扩展能力。借助 ELisp 插件系统,用户可在 Emacs 内实现:
- 邮件收发(
mu4e,gnus) - 日程管理(
org-mode) - 终端模拟(
eshell,ansi-term) - Web 浏览(
eww) - 多媒体播放(音频/视频)
- 版本控制集成(Magit)
- 日程管理(Org-mode)
甚至有调侃称:“Emacs 能做任何事,除了不能当你女朋友。” 这句戏言恰恰凸显了其功能之全面
值得注意的是,Nano 同样隶属于 GNU 项目,与 Emacs 共享自由软件哲学背景。因此,从项目归属来看,nano 与 emacs 属于同一体系,而 vim 则独立发展,形成鲜明对比
Vim与Emacs之争:编辑器门派的信仰之战
使用范式对比
| 维度 | Vim | Emacs |
|---|---|---|
| 核心理念 | 模式驱动编辑,强调效率与键盘流 | 一体化平台,强调可编程性与统一环境 |
| 学习曲线 | 初期陡峭,后期极速 | 极其陡峭,但一旦掌握即拥有上帝权限 |
| 扩展语言 | Vimscript / Lua(新版本) | Emacs Lisp(Lisp 方言) |
| 社区文化 | “少即是多”,崇尚极简主义 | “万物皆可编程”,追求极致控制 |
| 典型用户群体 | DevOps 工程师、系统管理员、高频终端使用者 | 学术研究者、Lisp 爱好者、重度 Org-mode 用户 |
围绕 Vim 与 Emacs 的优劣比较,长期以来形成了激烈的社区争论,被称为“编辑器战争”(Editor War)。这种争执已超越技术本身,演变为一种文化现象,反映出不同编程哲学与工作流偏好的冲突。
- Vim 派 强调“模式化编辑”带来的极致效率,主张“少移动手指,多用快捷键”,适合频繁进行代码跳转、批量修改的场景。
- Emacs 派 则推崇“一体化工作空间”的理念,认为应将所有开发活动集中于单一环境中完成,减少上下文切换。
尽管两者理念迥异,但都要求用户投入大量时间学习和定制。选择哪一款,往往取决于团队协作习惯、个人偏好以及项目需求。建议初学者优先采用周围同事或社区主流使用的编辑器,以便获得及时的技术支持与经验分享。
作者本人虽个人倾向 Emacs,但在实际工作中仍主要使用 Vim,原因正是为了与团队保持工具链一致性,避免协作障碍
选择建议:基于协作生态而非个人偏好
虽然作者个人更偏好 Emacs,但在实际工作中仍主要使用 Vim,原因如下:
- 团队一致性优先:同事普遍使用 Vim,便于共享
.vimrc配置、快捷键习惯及插件方案。 - 降低沟通成本:Pair Programming 或 Code Review 时无需解释特殊绑定。
- 跨服务器兼容性更强:几乎所有生产服务器都预装了 Vim 或 vi 兼容环境。
因此,选择哪款编辑器不仅关乎技术能力,更涉及团队协作效率与工程规范统一性
技术选型建议与工程实践考量
关于“选择 Vim 还是 Emacs”的争论,本质上属于开发者工作流哲学之争。然而,在实际工程环境中,应遵循以下原则进行理性决策:
优先考虑团队一致性
选择团队普遍使用的编辑器可显著提升协作效率。例如,若团队成员均使用 Vim,则统一采用 Vim 可确保:
- 配置共享(
.vimrc文件同步); - 快捷键习惯一致,便于结对编程;
- 插件栈兼容(如配合 ALE、CoC 实现代码诊断);
- 减少因编辑器差异导致的换行符、缩进风格问题
性能与环境适应性对比
| 特性 | Vim | Emacs |
|---|---|---|
| 启动速度 | 极快(毫秒级) | 较慢(需加载 Elisp 环境) |
| 内存占用 | 低 | 高 |
| 远程服务器适用性 | 极佳(纯终端运行) | 一般(依赖完整环境) |
| 可扩展性 | 中等(通过 Vimscript/Lua) | 极强(Elisp 完整编程语言) |
因此,在容器化部署、CI/CD 流水线、SSH 远程调试等场景中,Vim 更具实用性
个人技能拓展建议
尽管专精一种工具是合理策略,但从职业发展角度出发,建议开发者至少了解两种主流编辑器的基本操作。作者本人同时掌握 Vim 与 Emacs,虽日常以 Vim 为主(出于团队协同需求),但在需要深度自动化时仍会启用 Emacs 的 Org-mode 或 Magit(Git 前端)
Vim安装与启动流程详解
虽然大多数 Linux 系统默认安装 Vim,但仍存在部分精简发行版未包含该组件的情况。此时需手动安装
1 ) 检查当前系统是否已安装 Vim
查询 vim 是否存在
which vim || echo "Vim not found"查看版本信息
vim --version | head -n 5
示例输出:
VIM - Vi IMproved 8.2 (2019 Dec 12)
Included patches: 1-4673
Modified by <debian-vim-maintainers@lists.debian.org>
Compiled by <debian-vim-maintainers@lists.debian.org>
Huge version with GTK3 GUI.
2 ) 使用 YUM 包管理器安装(适用于 RHEL/CentOS)
sudo yum install -y vim-enhanced
注:vim-enhanced 提供完整功能集,包含脚本支持、图形界面选项等;若仅需基础版,可安装 vim-minimal
3 )使用 DNF(Fedora 新版)
sudo dnf install vim
4 ) 验证安装结果
vim --version | head -n 5
预期输出将显示 Vim 版本号、编译时间、支持特性(如 +python3, +clipboard 等)。
5 )启动 Vim
直接输入命令即可进入编辑界面:
vim
首次启动后可输入 :q 并回车退出,此为标准退出指令(:quit 的缩写)。
6 )查阅手册页了解详情
man vim
手册中明确描述 Vim 为 “a programmer’s text editor”,强调其面向开发者的设计初衷,并详细列出启动参数、配置路径、运行模式等内容。
Vim官方教程:vimtutor —— 新手入门的最佳起点
为降低学习门槛,Vim 内置了一个交互式教学程序:vimtutor
该程序并非独立应用,而是通过调用 vim 打开一个预设的帮助文档,引导用户逐步掌握基本操作
启动教程:
# 直接运行即可(无需 sudo)
vimtutor
该命令会复制一份英文教程文件至当前目录并启动 Vim 加载之。内容结构清晰,分为多个课程模块:
1 )Lesson 1.1: 移动光标(Moving the cursor)
教授 h、j、k、l 四个方向键的使用,替代箭头键,提升盲打效率。
2 )Lesson 1.2: 退出 Vim(Exiting Vim)
演示 :q(quit)、:q!(强制退出不保存)、:wq(保存并退出)等常用命令。
3 ) Lesson 1.3: 文本删除与插入(Deleting and Inserting Text)
介绍 x(删除字符)、i(插入模式)、a(追加模式)等核心操作。
4 ) 后续章节涵盖复制粘贴(yank/put)、查找替换、多文件编辑等进阶技能
整个教程约需 30分钟 完成,完成后即可具备基础 Vim 操作能力。虽无法覆盖全部功能(如窗口分屏、宏录制、正则搜索等),但足以支撑日常编码任务。
退出教程方式与其他 Vim 实例一致:输入 :q 并回车。
注意事项:
- 若系统提示
command not found: vimtutor,说明vim-common或对应语言包未安装,请补装后再试。 - 中文用户可尝试运行
vimtutor zh加载中文教程(需系统支持中文 locale)。
基于 NestJS + TypeScript 的 Vim 配置自动化脚本
1 ) 方案1
为体现专业性与实践价值,以下提供一段完整的 Node.js 脚本(基于 NestJS 框架思想组织),用于检测系统是否安装 Vim、自动安装缺失组件,并初始化 .vimrc 配置文件
// vim-setup.service.ts
import { Injectable } from '@nestjs/common';
import { execSync } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';@Injectable()
export class VimSetupService {private readonly homeDir = process.env.HOME || require('os').homedir();private readonly vimrcPath = path.join(this.homeDir, '.vimrc');/* 主入口:检查、安装、配置 Vim 环境*/async setupVimEnvironment(): Promise<void> {console.log('🔍 正在检测 Vim 安装状态...');if (!this.isVimInstalled()) {await this.installVim();} else {console.log('✅ Vim 已安装,版本信息如下:');this.printVimVersion();}this.configureVimrc();this.verifyTutorAvailability();console.log('🎉 Vim 开发环境已准备就绪!');}/* 检查 Vim 是否已安装*/private isVimInstalled(): boolean {try {execSync('vim --version', { stdio: 'pipe' });return true;} catch (error) {return false;}}/* 输出 Vim 版本信息*/private printVimVersion(): void {try {const versionOutput = execSync('vim --version', { encoding: 'utf8' });const lines = versionOutput.split('\n');console.log(lines.slice(0, 5).join('\n'));} catch (err) {console.error('❌ 无法读取 Vim 版本信息');}}/* 自动安装 Vim(基于发行版判断)*/private async installVim(): Promise<void> {const distro = this.detectLinuxDistro();let command = '';switch (distro) {case 'ubuntu':case 'debian':command = 'sudo apt update && sudo apt install -y vim';break;case 'centos':case 'rhel':command = 'sudo yum install -y vim-enhanced';break;case 'fedora':command = 'sudo dnf install -y vim';break;default:throw new Error(`Unsupported distribution: ${distro}`);}console.log(`📦 正在执行安装命令:${command}`);try {execSync(command, { stdio: 'inherit' });console.log('✅ Vim 安装成功!');} catch (error) {console.error('❌ Vim 安装失败,请手动处理依赖问题。');throw error;}}/* 简单识别 Linux 发行版 */private detectLinuxDistro(): string {try {const osRelease = fs.readFileSync('/etc/os-release', 'utf8');if (osRelease.includes('ID=ubuntu')) return 'ubuntu';if (osRelease.includes('ID=debian')) return 'debian';if (osRelease.includes('ID=centos')) return 'centos';if (osRelease.includes('ID="rhel"')) return 'rhel';if (osRelease.includes('ID=fedora')) return 'fedora';} catch (err) {console.warn('⚠️ 无法读取 /etc/os-release');}return 'unknown';}/* 创建基础 .vimrc 配置文件*/private configureVimrc(): void {const defaultConfig = `
" =============================
" Generated by NestJS Vim Setup
" =============================
set number " 显示行号
set relativenumber " 相对行号模式
set tabstop=2 " Tab 宽度为 2
set shiftwidth=2 " 自动缩进宽度
set expandtab " 使用空格代替 Tab
set autoindent " 自动继承缩进
syntax on " 启用语法高亮
set mouse=a " 启用鼠标支持
set ignorecase smartcase " 忽略大小写智能匹配
set hlsearch " 高亮搜索结果
set incsearch " 输入时即时搜索`.trim();if (fs.existsSync(this.vimrcPath)) {console.log('ℹ️ .vimrc 已存在,跳过生成');return;}try {fs.writeFileSync(this.vimrcPath, defaultConfig, 'utf8');console.log('✅ .vimrc 初始化配置已完成');} catch (err) {console.error('❌ 无法写入 .vimrc 文件,请检查权限');}}/* 验证 vimtutor 是否可用*/private verifyTutorAvailability(): void {try {execSync('which vimtutor', { stdio: 'pipe' });console.log('📘 vimtutor 教程程序已就绪,可通过命令 \`vimtutor\` 启动');} catch {console.warn('⚠️ vimtutor 未找到,建议安装 vim-common 或 vim-gtk 包');}}
}
使用方法(NestJS 应用集成):
# 安装依赖
npm install @nestjs/common child_process fs path# 在 AppModule 中注册服务并调用
const app = await NestFactory.create(AppModule);
const vimService = app.get(VimSetupService);
await vimService.setupVimEnvironment();
2 )方案2
维护一个 NestJS 微服务项目,需频繁编辑控制器、服务和 DTO 类。以下是如何利用 Vim 提升开发效率的具体配置。
创建 .vimrc 配置文件以支持 TS 开发
" ~/.vimrc - NestJS + TypeScript 开发优化配置" 启用语法高亮
syntax on" 显示行号
set number" 启用相对行号(便于跳转)
set relativenumber" 设置 tab 宽度为 2(符合 TS 规范)
set tabstop=2
set shiftwidth=2
set expandtab " 启用鼠标支持(方便窗口切换)
set mouse=a" 启用持久化撤销(即使关闭文件也能撤销之前更改)
set undofile " 搜索忽略大小写(智能区分)
set ignorecase
set smartcase" 高亮搜索结果
set hlsearch
set incsearch" 启用括号匹配高亮
set showmatch" 自动补全设置(基础)
set completeopt=menuone,noselect " 文件类型插件启用
filetype plugin indent on" 插件管理示例(使用 vim-plug)
call plug#begin('~/.vim/plugged')
Plug 'leafgarland/typescript-vim' " TS 语法增强
Plug 'maxmellon/vim-jsx-pretty' " JSX 支持
Plug 'preservim/nerdtree' " 文件树浏览
Plug 'tpope/vim-surround' " 快速包围标签/引号
call plug#end()" 快捷键绑定
nnoremap <C-n> :NERDTreeToggle<CR>
示例:使用 Vim 编辑 NestJS 控制器
// src/user/user.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';@Controller('users')
export class UserController {constructor(private readonly userService: UserService) {}@Get()findAll(): string[] {return this.userService.getAllUsers();}@Post()create(@Body() createUserDto: CreateUserDisposable): string {return this.userService.createUser(createUserDto);}
}
在 Vim 中的操作路径:
- 使用
vim src/user/user.controller.ts打开文件; - 按
G跳至末尾添加新方法; - 按
o插入新行并进入 Insert 模式; - 输入代码后按
<Esc>返回 Normal 模式; - 使用
:w保存,:q退出。
3 ) 方案3
附录:NestJS + TypeScript 示例项目中的 Vim 集成配置
以下为一个典型 NestJS 项目的 .vimrc 配置片段,展示如何将 Vim 打造成现代化 Node.js 开发环境:
" -------------------------
" 基础设置
" -------------------------
set number " 显示行号
set relativenumber " 相对行号(便于跳转)
set tabstop=2 " Tab 显示宽度
set shiftwidth=2 " 缩进宽度
set expandtab " Tab 转为空格
set autoindent " 自动继承缩进
set smartindent " 智能缩进
set ignorecase smartcase " 搜索忽略大小写,除非含大写字母
set hlsearch " 高亮搜索结果
set incsearch " 输入时即时搜索
set cursorline " 高亮当前行
set showmatch " 匹配括号跳转提示 " -------------------------
" 文件类型检测与语法高亮
" -------------------------
filetype on
filetype plugin on
syntax enable" -------------------------
" TypeScript / NestJS 特定优化
" -------------------------
autocmd FileType typescript setlocal ts=2 sw=2 sts=2 et
autocmd BufNewFile,BufRead *.ts,*.js,*.json,*.yaml,*.dockerfile setlocal formatoptions-=c formatoptions-=r formatoptions-=o" -------------------------
" 插件管理(使用 native package)
" -------------------------
" mkdir -p ~/.vim/pack/plugins/start
" git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/plugins/start/nerdtree
" git clone https://github.com/vim-airline/vim-airline ~/.vim/pack/plugins/start/vim-airline
" git clone https://github.com/scrooloose/syntastic ~/.vim/pack/plugins/start/syntastic " 启用 NERDTree 文件浏览器
map <C-n> :NERDTreeToggle<CR>
let NERDTreeShowHidden=1" 状态栏美化
let g:airline_powerline_fonts = 1" -------------------------
" Linter 集成(配合 ESLint)
" -------------------------
let g:syntastic_typescript_checkers = ['eslint']
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
此外,结合 VSCode Remote-SSH 使用时,也可配置 .devcontainer.json 在容器内预装 Vim 并挂载配置:
{"image": "node:18-alpine","features": {"ghcr.io/devcontainers/features/git:1": {}},"postCreateCommand": "apk add --no-cache vim && mkdir -p ~/.vim && echo 'source ~/vimrc-dev' > ~/.vimrc","remoteUser": "node"
}
总结要点提炼
掌握 Vim 是通往高级 Linux 开发的必经之路
- 结合
.vimrc配置与插件体系,Vim 可完美胜任现代 TypeScript/NestJS 全栈开发任务 - Vim 与 Emacs 是 Linux 下最具影响力的两大文本编辑器,分别代表“轻量高效”与“全能扩展”两种设计范式
- Vim 作为 vi 的现代化演进版本,广泛预装于各类 Linux 系统,具备强大的模式化编辑能力,深受开发者青睐
- Vim 是 VI 的现代化演进版本,具备强大编辑能力,广泛预装于各类 Linux 发行版
- Emacs 凭借 GNU 项目背书与 Lisp 扩展机制,构建出近乎操作系统的编辑环境,功能边界远超普通编辑器
- Emacs 是功能完备的计算环境,超越编辑器范畴,适合长期沉浸式使用
- 选择编辑器应结合团队协作现实与学习成本权衡,不宜盲目追随“信仰之争”
vimtutor是官方提供的交互式教学工具,通过实践练习帮助新手快速掌握 Vim 核心操作- 自动化脚本可用于标准化 Vim 环境部署,尤其适用于 DevOps 流程或新机器初始化场景
最终结论:不要盲目信仰某一工具,而应让工具服务于协作、效率与可持续交付的目标
