我的 Emacs 配置,初始版本从 Crossemacs 复制。参阅 purcell Emacs 以及其他人的 Emacs 配置 ,详情请看参考文献小节。
主要需求是使用 Org-mode,Python,C/C++ 开发环境。
特别提醒,本 Emacs 配置仅在如下环境进行过测试:
OS: Darwin … Darwin Kernel Version 17.4.0 / Emacs: GNU Emacs 25.3.1
本作品采用知识共享署名 4.0 国际许可协议。
- init.el - 位于 .emacs.d 目录下的 Emacs 配置文件入口,在这里加载 lisp 目录下的配置子模块。
- init-utils.el - 一些用于配置文件的工具函数定义。
- init-elpa.el - 配置 ELPA 仓库。
- init-common.el - 通用配置。例如 Speedbar, Projectile, Yasnippet 等。
- init-git.el - 使用 Magit 作为 Git Emacs 前端。
- init-company.el - 使用 Company 做通用补全,对于不同的语言,可以配置不同的补全后端。
- init-flycheck.el - 配置 Flycheck 作为代码飞行检查。
- init-ivy-swiper.el - 使用 Swiper 替代 isearch。
- init-helm.el - 使用 Helm 作为增量补全和缩减选择的工具,并使用 Helm Projectile 管理项目。
- init-helm-gtags.el - 使用 helm-gtags 配置标签索引。
- init-org.el - 配置 Org 模块。
- init-cpp.el - c/c++ 语言相关配置
- init-cedet.el - CEDET 工具配置,包括 Semantic, Senator 等。
- init-python.el - 配置 Python 开发环境,使用 Elpa 并使用 Conda 管理虚拟环境 。
- init-ein.el - 配置 EIN (Emacs IPython Notebook) 作为 Jupter Notebook Emacs 客户端。
- init-lsp-java.el - 使用 slt-java 构建 Java IDE环境。
- init-solidity.el - 支持 Solidity 语言开发。
- init-theme - 配置使用 gruvbox 主题,配置其他主题相关,如字体,highligh-parentheses, popwin, frame size 等。
- init-dashboard.el - Dashboard 相关配置。
- init-keyset.el - 配置通用快捷键。
使用 Homebrew 安装 Emacs:
$ brew cask install emacs
运行如下命令从 Github Clone junahan-emacs.git 项目:
# Clone 项目
git clone https://github.com/junahan/junahan-emacs.git
通过运行项目目录中的脚本 test-startup.sh 运行测试,测试使用项目目录作为 HOME 目录运行测试脚本。
# Emacs debug-init 模式运行测试
./test-startup.sh
- 开始之前,备份
~/.emacs.d
目录以确保能够回去以前的配置。 - 运行
./deploy.sh
脚本 - 该脚本使用stow
在HOME
目录创建.emacs.d
链接。
本节简单介绍一些常用的 Emacs Mode,也是 junahan-emacs 项目使用到的 Emacs 模块。通过这些介绍,可以了解到这些模块的功能、配置和使用。
在快速启动一章已经介绍了如何使用 junahan-emacs
项目安装所需要的环境,本章所需要的常用模块包都已经准备就绪。如果需要尝试安装不同的包,可以使用 Emacs 安装包管理工具直接安装:
# 安装 Emacs 包的便捷方式
M-x package-install RET helm-company RET
Company 是一个文本补全框架,该命名意思是“完成任何事情”,文本补全框架通过可插拔前后端获取和显示补全候选列表。可选的后端包括 Elisp, Clang, Ispell, CMake, Yasnippet, etags, gtags, files, keywrods, semantics 等等。通过配置 company-backends 变量支持后端列表。
- company-capf: CAPF 后端,提供一个桥接至标准
completion-at-point-functions
设施(在输入点的上下文显示补全候选列表),方便所有主模式定义 CAPF 补全。 - company-keywrods: 当前文件所属模式语法关键词。
- company-files: 补全文件路径。
- company-ispell: 英文输入提示。
- company-ycmd: 使用 YCMD 的 c/c++ 代码补全后端。
- company-semantic: 使用 Semantic 上下文索引数据库进行补全。
- company-yasnippet: 使用 Yasnippet 模版补全。
- company-gtags: 使用 GNU Global 源代码静态索引数据库补全。
- company-etags: 使用 Etags 索引数据库补全。
- elpy-company-backend: Python 代码补全后端。
- company-dabbrev: 将当前打开的所有 buffer 中的关键字作为补全显示(默认不使用 scratch buffer)。
如果在补全过程中取消了补全, 也可以使用命令再次开启补全。例如 company-files 补全方式就可以使用 company-files 函数开启。
通过如下配置激活该 Ccompany Global Mode:
;; Enable global-company-mode.
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
Company Global Mode 默认后端配置大多数情况下工作良好,并能够根据和其他模块配合为不同的开发环境加载合适的后端模块。少数情况下,你需要修改 company-backends
变量。
下面的代码将 company-c-headers
后端加入 company-backends
列表
;; add company-c-header to company-backends
(require 'company-c-headers)
(after-load 'company
(add-hook 'c-mode-common-hook
(add-to-list ('company-backends 'company-c-headers))))
以上代码修改全局 company-backends
,也就是说该配置一旦加载,对其他环境(如 Python 开发环境)也有效。你可以通过创建一个缓冲区局部变量修改该行为。
;; function to push company backend to local variable - company-backends.
(defun sanityinc/local-push-company-backend (backend)
"Add BACKEND to a buffer-local version of 'company-backends'."
(make-local-variable 'company-backends)
(push backend company-backends))
;; add company-c-header to company-backends
(require 'company-c-headers)
(after-load 'company
(add-hook 'c-mode-common-hook
(lambda () (sanityinc/local-push-company-backend 'company-c-headers))))
为了确认当前缓冲区 =company-backends= 内容,可以运行 =C-h v= 命令查看该变量的值。
Flycheck 是一个飞行句法检查和提示工具,它使用多种语法检查和提示工具在你输入的时候自动检查缓冲区内容,并在缓冲区直接提示和报告警告和错误。Flycheck 支持超过 40 多种不同编程语言和 80 多种语法检查工具,并有许多第三方扩展可供选择。
;; enable global flycheck mode
(use-package flycheck
:ensure t
:init (global-flycheck-mode)
:config
(setq flycheck-display-errors-function #'flycheck-display-error-messages-unless-error-list))
Helm 是一个增量补全和缩减选择的 Emacs 框架。它为开发人员提供非常容易使用的 API 以开发基于 Helm 的 Emacs 应用,同时提供了强大的搜索工具以及许多内建支持几乎所有常用的补全命令。
Ag - 是一个类似于 ack
的代码搜索工具,其专注于速度。 Helm-ag
等模块需要 ag
工具。
brew install the_silver_searcher
可以通过运行 M-x list-packages
命令选择并安装 *Helm*
包,或者打开 .emacs.d/Cask
文件,添加 (depends-on "helm")
,然后运行 cask install
命令安装 *Helm*
。完成安装后,最简单的配置如下,即可启动 *Helm*
:
(require 'helm-config)
(helm-mode 1)
更完整的配置,请参阅读 Helm 完整配置。
通过适当的配置, Helm
会接管你大部分日常使用的 Emacs
操作界面,你可以借助其强大的增量式补全,逐步缩减候选列表范围直到找到你需要的项为止,例如,它可以接管 M-x
界面,允许你以 Helm
的方式选择要运行的命令,这通常会提升你的效率。它还有非常好用的正则表达式匹配和搜索界面。
Key 绑定 | 命令 | 说明 |
---|---|---|
M-x | helm-M-x | 命令列表 |
M-y | helm-show-kill-ring | 显示剪切环内容 |
C-x b | helm-mini | 显示打开的缓冲区和最近打开的文件 |
C-x C-f | helm-find-files | Find-file 的 Helm 版本 |
C-s | helm-ff-run-grep | 正则表达式版本的 helm-find-files |
C-c h i | helm-semantic-or-imenu | Semantic/imenu 的 Helm 界面 |
C-c h m | helm-man-woman | 跳转到任意 man 文档入口 |
C-c h / | helm-find | Find 的 Helm 界面 |
C-c h l | helm-locate | Locate 的 Helm 界面 |
C-c h o | helm-occur | Occure 的 Helm 界面 |
C-c h a | helm-apropos | 命令、函数、变量描述 |
C-c h h g | helm-info-gnus | |
C-c h h i | helm-info-at-point | |
C-c h h r | helm-info-emacs | |
C-c h <tab> | helm-lisp-completion-at-point | 提供一个可用函数列表 |
C-c h b | helm-resume | 恢复前面一个 helm 会话 |
C-h SPC | helm-all-mark-rings | 查看本地和全局标记环内容 |
C-c h r | helm-regrex | 可视化正则表达式匹配 |
C-c h x | helm-register | 显示 Emacs 注册表内容 |
C-c h t | helm-top | Top 系统命令的 Helm 界面 |
C-c h s | helm-surfraw | 很多 Web 搜索引擎的命令行界面 |
C-c h g | helm-google-suggest | 在 Helm 缓冲区内支持交互式输入搜索项和从 Google 获取结果 |
C-c h c | helm-color | 列出所有可用的 Faces |
C-c h M- : | helm-eval-expression-with-eldoc | 在 Helm 缓冲区获取 Emacs lisp 表达式实时结果 |
C-c h C- , | helm-calcul-expression | Helm 计算器界面 |
C-c C-l | helm-eshell-history | Eshell 历史界面 |
C-c C-l | helm-comit-input-ring | Shell 历史界面 |
C-c C-l | helm-mini-buffer-history | Mini-buffer 历史界面 |
Helm-projectile
是一个 Projectile
的 Helm
界面扩展,支持大多数 Projectile
命令甚者更多特性支持。详情,请参阅使用 Helm + Projectile 管理项目。
- A Package in a league of its own: Helm - 一个非常棒的 Helm 使用介绍
- Exploring large projects with Projectile and Helm Projectile - 详细的有关 Helm + Projectile 的使用 Demo
Magit 是优秀的 Emacs Git 前端,实现大多数 Git 命令,足够处理常用的版本管理任务,可以让你不离开 Emacs 使用 Git。
可以通过 MELPA 或者 cask 安装 Magit 包,通过如下代码配置和激活 magit
:
(use-package magit
:bind
(("C-x g" . magit-status)
("C-x M-g" . magit-dispatch-popup)))
以上配置绑定 =C-x g= 快捷键至 =magit-status= 命令,这个命令是使用最为频繁的命令,基本日常的 Git 操作均可以通过该命令界面完成。
运行 C-x g
打开 mgit-status
界面,该界面显示如下图。
有关 Mgit 使用的更多介绍,请参阅 Emacs 下的 git 工具 magit 简介。
Projectile
是一个 Emacs
项目管理库,其目标是为项目级别上的操作提供一组易用的特性。 Helm-projectile
是一个 Projectile
的 Helm
界面扩展,支持大多数 Projectile
命令甚者更多特性支持。
- 同时选择和打开多个文件
- 任意位置位置打开文件
- 任意位置标记和复制多个文件
- 任意位置标记和删除文件
- 任意切换当前和其他同名文件
可以通过 MELPA 安装 Projectile
并使用如下代码配置和激活 helm-projectile
:
(use-package helm-projectile
:init
(helm-projectile-on)
:config
(setq projectile-completion-system 'helm))
所有 Projectile
命令均以 C-c p
为前缀。以下是有关快捷键绑定的总结。
快捷键 | 命令 | 说明 |
---|---|---|
C-c p h | helm-projectile | Helm projectile 界面 |
C-c p p | helm-projectile-switch-project | 切换至另外的项目 |
C-c p f | helm-projectile-find-file | 列出当前项目所有文件 |
C-c p F | helm-projectile-find-file-in-known-projects | 在所有已知项目中查找文件 |
C-c p g | helm-projectile-find-file-dwim | 基于上下文查找文件 |
C-c p d | helm-projectile-find-dir | 列出当前项目所有目录 |
C-c p e | helm-projectile-recentf | 列出当前项目最近打开的文件 |
C-c p a | helm-projectile-find-other-file | 在具有文件名但不同扩展名之间的文件切换 |
C-c p i | projectile-invalidate-cache | 作废缓存 |
C-c p z | projectile-cache-current-file | 添加当前选中缓冲区文件至缓存 |
C-c p b | helm-projectile-swith-to-buffer | 列出所有当前项目中打开的缓冲区 |
C-c p s g | helm-projectile-grep | 从项目根目录开始搜索符号 |
C-c p s a | helm-projectile-ack | 同上,但使用 ack |
C-c p s s | helm-projectile-ag | 同上,但使用 ag |
- Exploring large projects with Projectile and Helm Projectile - 详细的有关 Helm + Projectile 的使用 Demo
ORG 是一个快速高效的存文本系统,可用于记日记、维护待办事项列表、计划项目以及撰写和发布文档。ORG 可以说是 Emacs 相当重要的组成部分。本文就是用 Emacs ORG 模块撰写。我也将 ORG 模块用于安排日程和跟踪 OKR。
ORG 是一个快速高效的存文本系统,可用于记日记、维护待办事项列表、计划项目以及撰写和发布文档。ORG 可以说是 Emacs 相当重要的组成部分。本文就是用 Emacs ORG 模块撰写。我也将 ORG 模块用于安排日程和跟踪 OKR。
- 写作 (Editing)
- ORG 支持大纲结构,可以快速容易的在不同标题之间导航
- 支持折叠标题内容
- 内置便捷的快捷键绑定和很多高效编辑设施。
- 计划 (Planning)
- 可以用于管理待办事项 (TODO) 列表和计划
- 每个标题可以被当作一个任务
- 可配置待办事项关键字及通过
C-c C-t
或者S-<left/right>
快捷键切换关键字 - 支持计划元数据,如:排期 (scheduled)、截止日期 (deadline)、标签、属性等。
- 计时 (Clocking)
- 启动任务计时
C-c C-x C-i
- 结束任务计时
C-c C-x C-o
- 计时日志记录在抽屉里 (drawer)
- 支持可定制的格式报告
- 启动任务计时
- 日程表 (Agendas)
- ORG 模块帮助您聚焦于任务,可以轻松管理很大的
.org
文件和数千任务 - 内置日程表视图按周显示任务排期计划和截止日期、待办事项列表以及停滞的项目
- 日程表视图支持根据需要进行定制:支持按天/按周/按月;支持以标签和待办事项列表关键字定制
- 日程表是 ORG 的关键模块
- ORG 模块帮助您聚焦于任务,可以轻松管理很大的
- 捕获 (Capturing)
- 将一个代办事项添加到
.org
文件的过程称之为 capturing - 您可以从任意地方 capture,既可以在 Emacs 中,也可以通过其他应用程序(如浏览器、PDF 阅读器等)
- Capture 模版允许您定义想 capture 的上下文信息
- 将一个代办事项添加到
- 列表 (Tables)
- ORG 是一个优秀的纯文本表格编辑器
- 可以通过
.csv
和.tsv
文件,或者直接从当前缓冲区导入列表 - 支持到处多种格式
- ORG 也可以被用作一个电子表格 (spreadsheet) 系统
- 您可以使用 Calc Emacs 包或者 Emacs lisp 代码为表格添加计算公式
- 发布 (Exporting)
- ORG 是一个出版发布工具
- 可以使用直观的标记将 ORG 文档转换为 HTML, LaTeX, ODT 等格式文档
- 开发者可以很容易的创建新的后端以支持特定格式
- 您可以为一个或者多个
.org
文件定义发布项目,并可以定义一个或者多个发布后端
- 嵌入代码 (Working with source code)
- ORG 以便捷和自然的方式支持文学编程 (literate programming)
- 支持插入代码片段、在 ORG 缓冲区执行代码片段并输出计算结果;支持从 Org 文件抽取源代码文件
更多有关 ORG 模块内容,请参阅 学习 Emacs Org。
有关 ORG 的详细配置,请参阅 init-org.el。
MacTex 被 ORG Mode 用于到处 PDF 以及 Tex 格式文档,可直接运行如下命令安装 MacTex :
$ brew cask install mactex
建议使用 aspell + ispell-mode。运行如下命令安装 aspell
$ brew install --with-lang-en aspell
添加如下配置启用拼写检查。
;; for spell check
;; could be ispell as well, depending on your preferences
(setq ispell-program-name "aspell")
;; this can obviously be set to any language your spell-checking program supports
(setq ispell-dictionary "english")
(add-hook 'org-mode-hook 'flyspell-mode)
(add-hook 'org-mode-hook 'flyspell-buffer)
- 使用 Capture 快速添加 TODO 和 NOTE。
;; Capture 模版配置
(setq org-capture-templates
`(("t" "todo" entry (file "") ; "" => `org-default-notes-file'
"* TODO %?\n SCHEDULED: %U\n" :clock-resume t)
("n" "note" entry (file "")
"* %? :NOTE:\n%U\n%a\n" :clock-resume t)
))
- 指定org-agenda-dir,Emacs会从指定目录下的所有 .org 文件抽取日程安排。
;; define the refile targets
(defvar org-agenda-dir "")
(setq-default org-agenda-dir "~/org")
(setq org-default-notes-file "~/org/refile.org")
(setq org-agenda-files (list org-agenda-dir))
TRAMP 能够被用于访问远程机器文件,支持 ssh
, scp
, rsync
, smb
, adb
等协议。它工作于 Emacs
底层,因此很多包都无感使用 TRAMP。
- 使用 Emacs 编辑远程文件而无需在远程机器上安装 Emacs
- 配合
dired
模块使用而将 Emacs 变成一个ssh
客户端 - 配合
eshell
模块使用可以将本地输入命令送到远程机器执行
有关 TRAMP 的使用,请参阅 Emacs TRAMP。
使用 Emacs + AUCTeX + CDLaTeX mode + LaTeX 可以帮助进行科学写作。
默认配置工作良好。
;; for cdlatex
(require 'cdlatex)
;; for acutex
(require 'auctex)
;; 在 org mode 下打开 cdlatex
(add-hook 'org-mode-hook 'turn-on-org-cdlatex)
CDLaTeX 是一个 Minor Model,可以帮助加速输入 LaTeX 公式。在 Org 模式下,建议使用 Org 模式内置的轻量级 org-cdlatex-mode
版本。要在当前缓冲区打开该模式,请运行 M-x org-cdlatex-mode
, 如果要为所有 Org 文件打开该模式,请做如下配置:
;; 在 org mode 下打开 cdlatex
(add-hook 'org-mode-hook 'turn-on-org-cdlatex)
LaTeX 片段预览支持行内预览。该功能需要安装 dvipng
, dvisvgm
或者 convert
以处理 LaTeX 片段产生预览图片。可以通过定制变量 org-format-latex-options
和 org-format-latex-header
配置预览。特别是 :scale
(对应 HTML 输出 :html-scale
) 属性可以用来调整预览图片的大小。
;; 切换预览 LaTeX 片段
C-c C-x C-l (org-toggle-latex-fragment)
Org Entities 帮助方便搜索和显示所有 Org 实体,包括 LaTeX 数学符号、函数等。输入 M-x 命令,可以查看完整的 entities:
;; 查看完整的 Org 实体定义
M-x org-entities-help
英文版 - https://tobi.oetiker.ch/lshort/lshort.pdf 中文版 by ChinaTEX 论坛 - https://github.com/CTeX-org/lshort-cn/
CATN (The Comprehensive TEX Archive Network) 是一个囊括各种类型 TEX 文档资源的中心站点。
使用 Emacs 及 Python 相关插件模块,可以自己动手,构建一个完善的 Python IDE 开发环境,除了支持基本的代码编辑、自动补全、代码调试以外,还支持 Python 虚拟环境、Jupyter Notebook 集成、Org 模块集成等。
有关详情,请参阅 Python IDE (TODO…)。
使用 Emacs 可以构建一个完整的 C/C++ IDE 开发环境,从代码编辑、自动补全、代码调试、编译、运行测试到重构,甚至是项目管理均有良好的支持。
有关详情,请参阅 C/C++ IDE (TODO…)。
使用 lsp-java
构建完善的 Java IDE 开发环境,支持代码编辑、补全、风格检查、交叉引用索引等现代 IDE 支持。有关详情,请参阅 Java IDE。
- 不关闭 Emacs,重新加载配置 - 执行命令
M-x load-file RET
来加载变更后的 Emacs 配置。 - Gloden Ratio - Automatic resizing of Emacs windows to the golden ratio.
- GNU Emacs, https://www.gnu.org/software/emacs/
- crossemacs, https://github.com/cnsworder/crossemacs.
- purcell, https://github.com/purcell/emacs.d.
- compay, https://company-mode.github.io.
- Emacs 下的 git 工具 magit 简介 - http://jixiuf.github.io/blog/000100-emacs-magit.html/.
- Emacs: 最好的 Python 编辑器, https://segmentfault.com/a/1190000004165173.
- Emacs IPython Notebook, https://tkf.github.io/emacs-ipython-notebook/.
- elpy, https://elpy.readthedocs.io/en/latest/introduction.html.
- ein, https://millejoh.github.io/emacs-ipython-notebook/.
- Master Emacs in 21 Days, zilongshanren, http://book.emacs-china.org/#orgheadline1.
- IPython Notebook, https://ipython.readthedocs.io/en/stable/.
- C/C++ Development Environment for Emacs - https://tuhdo.github.io/c-ide.html.
- Ivy User Manual - https://oremacs.com/swiper/.
- Ivy swiper - https://github.com/abo-abo/swiper.
- A Package in a league of its own: Helm - https://tuhdo.github.io/helm-intro.htm.
- Exploring large projects with Projectile and Helm Projectile - https://tuhdo.github.io/helm-projectile.html.
- Helm Github - https://github.com/emacs-helm/helm.
- Python Progromming In Emacs - https://www.emacswiki.org/emacs?action=browse;oldid=PythonMode;id=PythonProgrammingInEmacs.
- latex - https://www.latex-project.org/get/.
- mactex - https://www.tug.org/mactex/.
- lst-java - https://github.com/emacs-lsp/lsp-java.
- Emacs Bootstrap - http://emacs-bootstrap.com.
- Emacs Tramp - https://writequit.org/denver-emacs/presentations/2017-06-20-tramp.html.
- EmacsWiki - AUCTeX - https://www.emacswiki.org/emacs/AUCTeX.
- AUCTeX docuement - http://www.gnu.org/software/auctex/documentation.html.
- Spacemacs 和 Org-mode 和 LaTeX - https://blog.poi.cat/post/spacemacs-plus-org-mode-plus-latex
- CDLaTeX help, https://orgmode.org/manual/CDLaTeX-mode.html.
- LaTeX fragments Previewing, https://www.gnu.org/software/emacs/manual/html_node/org/Previewing-LaTeX-fragments.html.
- orgmode, https://orgmode.org, 2019.
- orgmode 手册学习笔记, https://emacsist.github.io/emacsist/orgmode/orgmode%E6%89%8B%E5%86%8C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.html, 2017.
- 文学编程简介, https://github.com/lujun9972/emacs-document/blob/master/org-mode/%E6%96%87%E5%AD%A6%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B.org, 2016.
- Literate database, http://howardism.org/Technical/Emacs/literate-database.html, 2015.
- EMACS-DOCUMENT, http://blog.lujun9972.win/emacs-document/, 2019.
- gloden ratio 模块 - Automatic resizing of Emacs windows to the golden ratio.
- Fast and robust Emacs setup - by Chenbin.
本作品采用知识共享署名 4.0 国际许可协议。