
1. 为什么 2024 年还有人学 Emacs一场反直觉的选择在 VS Code 强势到几乎成了编辑器代名词的今天花时间学 Emacs 这件事听起来确实有点反潮流。我 2016 年第一次打开 Emacs 的时候屏幕上是一片没有任何提示的纯文本界面连退出都不知道用哪个快捷键当时心里想的是这是什么老古董为什么还有人用它后来真正用起来、把配置和插件体系搭起来之后我才理解这个 1976 年就诞生、到现在还在持续演进的编辑器为什么值得投入。先说清楚一件事Emacs 和一般意义上的编辑器不太一样。很多人问编译器和编辑器的区别简单说编译器是把源代码翻译成机器码的程序编辑器是你写这些源代码的工具。但 Emacs 的特殊之处在于它本质上是一个 Lisp 解释器套了一个文本界面的壳——也就是说它不是一个功能固定的编辑工具而是一个可以往里塞任何功能的运行时环境。你在里面写邮件、管日程、记笔记、写 LaTeX 论文、跑终端、看 PDF全都不是插件模拟而是和编辑文本站在同一套架构之上。这句话听起来有点抽象我用一个类比解释一下。VS Code 像一家精装公寓拎包入住设施齐全开发商帮你决定了大部分布局。Emacs 像一块毛坯地和一套工具箱一开始你看到的只有墙和地板但砌墙、布线、装厨房、改格局全都能按照你的意愿来而且一旦改造完成这些结构就长在房子里不是外挂的临时设施。代价也很明显精装公寓住进去当天就能做饭毛坯房你得先花时间装修。所以谁适合学 Emacs我认为不是所有人。如果你只想要一个写代码的工具VS Code、JetBrains 系列或者 Vim 都足够好没必要折腾。但如果你有这些需求——希望用一个工具统一管理所有文字工作、对编辑器应该怎么工作有自己的一套想法、愿意投入时间换取之后几十年都不过时的底层能力——那 Emacs 的学习曲线就是值得攀的一座山。下面这些内容是我把这些年从入门到精通的完整路线、实际配置和我踩过的坑尽可能详细地写给你的一份参考。2. 从零开始的 Emacs 安装与第一轮配置别急着装插件2.1 各平台的安装方式与版本选择安装 Emacs 这件事本身不难难的是选对版本。Linux 下直接用发行版包管理器安装即可Ubuntu 上sudo apt install emacs就行但要注意Ubuntu 自带的版本偏老如果后续要装较新的插件尤其是 tree-sitter 相关的还是建议装 stable 版本或者用 snap 版。macOS 上我推荐brew install --cask emacs装的是图形界面的 Emacs比终端里跑的老版本体验好很多。Windows 上可以直接去 GNU 官网下载二进制安装包或者用 scoop 装emacs。这里有一个容易被忽略的点Emacs 有终端版和图形版的区别。终端版在 SSH 远程连接时非常有用但在字体渲染、快捷键支持比如某些 C-M- 组合键、图片显示上受限。图形版才是日常主力。我自己远程开发时用终端版本地一直用图形版一开始就分清这两者能省掉后面不少莫名其妙的为什么我的按键没反应的问题。2.2 第一次启动先认识 Buffer、Window、Frame 这三个概念安装完第一次启动你会看到菜单栏和一个欢迎界面。这时候别急着找设置按钮——Emacs 的哲学是一切皆 Buffer。文件打开后内容在 Buffer 里终端输出在 Buffer 里甚至帮助文档也在 Buffer 里。屏幕上的每个矩形区域叫 Window窗口多个 Window 可以同时展示不同 Buffer。最外层的应用窗口叫 Frame框架你可以理解成浏览器窗口。理解这三个层次非常关键因为后面你所有的操作都是在问我要让哪个 Buffer 在哪个 Window 里显示。比如C-x C-b可以列出所有 BufferC-x b加缓冲区名字可以直接切换C-x 2把当前 Frame 上下分成两个 WindowC-x 3左右分C-x 1只保留当前 Window——这些操作不是功能按钮而是你操控这个信息空间的日常手势就像手机上的返回键一样基础。2.3 第一份配置只有二十行先别抄完美配置新手最容易踩的坑就是上网抄一个大神的全套配置曾经我也这么干过结果启动报错、按键冲突、加载缓慢最后连是我的问题还是配置的问题都分辨不出来。我给新手的建议是第一份配置只做三件事——换一个看着舒服的主题、开启行号、设置默认字体。其他全部保持默认先把默认的 Emacs 用熟练。;; 第一份配置大约二十行 (setq inhibit-startup-screen t) ;; 关闭启动欢迎页 (setq initial-scratch-message nil) ;; 清空 scratch buffer 的提示文字 (menu-bar-mode -1) ;; 隐藏菜单栏多给文本一点空间 (tool-bar-mode -1) ;; 隐藏工具栏 (scroll-bar-mode -1) ;; 隐藏滚动条 (global-display-line-numbers-mode 1) ;; 全局显示行号 (setq display-line-numbers-width 4) ;; 行号宽度固定避免跳动 (setq default-font-height 140) ;; 字体大小单位是 1/10 磅 (set-face-attribute default nil :font Source Code Pro :height 140)这段配置写入用户目录下的init.elLinux/macOS 路径是~/.emacs.d/init.elWindows 一般是%APPDATA%\.emacs.d\init.el。之后每次启动 Emacs 都会加载它。我特意没写主题因为主题是纯粹的口味问题默认的M-x load-theme里就有好几种可以选比如modus-vivendi这个深色主题就很耐看。2.4 内建教程比任何视频都值得先看一遍启动后按C-h t按住 Ctrl 再按 h松开再按 t会打开一份内建的交互式教程。我见过太多人跳过这一步直接去看视频教程然后在操作时满头问号。这份教程会带你实际练习移动、删除、搜索、保存等基本操作而且每一段都有对应的练习区。虽然界面是英文的但语言非常平实配合词典完全能看懂。我建议你花一两个小时完整过一遍这比之后遇到问题再回查文档高效得多。提示C-h是 Emacs 的帮助前缀键几乎所有帮助功能都以它开头。遇到不知道的命令时C-h k加一个按键组合就会弹出这个按键的完整文档说明。这个习惯可以伴随你从入门到精通。3. 键盘操作的核心肌肉记忆移动、编辑、搜索三板斧3.1 移动把手从方向键上挪开Emacs 的移动快捷键设计思路和 Vim 不同Vim 把左手放在键盘中央hjklEmacs 是按住 Ctrl 或 Alt 加字母。刚开始非常不习惯但一段时间后你会意识到它的优势手不用移动位置所有操作都在主键盘区域完成。最基础的一组C-fforward右移一字符、C-bbackward左移一字符、C-nnext line移到下一行、C-pprevious line移到上一行。按M-f和M-b可以按词跳转M 是 Alt 键C-a跳到行首C-e跳到行尾M-跳到文件开头M-跳到文件结尾。我个人的体验是C-a、C-e、M-f、M-b这四兄弟是日常最高频的按键。写代码时经常要去行尾加分号、到行首改缩进这几个键用熟了之后你会发现自己不再频繁扫视鼠标位置注意力完全集中在代码逻辑上。这里给一个练习方法接下来的三天强制自己用 Emacs 写所有文本方向键一律禁用想移动就用组合键。三天之后肌肉记忆基本就形成了。3.2 编辑核心标记区域与 Kill/Yank 的剪贴板模型Emacs 的复制剪切粘贴和 Windows 的模型不太一样。Windows 是 CtrlC/CtrlV 直接对选中内容生效Emacs 是两段式先用C-SPCCtrl空格或C-在当前位置设一个标记mark然后移动光标到目标位置这段被标记覆盖的区域就叫 region区域。之后C-w剪切这块区域M-w复制它再移动到目标位置按C-yyank粘贴。这个模型初看比 Windows 麻烦但好处是你不需要提前用鼠标拖拽选中光标移动到哪里区域就自然定义到哪里。而且C-y之后按M-y可以循环取出剪贴板历史上的内容——相当于多重剪贴板这对经常要搬动多段代码的人来说非常实用。再补几个高频的编辑操作C-k剪切从光标到行尾的文本注意不是整行这和许多编辑器的 CtrlK 不同它只会删掉光标右侧的部分M-d删除一个词C-t交换光标前后的两个字符M-t交换两个词。以我写代码的经验C-k用得极其频繁配合C-y就可以把一行内容从一处搬到另一处操作行云流水。撤销操作按C-/也就是 CtrlShift连字符或者C-x u。注意 Emacs 把撤销视为撤回到上一个操作状态所以连续按C-/会一步步回退撤销过头了想重做可以再操作一下无关动作比如移动一下光标然后继续C-/它会往将来方向前进。这个细节刚上手时容易懵多试几次就懂了。3.3 搜索增量搜索是改变习惯的功能按C-s进入增量搜索isearch这是 Emacs 最让我上瘾的功能之一。所谓增量搜索就是你每输入一个字符光标就会立刻跳到第一处匹配的位置再按C-s跳到下一处。搜索过程中如果发现目标在附近直接用方向键微调或者按回车确认即可。C-r是反向搜索比如在日志文件里从下往上找最近的报错效率极高。搜到目标后想同时编辑多处时进阶用法是搜索后按M-%AltShift5进入替换模式输入替换文本后回车每个匹配处都可以选择 y替换、n跳过、!全部替换。这个操作在批量改变量名、统一代码风格时能省大量时间。不过在大项目里我建议还是用 LSP 提供的重命名功能那是基于语法分析的不会误伤注释和字符串里的相同文本。我观察到一个规律很多新手抱怨 Emacs记不住快捷键其实是没掌握记忆的单元。不要死记 20 个孤立的按键组合而是记一条命令的完整动作链。比如保存文件不是一个 CtrlS而是C-x C-s——前缀C-x表示文件级操作然后s表示 save。这样即便忘了按C-x后等半秒菜单提示会自动弹出来告诉你有哪些选择。把快捷键当成命令的约定而不是需要记忆的密码学习效率会高很多。4. 包管理从 package.el 到 use-package我的配置演进史4.1 先解决源的问题MELPA 与国内镜像配置Emacs 自带的包管理框架叫 package.el从 24 版本起内置。首次配置你需要先加一个第三方包仓库最常用的就是 MELPAMilkypostmans ELPA里面有成百上千个包几乎所有你能叫上名字的 Emacs 插件都在这里。(require package) (setq package-archives ((gnu . https://elpa.gnu.org/packages/) (melpa . https://melpa.org/packages/))) (package-initialize)如果你是国内网络环境直接连 MELPA 经常会卡在刷新包列表这一步。我当时的解决办法是切换到清华 TUNA 镜像、中科大镜像或者其他可用的 ELPA 镜像源。具体镜像地址在配置里替换一下就行。这是纯网络源的更换跟其它编辑器换 registry 的道理一样不涉及任何额外工具。配置完源之后执行M-x package-refresh-contents刷新包列表再用M-x package-install输入包名就能安装。安装完的包在~/.emacs.d/elpa/目录下下次启动自动加载。4.2 use-package把装了什么、怎么配、有什么依赖写在一处裸用 package.el 的问题是插件一多每个插件的安装、配置、按键绑定分散在 init.el 的各个角落慢慢就变成一团乱麻。我配置到二十多个包的时候每次改一个插件的行为都要在好几百行的配置里翻找实在痛苦。后来我换成了 use-package 声明式配置框架才彻底解决这个问题。use-package 的思想是每个插件用一段独立的声明块声明它需要什么依赖、什么时候加载、需要做什么配置、绑定什么快捷键。下面这段是真实使用示例;; 启用 use-package 自动安装缺失的包 (require use-package) (setq use-package-always-ensure t) (use-package company :defer 2 ;; 启动后延迟 2 秒加载不拖慢启动 :hook (prog-mode . company-mode) :bind ((M-/ . company-complete)) :config (setq company-minimum-prefix-length 1) (setq company-idle-delay 0.1))这里每一段都自成一体:defer控制延迟加载:hook声明什么模式开启 company:bind自定义快捷键:config放具体参数。你看到的是一个包完整的行为说明书而不是分散在各处的碎片。对于强迫症来说这种结构本身就是一种心理安慰。4.3 启动时间与加载策略别把每个包都变成启动负担随着包越来越多一个无法回避的问题是启动时间。我见过有人配置了上百个包每次启动要转十几秒的圈体验非常差。use-package 的:defer机制就是为这个问题设计的很多包不需要在启动时就加载可以等用户第一次用到相关功能时再加载。比如 company补全可以在打开代码文件后加载flycheck语法检查可以在进入 prog-mode 后再加载theme 则可以等load-theme触发。我个人的配置原则是启动时只加载必须的东西UI 增强、按键绑定、基础变量所有重量级功能全部延迟加载。这样配置一百多个包启动时间仍然稳定在一秒级别。判断一个包必须启动加载还是可以延迟其实就一个问题如果它不加载我打开编辑器第一眼会不会觉得少了什么会就启动加载不会就延迟。4.4 从 MELPA 到 straight.el什么时候需要换工具package.el use-package 的组合已经能覆盖绝大多数人。但如果你有更苛刻的需求——比如每个包都要锁版本、要能回退到某个 commit、要像 git 一样管理依赖——可以考虑 straight.el。它直接从 git 仓库克隆每个包用 git 记录版本配置复杂度和灵活性都上升一个级别。我的建议是新手不要碰 straight.el。版本锁定这个问题在你刚入门时根本不构成瓶颈等你的配置规模大到需要精细控制版本时你自然会有足够经验迁移。过早引入复杂的工具链只会让你把时间花在和工具搏斗而不是用在 Emacs 本身的习惯上。我自己是用了将近两年 package.el 后才迁移过去的而且迁移过程大概花了一个下午。5. 把 Emacs 变成 Python 开发环境一场真实配置实践5.1 LSP 与语法分析Emacs 也能有智能补全很多人对 Emacs 写代码的刻板印象是补全弱、跳转弱、格式化弱。这个印象放在十年前是对的但 LSPLanguage Server Protocol普及之后情况完全变了。LSP 的核心思路是编辑器不负责理解代码它只是连接一个语言服务器比如 Python 的 pyright、ruff由服务器做语法分析、补全、跳转、重命名编辑器负责展示。Emacs 里有两套主流 LSP 客户端一个是 lsp-mode一个是 eglot内置到 Emacs 29。我推荐新手直接用 eglot理由很实际它是内置的不需要额外安装配置量极小而且遵循少即是多的原则。lsp-mode 功能全面但选项多到让人头皮发麻。对于 Python 开发我现在的配置块是这样的(use-package eglot :ensure nil ;; Emacs 29 内置不需要从仓库装 :hook ((python-mode . eglot-ensure) (python-ts-mode . eglot-ensure)) :config (setq eglot-autoshutdown t) ;; 退出缓冲区时自动关闭语言服务器 (add-to-list eglot-server-programs (python-ts-mode . (pyright-langserver --stdio))))注意我同时挂了python-mode和python-ts-mode。Emacs 29 引入了基于 tree-sitter 的语法解析模式-ts-mode它比传统的正则表达式解析更准确在代码缩进、高亮、结构化导航上都有质的提升。pyright 是 Python 语言服务器里目前我觉得最稳的补全准确度、类型推断能力都很强。配置好后打开一个 .py 文件底部状态栏出现eglot字样说明语言服务器已经在后台运行了。5.2 补全、检查与格式化三件套的选型对比有了 LSP 之后补全党不再是问题但 Emacs 侧仍需要一个前端把补全菜单显示出来。community 标准是 company-mode老牌或 corfu新秀。我个人的体验是 corfu 更轻量、界面和现代编辑器更接近。如果你用 eglotcorfu 配合起来非常顺滑。(use-package corfu :ensure t :custom (corfu-cycle t) (corfu-auto t) (corfu-auto-delay 0.1) (corfu-auto-prefix 1) :init (global-corfu-mode 1))语法检查我用 flymakeEmacs 内置 pyright 上报的诊断信息。代码格式化用python-mode内置的C-c C-rregion 内格式化需要安装 ruff 或 black或者用M-x python-black-buffer一键格式化整个文件。这一套下来写代码—看到错误提示—跳转到错误行—改完—一键格式化的闭环是完全顺畅的。这里要特别说明一个容易混淆的点编辑器本身不会检查你的代码语法错误只有编译器/解释器/语言服务器才会。所以编辑器和编译器的区别就是编辑器给你一个舒适的书写环境编译器负责把错误揪出来。Emacs 配合 pyright 做的就是后者的事但它不是编译你的 Python 代码而是通过 LSP 让 pyright 在后台实时分析。5.3 虚拟环境必须搞定的一个坑Python 开发中最容易踩的坑是虚拟环境virtualenv / venv识别。因为每个项目依赖不同如果你不激活该项目的 venv 就启动 pyright它可能报一堆导入错误。eglot 本身不关心 venv但 pyright 会自动寻找项目目录下的.venv或venv目录所以规范做法是在项目目录下创建venv并在 Emacs 里用M-x eglot-reconnect让语言服务器重新加载环境信息。另一套做法是用 direnv 或 pyenv-virtualenv 管理环境Emacs 侧装envrc插件在打开项目文件时自动加载环境变量。这样 pyright 启动时就能读到正确的VIRTUAL_ENV。我建议每个项目固定使用.venv作为虚拟环境目录名这是让各种工具自动识别的最省心做法。5.4 项目管理与测试进阶配置思路当代码达到一定规模项目这个概念开始变得重要。你用C-x C-f打开的每个文件都是孤立的但实际开发时的操作往往是在这个项目里跳转到函数定义在整个项目里搜索某个字符串跑这个项目的测试。我用 projectile 解决前两个需求用M-x compile绑定到 pytest 解决第三个。(use-package projectile :ensure t :bind-keymap (C-c p . projectile-command-map) :config (projectile-mode 1))配置后C-c p f可以在当前项目内查找文件C-c p s全项目搜索C-c p p切换最近项目。测试方面我习惯用M-x compile然后输入pytest -qEmacs 会把 pytest 的输出变成可交互的编译错误列表按C-x反引号跳转到失败测试的对应代码行——这比在两个终端窗口之间来回切换效率高太多了。6. Org-mode 的降维打击笔记、任务与写作的一体化6.1 Org-mode 到底是什么不只是带格式的文本如果说 Emacs 有一项功能能在编辑器这个词之外独树一帜那就是 Org-mode。一个.org文件看起来像是带星号和缩进的纯文本但这层简单的语法下面是强大的结构化系统标题层级、TODO 状态、优先级、时间戳、表格、代码块甚至可以用来写论文、做演示文稿org-reveal、维护博客ox-hugo。Org-mode 的核心语法简单到三个符号就能入门*表示一级标题**表示二级标题以此类推普通列表用-待办事项在标题前加TODO字样。看一个例子* 第一章 为什么要学 Emacs ** TODO 补充 Org-mode 的表格示例 ** DONE 完成安装教程 CLOSED: [2024-11-02 周六 14:30] - [ ] 写一篇文章介绍 agenda - [X] 整理 LSP 配置你不需要任何额外插件Emacs 内置 Org-mode。按TAB可以折叠/展开标题下面的内容C-c C-t循环切换 TODO 状态TODO → DONEC-c C-s设置计划时间C-c C-d设置截止时间。所有这些数据都存在同一个纯文本文件里不依赖任何数据库或云服务复制到任何一台装了 Emacs 的机器上就能继续用。6.2 把日程管理交给 Org-agenda不再需要单独的日历 AppOrg-mode 最让我依赖的能力是 agenda日程表。你可以在任意 org 文件里用C-c C-s给一条任务设置计划日期用C-c C-d设置截止时间。然后按C-c a打开 agenda 视图它会汇总所有 org 文件里未来七天的待办事项和截止任务生成一个像日历一样的清单。我实践下来的工作流是电脑里的~/org/目录下放三个文件——inbox.org随手捕捉的想法和临时任务、projects.org按项目划分的长期任务、notes.org知识笔记。每天早晚各打开一次 agenda看今天该做什么做完一项就在对应标题上按C-c C-t标记为 DONE。这套流程我用了三年最大的感受是任务状态可视化给人带来的确定性——你永远知道接下来要做什么而不是凭脑子记。6.3 导出与写作从笔记到 HTML、PDF、MarkdownOrg-mode 的导出功能也值得一提。按C-c C-e会弹出一个导出菜单可以导出为 HTML、PDF、Markdown、纯文本等格式。对我这种经常需要写文档、发博客的人来说org 文件里写内容一次生成 HTML 和 Markdown 两种版本不用维护两份内容省下的维护成本非常可观。如果你写学术论文Org-mode 配合 AUCTeX 可以用接近 LaTeX 的质量导出 PDF。公式直接用$...$或$$...$$写在 org 里导出时自动交给 LaTeX 渲染。网上经常有人搜论文公式编辑器其实 Emacs 里C-c C-x C-e预览 LaTeX 公式、C-c C-e l p导出 PDF一套都是现成的。虽然学习成本比专门的公式编辑器高但公式、图表、参考文献全在一个纯文本文件里统一管理长期项目的可维护性完胜。6.4 Org-babel让文档里的代码可以运行Org-mode 还有一个杀手级能力叫 Org-babel你可以在 org 文件的代码块里执行代码并且把执行结果直接嵌回文档。比如这样一段#BEGIN_SRC python :results output def greet(name): return fhello, {name} print(greet(emacs)) #END_SRC光标在代码块内按C-c C-cEmacs 会调用 Python 解释器执行这段代码运行结果自动插入代码块下方。这意味着你可以在一个 org 文件里同时维护说明文字和可执行代码写完文档顺便就把代码验证了。这就是所谓的文学编程literate programming对我来说用这一个文件写教程笔记、调试工具脚本、记录数据分析过程体验远远好于一个 md 文件加一堆截图。7. 从入门到精通的路线图学习顺序与避坑清单7.1 三个月分阶段目标给没有耐心的你一个路线我见过太多人学 Emacs 半途而废最大原因不是 Emacs 难而是没有阶段目标一上来就想我要彻底搞懂 Emacs结果被各种细节淹没。我建议把学习拆成三个阶段。第一个月目标只有一个——能不看帮助文档完成日常编辑。包括移动、删除、搜索、保存、打开文件、切换 buffer。不要装任何插件主题除外。每天用 Emacs 写至少 30 分钟的文本强制不用其他编辑器。这个阶段最难熬但也是打基础最关键的时期。第二个月开始配置。装 use-package、company/corfu 补全、eglot 配好一门你熟悉的语言。学会用M-x describe-function和C-h k自查文档。此时你会感受到定制编辑器的快乐也有了向别人安利 Emacs 的底气。第三个月及以后探索一个纵深领域。是 Org-mode 还是编程环境是 org-roam 做知识管理还是 magit 操作 git选一个深入把它用出生产力。这阶段的目标不是什么都装而是一个核心场景做到极致。我认识很多 Emacs 老用户每个都有一套自己极其顺手但风格迥异的配置这就是 Emacs 的趣味所在——你的配置最终会变成你思维的镜像。7.2 最常见的五个坑与新手的应对办法配置文件的债务陷阱今天抄一段这里、明天抄一段那里半年后配置文件变成一团无人能懂的意大利面。应对办法每加一段配置在旁边注释说明它解决什么问题半年后你可以像读日记一样重读自己的配置文件。按键冲突不自知装了新包某个快捷键被覆盖了你意识到咦这个键怎么不灵了。用C-h k可以查看当前按键实际绑定了什么命令这是排查冲突的第一工具。把 Emacs 当 IDE 用却期望它是 VS CodeEmacs 的 UI 不是像素级的某些调试器集成、远程开发体验确实不如商业 IDE。承认它的边界该用 IDE 的场景比如重度前端调试就切过去没有人规定你必须只用一把锤子。过度追求启动速度启动慢了就焦虑装了一堆 benchmark 插件最后发现省出来的 0.5 秒远不如花在学习快捷键上。启动时间控制在 2 秒内就是完全可以接受的水平。忽略内置帮助系统Emacs 的文档好得出奇C-h C-h列出所有帮助入口M-x info打开完整的 GNU 手册。遇到问题先查文档比去论坛发帖求助效率高。7.3 是否要学 Evil Mode一个必须回答的问题很多人因为 Vim 的键位习惯而犹豫要不要用 Emacs于是出现了 Evil Mode在 Emacs 里模拟 Vim 键位这个折中方案。我的建议是如果你从没用过 Vim不要装 Evil Mode直接用 Emacs 原生键位。理由很简单原生键位是 Emacs 文档、教程、社区讨论的默认语言学 Evil 相当于同时学两套系统复杂度翻倍。如果你已经是 Vim 老手装 Evil 确实能减少切换成本我身边不少 Vim 用户就是这么在 Emacs 里落地的。这不是站队问题而是路径最短原则——你现在的时间花在哪里最值得。7.4 Markdown 与 Org-mode 的协同不必二选一网上经常有人搜markdown编辑器有哪些md文件编辑器说明很多人最终会选择 Markdown 作为写作格式。我的实际做法是写作主力放在 Org-mode导出时可以是 Markdown如果是托管型平台需要直接编辑 md 文件Emacs 里也有 markdown-mode语法高亮、导出、预览一应俱全。不需要二选一一个编辑器能同时处理两种格式本身就是它的优势。如果你写技术文档经常要用表格Markdown 对复杂表格支持比较弱Org-mode 的表格按C-c C-|可以直接对齐列宽写起来顺手得多需要把内容放到 GitHub 上时再导出成 md 也不迟。把 Org 当作内容的母版Markdown 当作交付格式是我这几年最顺畅的文档工作流。最后分享一个我自己的体会学 Emacs 最反直觉的地方在于它表面上是一个工具问题实际上是一个长期主义问题。你今天花一小时记快捷键明天可能只节省五分钟看起来不划算。但按一年 250 个工作日、每天几小时在编辑器里度过来计算这些基础投资的回报周期其实短得惊人。我更愿意把它理解成一位老朋友中年以后配置稳定、习惯成熟、版本升级也不会让你从头再来——这种确定性在工具迭代飞快的今天是相当难得的体验。如果你也被这套哲学吸引别犹豫安装一个 Emacs从C-h t开始三个月后再回头看看今天的自己。