☰
Linux 下 Emacs 安装与配置:从终端编辑器到 Python 开发环境
2026/10/9 5:47:49 网站建设 项目流程

简介:这份PDF面向Linux平台上的软件工程师与系统开发人员,聚焦文本编辑器Emacs的入门认知与Redhat环境下的安装配置,适合需要快速上手这一经典工具、补齐Linux开发环境搭建技能的读者参考。资源包共1个文件,为143KB的PDF文档,内容源自期刊技术文章,结构清晰、篇幅精炼,便于随时查阅。文中先介绍Emacs的由来与两大分支GNU Emacs、X Emacs,说明它不仅是编辑器,更是一个集收发邮件、Telnet登录、日历查看、多语言编辑、GDB与EDebug调试、目录管理、浏览网站等功能于一体的集成环境,并列出其支持的C/C++、Perl、Python、Lisp等语言。随后以Redhat Enterprise 5为例,完整给出下载安装文件、解压、切换root、调用configure脚本、阅读配置输出、清除备份文件后重新配置、执行make等安装步骤,并提示常见错误排查思路。目前已有126人学习,可作为Linux系统开发与工具链配置的实用参考文献。

1. Linux 下文本编辑利器 Emacs:为什么老运维的服务器上总留着它

凌晨两点,你 SSH 连上一台跑了三年的生产机,要改一个 Nginx 配置里的 upstream 地址。机器上没装 VS Code,vim 你只会i、Esc、:wq三招,改到一半发现要同时对照另一份配置文件里的端口号。这时候如果机器上有 Emacs,Ctrl-x Ctrl-f打开第二个文件,Ctrl-x 2上下分屏,两个 buffer 并排看,改完Ctrl-x Ctrl-s保存,全程不用退出终端。这就是 Emacs 在 Linux 运维场景里最朴素的价值:一个能在纯字符终端里活得很好的文本编辑器,同时又能通过配置长成一个完整的开发环境。

这篇内容面向三类人:刚接触 Linux、想找一个比 nano 强、比 vim 门槛低的编辑器的新手;需要在多台服务器之间跳、希望配置能跟着自己走的运维;以及想用 Emacs 写 Python、但又不想被复杂配置劝退的开发者。我会把 Emacs 是什么、在 Linux 上怎么装、装完怎么配到能用、以及那些装完就翻车的地方讲清楚。热搜里常出现的「linux常用命令」「linux系统管理」「linux运维故障案例」这些词,本质上都指向同一个需求:你得先有一个趁手的编辑器,才谈得上管理配置、写脚本、排故障。

Emacs 不是 IDE,也不是单纯的编辑器,它是一个用 Lisp 解释器驱动的可编程环境。这个定位决定了它的学习曲线:前三天你会觉得快捷键反人类,一周后你会开始把常用操作绑成自己的键,一个月后你会发现自己写脚本时下意识想按Ctrl-x Ctrl-e。值不值得投入,取决于你是不是长期在 Linux 终端里干活。如果是,往下看。

2. Emacs 在 Linux 上的安装路径:包管理器、源码编译与终端版选择

2.1 先分清 emacs、emacs-nox 和 emacsclient

在动手装之前,得先搞清楚要装哪个包。Linux 发行版仓库里通常有三个相关包:emacs是带图形界面支持的完整版,依赖 GTK 或 Motif 库;emacs-nox是 no-X 版本,纯终端运行,不依赖任何图形库,服务器上首选;emacsclient是客户端,配合emacs --daemon使用,打开文件时复用已有进程,启动速度从秒级降到毫秒级。

选型逻辑很简单:如果你的机器有桌面环境,装emacs;如果是纯 SSH 的服务器,装emacs-nox;如果你经常开十几个文件,额外配一个 daemon 加 client 的组合。我一般会在服务器上装emacs-nox,本地开发机装完整版,两边共用同一份配置文件。

提示:不要在一台没有图形库的服务器上强行装emacs完整版,apt 会拉进来一堆 X11 依赖,浪费空间还可能因为缺少显示变量导致启动报错。

2.2 用包管理器安装:Debian/Ubuntu 与 RHEL/CentOS 两条命令

Debian 系和 RedHat 系的安装命令不同,但逻辑一致。先更新索引,再安装对应包。以下命令在 Ubuntu 22.04 和 CentOS 7 上验证过。

# Debian/Ubuntu 系:安装终端版 Emacs sudo apt update sudo apt install -y emacs-nox # 如果需要图形界面版(本地桌面机) sudo apt install -y emacs # RHEL/CentOS 系:安装终端版 sudo yum install -y epel-release # 先启用 EPEL 源 sudo yum install -y emacs-nox # 验证安装 emacs --version

apt install -y的-y表示自动确认,适合脚本化安装。epel-release是 CentOS 上很多额外软件包的前置源,不装它可能找不到emacs-nox。emacs --version会输出类似GNU Emacs 27.1的信息,看到版本号就说明装好了。如果提示command not found,检查$PATH里是否包含/usr/bin,或者用which emacs确认实际路径。

2.3 源码编译:需要特定版本或自定义编译选项时

发行版仓库里的 Emacs 版本往往偏旧,比如 CentOS 7 默认给的是 24.x。如果你需要 29.x 的新特性(比如原生 JSON 解析、tree-sitter 支持),就得自己编译。编译前先装依赖,不同发行版依赖名略有差异。

# 安装编译依赖(Debian/Ubuntu) sudo apt install -y build-essential libncurses-dev libgnutls28-dev \ libjpeg-dev libpng-dev libgif-dev libtiff-dev libxml2-dev # 下载源码(以 29.1 为例,实际请用官方最新稳定版) wget https://ftp.gnu.org/gnu/emacs/emacs-29.1.tar.xz tar -xf emacs-29.1.tar.xz cd emacs-29.1 # 配置:--without-x 表示不编译图形界面,--with-native-compilation 启用原生编译 ./configure --without-x --with-native-compilation --prefix=/usr/local # 编译并安装 make -j$(nproc) sudo make install

--without-x明确告诉编译系统不要链接 X11 库,适合服务器。--with-native-compilation会把 Lisp 代码编译成原生机器码,启动和运行更快,但需要libgccjit支持,如果 configure 阶段报错就把它去掉。-j$(nproc)用满所有 CPU 核心加速编译,nproc返回核心数。--prefix=/usr/local把 Emacs 装到/usr/local/bin,不会覆盖系统包管理器装的版本。

编译过程通常需要五到十五分钟,取决于机器性能。如果make中途报错,先看是不是缺了某个-dev包,错误信息里一般会写明缺少的头文件。装完后hash -r刷新一下 shell 的命令缓存,再执行emacs --version确认版本。

2.4 验证安装与首次启动的终端兼容性检查

装完别急着写配置,先确认 Emacs 在当前终端里能正常显示。有些终端模拟器对功能键和颜色支持不好,会导致 Emacs 界面错乱。

# 启动终端版 Emacs,-nw 表示 no window emacs -nw # 进入后按 Ctrl-x Ctrl-c 退出 # 如果显示乱码或按键无响应,检查 TERM 变量 echo $TERM

emacs -nw强制以终端模式启动,即使系统有图形界面也不弹窗。echo $TERM通常返回xterm-256color或screen。如果返回dumb或空,Emacs 会降级到最简显示模式,很多快捷键失效。解决办法是在~/.bashrc里设置export TERM=xterm-256color,然后source ~/.bashrc。这一步看着简单,但我在好几台容器里都遇到过TERM没设导致 Emacs 启动后一片黑白、菜单栏消失的情况。

3. 装完就能用:最小配置文件与 Python 开发环境搭建

3.1 配置文件放哪:.emacs、init.el 与 early-init.el 的区别

Emacs 启动时会按顺序读几个配置文件。老版本用~/.emacs,新版本推荐~/.emacs.d/init.el。从 27 开始还多了early-init.el,它在图形界面初始化之前执行,适合设置字体、禁用工具栏这类影响启动速度的选项。

我一般用~/.emacs.d/init.el,把所有配置集中在一个目录里,方便打包带走。目录结构如下:

~/.emacs.d/ ├── init.el # 主配置 ├── early-init.el # 早期配置(可选) └── lisp/ # 自己写的扩展

如果~/.emacs和~/.emacs.d/init.el同时存在,Emacs 会优先读~/.emacs,这会导致你改init.el没反应。检查一下ls -la ~/.emacs,如果存在就删掉或改名。

3.2 一份能直接抄的最小 init.el

下面这份配置我用了很久,覆盖了基本编辑体验、Python 语法高亮和缩进。把它写入~/.emacs.d/init.el,重启 Emacs 生效。

;; ~/.emacs.d/init.el ;; 关闭启动时的欢迎画面 (setq inhibit-startup-screen t) ;; 显示行号 (global-display-line-numbers-mode 1) ;; 关闭菜单栏、工具栏、滚动条,终端下更清爽 (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) ;; 设置字体(图形界面下生效,终端下忽略) (set-face-attribute 'default nil :height 120) ;; 括号自动配对 (electric-pair-mode 1) ;; 显示匹配的括号 (show-paren-mode 1) ;; 用空格代替 Tab,缩进宽度 4 (setq-default indent-tabs-mode nil) (setq-default tab-width 4) ;; Python 缩进设为 4 个空格 (setq python-indent-offset 4) ;; 保存时自动删除行尾空格 (add-hook 'before-save-hook 'delete-trailing-whitespace) ;; 启用 Python 模式的文件关联 (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))

inhibit-startup-screen关掉那个每次启动都出现的帮助页面。global-display-line-numbers-mode在左侧显示行号,排错时定位行很方便。electric-pair-mode输入左括号自动补右括号,写 Lisp 和 Python 都省事。indent-tabs-mode nil强制用空格缩进,避免 Python 里混用 Tab 和空格导致IndentationError。before-save-hook挂了一个删除行尾空格的函数,提交代码前不用手动清理。

3.3 用 package.el 装 Python 相关插件

Emacs 自带package.el,不用额外装包管理器。在init.el里加上源和要装的包,重启后执行M-x package-install-selected-packages即可。

;; 配置包源 (require 'package) (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/"))) (package-initialize) ;; 声明需要的包 (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (use-package elpy :ensure t :init (elpy-enable)) (use-package flycheck :ensure t :init (global-flycheck-mode t))

package-archives里加了 GNU ELPA 和 MELPA 两个源,前者是官方稳定源,后者包多但更新快。use-package是一个宏,把包的配置、加载、安装写在一起,比散落的require清晰。elpy提供 Python 的补全、跳转、虚拟环境切换;flycheck做实时语法检查。第一次执行package-refresh-contents会从网络拉包列表,国内网络可能慢,耐心等或者换源。

装完 elpy 后,打开一个.py文件,M-x elpy-config会检查 Python 解释器和依赖是否齐全。如果提示缺jedi、flake8这些,用pip install补上。

3.4 用 emacsclient 加速日常打开文件

每次emacs file.py都重新加载配置,慢的时候要等两三秒。用 daemon 模式可以把这个时间降到几乎为零。

# 启动 daemon(后台常驻) emacs --daemon # 用 client 打开文件,瞬间响应 emacsclient -t file.py # -t 表示终端模式 emacsclient -c file.py # -c 表示新建图形窗口 # 关闭某个 buffer 但不退出 daemon # 在 Emacs 里按 Ctrl-x k # 彻底关闭 daemon emacsclient -e "(kill-emacs)"

emacs --daemon启动后,所有后续emacsclient调用都复用这个进程。-t适合 SSH 场景,-c适合本地桌面。如果emacsclient报can't find socket,说明 daemon 没起来,先执行emacs --daemon。我习惯在~/.bashrc里加一行alias e='emacsclient -t',之后敲e file.py就能秒开。

4. 避坑与排查:Emacs 安装配置中最容易翻车的五个地方

4.1 启动报 “Symbol's value as variable is void”

现象:Emacs 启动时直接报错,提示某个变量未定义,然后进入*Messages*buffer 显示一堆堆栈。

原因:init.el里用了某个包提供的变量或函数,但那个包还没加载。比如在(require 'elpy)之前就写了(setq elpy-rpc-python-command "python3")。

解决:把依赖包的require或use-package声明放到使用它的配置之前。用use-package的:init和:config区分加载前和加载后的代码。如果已经启动失败,用emacs -q跳过配置文件启动,再逐段注释排查。

4.2 终端下颜色错乱、背景变黑或快捷键失效

现象:SSH 进去打开 Emacs,发现语法高亮颜色和本地不一样,或者Ctrl-x被终端截获。

原因:TERM变量设置不对,或者终端模拟器把某些组合键映射成了自己的快捷键。

解决:先export TERM=xterm-256color。如果某个快捷键被终端占用,在终端设置里把它禁用,或者用C-c前缀自定义一个替代键。比如Ctrl-x被 tmux 截获时,可以在 tmux 配置里改 prefix,或者用C-c代替。

4.3 package-refresh-contents 卡住或报连接超时

现象:执行M-x package-refresh-contents后进度条不动,最后报Failed to download melpa archive。

原因:MELPA 服务器在境外,网络不稳定;或者 Emacs 没走系统代理。

解决:换用国内镜像源,比如清华或中科大的 ELPA 镜像。在init.el里把package-archives改成镜像地址。如果公司网络需要代理,设置url-proxy-services变量。另一个办法是手动下载包文件放到~/.emacs.d/elpa/下,但依赖关系要自己处理,不推荐。

4.4 Python 补全不工作,elpy-config 报缺少依赖

现象:打开.py文件,补全菜单不弹出,M-x elpy-config显示Jedi或flake8未安装。

原因:elpy 依赖几个 Python 包,它们不在 Emacs 的包管理范围内,需要用 pip 单独装。

解决:在对应的 Python 环境里执行pip install jedi flake8 autopep8 yapf black。如果用了虚拟环境,确保elpy-rpc-python-command指向虚拟环境的 python 解释器,而不是系统默认的。我一般会在项目根目录放一个.dir-locals.el,为每个项目指定不同的解释器路径。

4.5 保存文件时提示 “File is read-only” 或权限不足

现象:用sudo启动过 Emacs 后,再用普通用户打开同一个文件,保存时报只读。

原因:sudo emacs会以 root 身份创建锁文件或临时文件,普通用户没有写权限。

解决:不要用sudo emacs直接编辑系统文件。正确做法是用sudo启动emacsclient连到已有 daemon,或者在 Emacs 里用M-x sudo-edit(需要装sudo-edit包)。如果已经产生了 root 所有的锁文件,找到.#filename这样的符号链接删掉,或者sudo chown $USER:$USER filename改回属主。

5. 进阶技巧:用 org-mode 管理配置与一键迁移

5.1 把 init.el 写成 org 文件,用 literate config 管理

配置写多了以后,init.el会变成几百行没有结构的 Lisp。一个我用了两年的办法是 literate config:把配置写进config.org,用 org-mode 的代码块组织,启动时自动 tangle 成init.el。

;; ~/.emacs.d/init.el 里只放这一句 (org-babel-load-file (expand-file-name "config.org" user-emacs-directory))

config.org里用#+BEGIN_SRC emacs-lisp :tangle yes包裹每段配置,加上说明文字。Emacs 启动时org-babel-load-file会先导出init.el再加载。好处是配置有了文档结构,能折叠、能搜索,迁移时只带走一个 org 文件。

5.2 用 .dir-locals.el 做项目级配置

不同项目对缩进、解释器、编码的要求不一样。在项目根目录放一个.dir-locals.el,Emacs 打开该项目下文件时自动应用。

;; 项目根目录的 .dir-locals.el ((python-mode . ((python-indent-offset . 2) (elpy-rpc-python-command . "/home/user/venv/bin/python") (flycheck-python-flake8-executable . "/home/user/venv/bin/flake8"))))

这段配置把该项目的 Python 缩进设为 2 个空格,elpy 和 flycheck 都指向虚拟环境里的可执行文件。注意.dir-locals.el里的变量如果被 Emacs 认为有风险,会弹出确认提示,按!永久接受即可。

5.3 验证配置是否生效的三个命令

改完配置别靠猜,用这几个命令确认。

命令作用预期输出
M-x eval-buffer重新加载当前 buffer 的 Lisp 代码无报错,mode line 显示变化
M-x describe-variable查看某个变量的当前值显示你设置的值而非默认值
M-x elpy-config检查 Python 环境所有依赖显示 OK

eval-buffer适合改完init.el后不重启就生效。describe-variable输入变量名比如python-indent-offset,确认是不是你设的 4。elpy-config会列出 Python 解释器路径、依赖包版本,缺什么一目了然。

5.4 迁移到新机器:打包 .emacs.d 的三个注意点

换机器时直接把~/.emacs.d拷过去,但有三件事要处理。第一,elpa/目录里的包有平台相关的编译文件,最好删掉让新机器重新装,只保留init.el和config.org。第二,如果配置里写了绝对路径(比如 Python 解释器位置),用expand-file-name和user-emacs-directory改成相对路径。第三,custom.el里存的是通过M-x customize界面改的变量,和手写配置可能冲突,迁移时检查一下有没有重复设置。

我自己的习惯是维护一个 Git 仓库,只跟踪init.el、config.org和lisp/目录,elpa/和eln-cache/写进.gitignore。新机器上git clone下来,启动 Emacs 自动装包,五分钟就能恢复工作环境。这个习惯帮我省过好几次重装系统的后悔药时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询