简介:这是一份面向Linux开发者、运维人员及系统管理初学者的Emacs入门参考资料,系统梳理了Emacs的起源、功能特性以及在Redhat Enterprise 5下的安装配置流程。PDF内容不仅介绍了Emacs作为集成开发环境的核心能力,涵盖代码编辑、程序调试、邮件收发、日历查看、目录管理等多场景应用,还完整演示了从GNU官网获取安装包、解压、执行configure脚本到make编译的实操步骤,并特别说明重新配置时需清除编译备份文件等注意事项。资源仅含1个PDF文件,压缩包约143KB,内容精炼、无明显冗余。目前已有126人学习浏览,适合希望提升Linux环境文本处理效率的软件工程师作为快速上手指南。通过这份材料,读者能够理解Emacs相较于普通编辑器的优势,并可按步骤独立完成在Redhat系统中的安装与基础配置,为后续深入定制和插件使用打下良好基础。
1. 为什么在Linux终端里,Emacs依然是绕不开的文本编辑器
提到Linux下的文本编辑,大部分人第一个想到的是vi,第二个才是Emacs。标题里的"Linux下文本编辑利器Emacs简介与安装过程"听起来像一份入门文档,但真正把它落到命令行上是三件事:搞清楚它在什么场景值得装、用什么方式装、装完怎么验证和避坑。Emacs诞生于1976年,比Linux本身还老,却到今天依然是不少运维和开发者的主力编辑器,原因在于它不只是编辑器,而是一个常驻内存的Lisp解释器外壳。对于正在学Linux常用命令、经常要改配置文件或者写脚本的从业者来说,Emacs的安装成本比Nginx低得多,真正的门槛是在装完之后的第一晚:界面看起来像一堆菜单、快捷键全是Ctrl和Alt组合、不知道往哪写配置。这篇笔记按"运行模型→安装方式→最小配置→踩坑记录"的顺序,让你在两小时内把Emacs变成日常顺手使用的工具,而不是装完就删。
2. Emacs的运行模型:图形界面的帧,终端里的缓冲区
2.1 图形版与纯终端版:同一个Emacs的两种形态
很多新手第一次敲emacs,发现弹出一个带菜单栏和工具栏的图形窗口,第一反应是自己误装了一个"IDE"。其实这是Emacs的图形界面形态,对应命令是emacs;而服务器上常用的纯终端形态对应的是emacs -nw,其中-nw是--no-window-system的简写,意思是"不要尝试连接窗口系统,直接在当前终端里渲染界面"。
两种形态共享同一套配置、同一个包管理器、同一种操作逻辑,区别只在于显示层。桌面环境的Linux发行版上,图形形态适合边看边改;SSH登录的远程服务器上,没有X11转发也没有图形会话,只能走-nw。我一般在~/.bashrc里放一行别名:
alias em='emacs -nw'这样在本地终端和远程SSH会话里都能用em快速进入文本界面。注意emacs和emacs -nw读的是同一份~/.emacs.d/init.el,所以本地图形界面里调好的设置,到了服务器上依然生效,这是Emacs跨环境一致性最大的好处。反过来,如果你的发行版装的是emacs-nox包(无图形支持版),那么emacs命令本身就跑不了图形界面,只能以终端形态使用。
2.2 缓冲区、窗口与框架:先记住这三个概念再开始配置
Emacs里最常让新手困惑的是它那套"缓冲区(Buffer)、窗口(Window)、框架(Frame)"三个名词。在Emacs语境下,窗口不是指操作系统里的窗口,而是指框架内部的一个面板;框架才是你在桌面上看到的那个顶层窗口。缓冲区是你正在编辑的内容载体,一个文件打开后对应一个缓冲区,多个文件对应多个缓冲区,它们可以藏在后台不显示。
这三个概念决定了几乎所有基础操作:C-x b切换缓冲区,C-x 2把当前框架竖直分成两个窗口,C-x 1让当前窗口独占整个框架,C-x k关闭当前缓冲区而不退出Emacs。刚上手时你不需要背全,但一定要记住一点:退出Emacs的快捷键C-x C-c关掉的是整个程序,所有未保存的缓冲区都会逐个提示是否保存;而关闭一个文件窗口用C-x k,它不会退出程序。
我见过不少新手第一次进Emacs后想"关掉这个文件"直接按了C-x C-c,结果整个程序退出了,重新打开又要找文件路径。区分清楚缓冲区与框架,后面的安装配置阶段会顺畅很多。
2.3 为什么说Emacs是一台"装在编辑器里的Lisp虚拟机"
Emacs的底层是一个Emacs Lisp解释器,编辑器的启动、绘制、按键响应全部由Lisp代码驱动。这意味着你改的不是"配置文件的开关",而是程序本身的执行逻辑。比如setq这个命令的完整含义是"set quote",给某个变量设置值;add-hook则是往某个事件钩子上追加函数。这些都写在init.el里,本质上是在改一份Lisp程序。
这个架构带来的直接后果是:Emacs的扩展能力远超普通编辑器,但也让它的配置文件看起来不像INI而像代码。安装Emacs只是第一步,装完后的包管理才是重点。现代Emacs内置了package.el包管理器,默认源是GNU ELPA,社区最大的第三方源是MELPA,里面有超过六千个包,覆盖代码补全、文件树、Git操作、markdown预览、终端模拟等场景。这也是为什么不少人说"Emacs是披着编辑器外衣的操作系统"——它把文件管理、进程调用、文本处理全部纳入了同一个快捷键体系。
理解到这一层,安装环节的选型逻辑就清楚了:如果你要的是一个"开箱即用的编辑器",随便哪个发行版自带的emacs包都够;如果你想把它当成可扩展的IDE底座,就要保证装到的版本不要太老,并且能访问包源。下面进入正题。
3. 在Linux上安装Emacs:发行版仓库、源码编译与snap三选一
3.1 用发行版包管理器安装:apt、dnf、pacman三条命令
对于大多数场景,直接用发行版官方仓库安装是成本最低、后续卸载最干净的方式。包名一般就叫emacs,也有部分发行版把纯终端版单独拆成emacs-nox。以下是主流发行版的对应关系:
| 发行版 | 推荐包名 | 安装命令 | 说明 |
|---|---|---|---|
| Debian / Ubuntu | emacs | sudo apt install emacs | 带GTK图形界面,依赖较多 |
| Debian / Ubuntu | emacs-nox | sudo apt install emacs-nox | 无图形依赖,适合服务器 |
| Fedora / RHEL | emacs | sudo dnf install emacs | 默认带图形支持 |
| Arch / Manjaro | emacs | sudo pacman -S emacs | 滚动发行版,版本通常很新 |
| openSUSE | emacs | sudo zypper install emacs | 包名同样是emacs |
装完立刻确认版本号,这是判断后续能不能顺利装插件的最快方法:
emacs --version which emacs逻辑说明:emacs --version能显示完整的GNU Emacs版本号,比如GNU Emacs 29.4,这个数字直接决定你能装哪些包;which emacs确认可执行文件的实际路径,避免系统里同时存在多个版本时调用了旧的那个。如果发行版自带的版本是27.x甚至更低,而你想用较新的补全框架或LSP客户端,建议直接跳到3.2节走源码编译,或者用3.3节的snap版本,不要在旧版本上浪费时间调兼容性。
3.2 源码编译安装:configure参数与依赖清单
当你需要较新版本、需要自定义编译参数(比如开启原生Lisp编译、指定GTK3工具包)时,源码编译是最可靠的路线。以Ubuntu/Debian为例,完整流程是这样的:
sudo apt update sudo apt install build-essential libgtk-3-dev libgnutls28-dev \ libncurses-dev libjansson-dev libgif-dev libxpm-dev libjpeg-dev \ libpng-dev libtiff-dev texinfo wget https://ftp.gnu.org/gnu/emacs/emacs-29.4.tar.gz tar xf emacs-29.4.tar.gz cd emacs-29.4 ./configure --with-x-toolkit=gtk3 --with-native-compilation=aot --prefix=/usr/local/emacs make -j$(nproc) sudo make install这里的build-essential提供编译器,libgtk-3-dev提供图形界面库,libgnutls28-dev是HTTPS访问包源时的TLS支持,libncurses-dev是终端界面的底层库,libjansson-dev用于JSON解析。装依赖时最常见的错误是漏掉某一个,导致configure阶段提示required library not found,后文避坑章节会专门讲。
configure参数是这套流程的决定性一步。--with-x-toolkit=gtk3指定用GTK3绘制图形界面,比默认的Xaw看起来现代;--with-native-compilation=aot开启Lisp原生编译,把Lisp字节码编译成机器码,运行大包时速度提升明显,但编译时间会变长;--prefix=/usr/local/emacs把程序装到独立目录,不想用了直接删这个目录加清理PATH即可,不污染系统目录。当你不想装图形库时,把--with-x-toolkit换成--without-x,就能得到一个纯终端版,专门扔到服务器上用。
3.3 用snap和flatpak安装的适用场景
如果不想折腾依赖也不想等编译,snap和flatpak是折中方案。Ubuntu上可以直接:
sudo snap install emacs --classic--classic参数很重要,因为Emacs需要读写用户目录下的配置和临时文件,严格沙箱模式下权限不够。对比来看,snap版的好处是镜像源更新及时,通常跟随上游版本;坏处是snap包首次启动较慢,而且沙箱对~/.ssh、~/.config等路径的访问限制偶尔会引出怪问题。flatpak版类似,安装命令是flatpak install flathub org.gnu.emacs,但它默认跑在沙箱里,访问宿主文件系统要手动授权,对新手不够直觉。
我的建议是:桌面开发机用发行版仓库包,追求新版本或特殊编译参数用源码编译,服务器上多版本共存用源码编译再加--prefix隔离,snap只在你不想管任何依赖时用。不要三种同时装,否则which emacs会指向不确定的位置,排查问题时很容易怀疑人生。
3.4 装完先做一件事:验证启动路径是否正确
安装完成后不要急着写配置,先用两条命令确认程序本身是健康的:
emacs -Q --version emacs -nw -Q逻辑说明:-Q等价于--quick,意思是跳过所有用户配置直接启动,以防你之前的~/.emacs.d里有历史遗留配置干扰判断。第一条验证程序能否正常打印版本;第二条在终端里启动纯净Emacs,你能看到底部状态栏有GNU Emacs字样,按C-x C-c退出。如果-Q模式正常而正常启动卡住或报错,几乎可以断定问题出在配置文件而不是安装过程。
这步验证也顺带检验了终端对Emacs的支持:某些SSH客户端字体宽度不一致时,终端模式下的表格线会错位,这不是Emacs坏了,是终端字体问题。确认安装健康后,进入下一节的配置阶段。
4. 首份init.el配置:行号、缩进、备份文件与包源
4.1 配置文件放哪:~/.emacs.d/init.el vs ~/.emacs
Emacs启动时按顺序查找初始化文件:先找~/.emacs,再找~/.emacs.d/init.el。现代做法是统一用后者,因为可以把配置文件目录本身纳入版本管理,整个~/.emacs.d目录就是一个可以带走的仓库。需要先创建目录:
mkdir -p ~/.emacs.d配置文件命名必须是init.el,Emacs不会自动读取其他名字。如果你的家目录里已经存在~/.emacs文件,建议把内容迁移到init.el后删掉旧的,避免两边配置同时生效造成不可预期的覆盖。迁移方法很简单:mv ~/.emacs ~/.emacs.d/init.el,但前提是确认~/.emacs.d里没有冲突。我习惯用Git管理这个目录,换新机器时git clone下来就能恢复整个工作环境。
4.2 一份开箱即用的最小配置:核心参数逐行解释
以下是我给新装系统时用的最小配置,保存到~/.emacs.d/init.el:
;; -*- lexical-binding: t -*- (setq inhibit-startup-screen t) (setq-default indent-tabs-mode nil) (setq-default tab-width 4) (setq make-backup-files t) (setq backup-directory-alist '(("." . "~/.emacs.d/backups"))) (setq backup-by-copying t) (setq auto-save-default t) (setq delete-auto-save-files t) (global-display-line-numbers-mode 1) (global-auto-revert-mode 1) (electric-pair-mode 1) (delete-selection-mode 1) (show-paren-mode 1) (set-charset-priority 'unicode) (prefer-coding-system 'utf-8) (setq default-buffer-file-coding-system 'utf-8)这段配置的逻辑分四块。第一行注释声明本文件使用词法绑定,是新版Emacs的推荐写法,避免变量作用域混乱。inhibit-startup-screen关掉每次启动的欢迎页;indent-tabs-mode设为nil表示缩进用空格不用Tab制表符,tab-width控制Tab显示宽度,这两个配合能让代码在跨编辑器查看时不错位。备份文件部分最容易踩坑:Emacs默认把file~这类备份文件写在原文件同目录,目录被弄脏之外还可能被同步工具误传,backup-directory-alist把备份统一挪到~/.emacs.d/backups,backup-by-copying先复制再改名,能避免写大文件时中断把原文件弄坏。
第三块是编辑体验参数。global-display-line-numbers-mode开启全局行号;global-auto-revert-mode让Emacs在文件被外部改动时自动重新读取缓冲区内容,在Git切换分支后不用手动revert;electric-pair-mode输入左括号自动补右括号;delete-selection-mode允许选中文本后直接输入覆盖选中内容;show-paren-mode高亮匹配括号。最后四行全部围绕中文编码:set-charset-priority把Unicode优先级提前,prefer-coding-system和default-buffer-file-coding-system都设为utf-8,三行同时设是防止个别模式下读取文件时识别成latin-1导致中文乱码。
改完配置后,用emacs -nw重新启动,看到左侧行号、欢迎页消失、输入括号自动配对,就说明配置生效了。不用每次都整套执行,改一项重启一次验证一项,排查起来最快。
4.3 接入MELPA包源:把Emacs变成可扩展的IDE底座
默认的GNU ELPA包源只有官方维护的少量包,实际需求里八成以上要依赖MELPA。在init.el末尾追加:
(require 'package) (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/"))) (package-initialize)参数说明:package-archives是一个列表,每个元素是一对"源名称与地址",package-initialize把已安装的包加载进来。配好后在Emacs里执行M-x package-refresh-contents拉取包索引,再执行M-x package-install就能按名字安装包。如果访问官方MELPA速度很慢或者反复超时,把第二行地址换成国内镜像源,常见做法是:
("melpa" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")镜像地址保持与官方同样的目录结构,package-refresh-contents逻辑不变。注意镜像更新会滞后若干小时,极个别新发布的包可能暂时拉不到,但日常使用几乎无感。这里也顺带回答一个高频疑问:装包不是"下载zip放到某个目录",而是通过package.el管理,它负责依赖解析和字节编译,你只需要在M-x package-list-packages里i标记、x执行安装。
4.4 新用户最常用的快捷键与命令入口
配置文件写完后,最需要的是几个高频快捷键,它们构成日常操作的全部骨架:
| 快捷键 | 组合含义 | 动作 |
|---|---|---|
| C-x C-s | C-x后C-s | 保存当前缓冲区 |
| C-x C-f | C-x后C-f | 打开文件,路径可补全 |
| C-x C-c | C-x后C-c | 退出Emacs |
| C-g | Ctrl+g | 取消当前命令或提示 |
| C-s | Ctrl+s | 增量向前搜索 |
| C-x k | C-x后k | 关闭缓冲区 |
| C-a / C-e | Ctrl+a / Ctrl+e | 跳到行首 / 行尾 |
| C-k | Ctrl+k | 删除到行尾 |
| M-x | Alt+x | 输入任意扩展命令 |
这里C-代表Ctrl键,M-代表Meta键,PC键盘上通常是Alt键,终端模式下可能被映射到Esc键。新手最需要记的其实是C-g:任何操作晕了头、命令输一半想反悔,按C-g都能取消回到正常编辑状态,这是Emacs里的"后悔药"。而M-x是通往一切功能的入口,比如调整窗口大小、切换主题、运行检查器,全部可以敲命令名触发。
5. 安装与首配避坑:版本太老、白屏、缺库与中文乱码
5.1 包管理器给的版本太老导致插件装不上
现象:Ubuntu 20.04这类长周期发行版,apt install emacs装完是27.1版,按社区教程安装比较新的补全框架或LSP客户端时,package-install报错提示"Package lacks a version"或者依赖包要求Emacs 28以上,甚至M-x package-refresh-contents都异常。
原因:发行版仓库的软件版本跟随发布周期冻结,不会频繁追上游。Emacs 27和29之间的API变化很大,新插件往往直接放弃对旧版本的支持,这不是你配置的问题,是版本差距的问题。
解决:三个方案按成本排序。第一,用snap装新版,sudo snap install emacs --classic,几分钟拿到29.x;第二,用3.2节的源码编译装到独立前缀目录,不干扰系统自带的旧版本;第三,如果你坚持用仓库版,就去MELPA上找兼容Emacs 27的旧版插件,但后续换机器还会遇到同样问题。我现在一律用源码编译加--with-native-compilation,因为服务器和桌面环境都可以锁同一个版本号,配置通用性最好。
5.2 图形版启动白屏、窗口反复闪烁
现象:点图标启动Emacs,窗口能弹出来但内部一片白,或者窗口反复重绘闪烁,有时正常启动后鼠标滚轮区域出现黑条。
原因:图形界面构建与桌面环境不匹配。常见于发行版默认包用GTK2构建而桌面是GNOME Wayland,或者显卡驱动对GTK3软渲染兼容性差;还有可能是.Xresources之类遗留设置干扰了字体渲染。
解决:先用emacs -Q启动,排除配置问题。如果-Q下正常,问题在用户配置;如果-Q下依然白屏,就是构建或环境问题。图形环境里试emacs -nw,如果终端模式一切正常而图形模式白屏,基本锁定图形库兼容性。这时换GTK3构建或者用--with-x-toolkit=no禁用X工具包会直接解决。我的习惯是桌面机装图形版、服务器装纯终端版,避免在同一个环境里同时依赖两套图形栈。
5.3 源码编译报错:"configure: error: The following required libraries were not found"
现象:按教程执行./configure,输出一堆检查项后停在错误行,提示找不到libgif、libxpm或libjpeg,然后make无法继续。
原因:configure阶段会检测图形、压缩、TLS等能力的底层开发库,这里要求的是-dev包而不仅是运行库。不同发行版包名不同,Ubuntu的libxpm-dev在Fedora上可能叫libXpm-devel,照搬命令必然翻车。
解决:Ubuntu/Debian系最省事的方式是sudo apt build-dep emacs,该命令读取Emacs源码包声明的构建依赖并全部安装;如果系统版本太老无法用build-dep,就对照3.2节列出的包逐一安装。Fedora/RHEL系用sudo dnf builddep emacs。错误提示里明确写了缺哪个库,缺什么装什么,装完重新跑./configure,不要跳过错误直接make,否则会在更深的编译阶段报更隐蔽的缺失头文件错误。源码编译这条链路里,configure报错是最好处理的,怕的是它检查通过但make到一半失败,那种情况多半是内存不足或磁盘空间不够,用make -j$(nproc)时并发过高也会触发,降到make -j2就能绕过。
5.4 终端里中文乱码且无法呼出输入法
现象:emacs -nw打开文件后中文显示为方块或问号,按Ctrl+Space无法切换中文输入法,而系统其他程序输入中文正常。
原因:终端Emacs的字符渲染依赖locale和终端编码,LANG环境变量未设置成UTF-8时,Emacs按latin-1解释UTF-8字节流必然乱码;输入法问题则是缺少XIM或IBus接口支持,图形版正常而终端版无法唤起输入法。
解决:先确认locale,echo $LANG,如果输出不是zh_CN.UTF-8或en_US.UTF-8,按以下方式修正:
sudo locale-gen zh_CN.UTF-8 echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc source ~/.bashrclocale-gen生成缺失的语言环境,export把它固定到当前用户的环境变量。输入法侧,图形会话里确保GTK_IM_MODULE=fcitx和QT_IM_MODULE=fcitx已导出;终端版场景我一般直接把输入法切到英文模式工作,因为终端Emacs场景大多是改配置和写脚本,中文输入需求很低。如果切输入法需求强烈,优先在图形界面里用Emacs,避免在终端形态里折腾XIM——这条路线的坑很深,投入产出不成比例。
5.5 MELPA包源刷新超时或返回错误
现象:执行M-x package-refresh-contents后长时间卡住,最终报http: connection timeout或Failed to download 'melpa' archive,package-list-packages里只有GNU源没有MELPA源。
原因:直连MELPA官方服务器的连接不稳定,或者网络代理对HTTPS连接做了限制。这个问题和Emacs本身无关,在浏览器里打开相同地址能访问也不代表Emacs进程能访问,因为Emacs用的是系统libgnutls走自己的连接逻辑。
解决:优先换国内镜像,修改package-archives里的地址为TUNA或中科大镜像;如果换镜像后仍失败,检查系统代理变量http_proxy和https_proxy是否设置正确。另外注意package-refresh-contents的索引文件较大,首次拉取可能看起来像卡死,给它一两分钟耐心等。也见过有人误把melpa写成melpa-stable导致索引格式异常而一直失败,这两个源的数据结构不同,混用会报解析错误,确认你的package-archives里只写其中一个。
6. 用--batch把Emacs当命令行工具:验证安装也验证配置
安装和配置做完后,最值得养成的习惯是用--batch模式验证环境和做文本批处理。--batch让Emacs以非交互方式运行,不启动界面、不读init文件、执行完表达式就退出,非常适合在脚本里验证安装状态:
emacs --batch --eval '(princ (format "GNU Emacs %s\n" emacs-version))'这段命令把emacs-version变量的值格式化成字符串打印到标准输出。如果输出正常,说明可执行文件路径正确、动态库完整,比emacs --version更进一步,因为它验证的是Emacs内部Lisp解释器能正常工作。我习惯在新机器上先跑这条命令,再写配置;配置写完后,用emacs --batch --eval '(progn (require \'package) (message "package loaded"))'验证包管理器没有在初始化时报错。
同样的机制可以处理批量文本替换任务,比如批量修改文件中的旧前缀:
emacs --batch config.ini \ --eval '(progn (goto-char (point-min)) \ (replace-string "old_prefix" "new_prefix") \ (save-buffer))'这里的逻辑是:--batch后紧跟文件名,Emacs启动后把该文件读入缓冲区;goto-char移动到缓冲区开头;replace-string把所有匹配文本替换;最后save-buffer把缓冲区写回磁盘。因为是非交互模式,整个过程没有任何弹窗,适合写进部署脚本里做配置文件的批量改写。要注意--batch默认不保存任何缓冲区,最后不写save-buffer的话,所有替换结果只停留在内存里,这是和交互模式最大的区别。
还有一个验证括号语法的小技巧:在init.el里按C-x C-e逐段执行,或者用M-x check-parens检查整个缓冲区的括号配对。这个命令会定位到第一处不匹配的括号位置,对排查init.el加载失败极有帮助。我的习惯是每次改完配置先check-parens再重启Emacs,能省掉大半启动报错的排查时间。Emacs这东西,配置养成"改一段验证一段"的习惯之后,很少会翻车;希望这套安装到验证的流程能帮到你。
本文还有配套的精品资源,点击获取