Skip to content
Emacs config for ORG/Python/c/c++/Java
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs
emacs.d
.gitignore
.stowrc
LICENSE
README.org
deploy.sh
test-startup.sh

README.org

Junahan 的 Emacs 配置

1 摘要

我的 Emacs 配置,初始版本从 Crossemacs 复制。参阅 purcell Emacs 以及其他人的 Emacs 配置 ,详情请看参考文献小节。

主要需求是使用 Org-mode,Python,C/C++ 以及 Java 开发环境。

特别提醒,本 Emacs 配置仅在如下环境进行过测试:

OS: Darwin … Darwin Kernel Version 17.4.0 / Emacs: GNU Emacs 25.3.1

2 支持特性 <<features>>

  1. init.el - 位于 .emacs.d 目录下的 Emacs 配置文件入口,在这里加载 lisp 目录下的配置子模块。
  2. init-utils.el - 一些用于配置文件的工具函数定义。
  3. init-elpa.el - 配置 ELPA 仓库。
  4. init-common.el - 通用配置。例如 Speedbar, Projectile, Yasnippet 等。
  5. init-git.el - 使用 Magit 作为 Git Emacs 前端。
  6. init-company.el - 使用 Company 做通用补全,对于不同的语言,可以配置不同的补全后端。
  7. init-flycheck.el - 配置 Flycheck 作为代码飞行检查。
  8. init-ivy-swiper.el - 使用 Swiper 替代 isearch。
  9. init-helm.el - 使用 Helm 作为增量补全和缩减选择的工具,并使用 Helm Projectile 管理项目。
  10. init-helm-gtags.el - 使用 helm-gtags 配置标签索引。
  11. init-org.el - 配置 Org 模块。
  12. init-cpp.el - c/c++ 语言相关配置
  13. init-cedet.el - CEDET 工具配置,包括 Semantic, Senator 等。
  14. init-python.el - 配置 Python 开发环境,使用 Elpa 并使用 Conda 管理虚拟环境 。
  15. init-ein.el - 配置 EIN (Emacs IPython Notebook) 作为 Jupter Notebook Emacs 客户端。
  16. init-lsp-java.el - 使用 slt-java 构建 Java IDE环境。
  17. init-solidity.el - 支持 Solidity 语言开发。
  18. init-theme - 配置使用 gruvbox 主题,配置其他主题相关,如字体,highligh-parentheses, popwin, frame size 等。
  19. init-dashboard.el - Dashboard 相关配置。
  20. init-keyset.el - 配置通用快捷键。

3 快速入门 <<quick-guide>>

3.1 安装 Emacs

使用 Homebrew 安装 Emacs:

$ brew cask install emacs

3.2 克隆 junanhan-emacs.git 项目

运行如下命令从 Github Clone junahan-emacs.git 项目:

# Clone 项目
git clone https://github.com/junahan/junahan-emacs.git

3.3 测试

通过运行项目目录中的脚本 test-startup.sh 运行测试,测试使用项目目录作为 HOME 目录运行测试脚本。

# Emacs debug-init模式运行测试
./test-startup.sh

3.4 部署

  • 开始之前,备份你的 ~/.emacs.d 目录以确保你能够回去你以前的配置。
  • 运行 ./deploy.sh 脚本 - 该脚本使用 stow 在 HOME 目录创建 .emacs.d 链接。

4 TODO 常用 Emacs Mode 介绍 <<emacs-mode-intro>>

本节简单介绍一些常用的 Emacs Mode,也是 junahan-emacs 项目使用到的 Emacs 模块。通过这些介绍,你可以大致了解到这些模块的功能、配置和使用。

4.1 安装 Emacs 模块包

快速启动一章已经介绍了如何使用 junahan-emacs 项目安装所需要的环境,本章所需要的常用模块包都已经准备就绪。如果你需要尝试安装不同的包,你可以使用 Emacs 安装包管理工具直接安装:

M-x package-install RET helm-company RET

4.2 Company 和 company-backends 变量

Company 是一个文本补全框架,该命名意思是“完成任何事情”,文本补全框架通过可插拔前后端获取和显示补全候选列表。可选的后端包括 Elisp, Clang, Ispell, CMake, Yasnippet, etags, gtags, files, keywrods, semantics 等等。通过配置 company-backends 变量支持后端列表。

4.2.1 Company 相关插件模块

  • 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 函数开启。

4.2.2 激活 Company 通用支持

通过如下配置激活该 Ccompany Global Mode:

;; Enable global-company-mode.
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)

4.2.3 配置 company-backends 变量

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= 命令查看该变量的值。

4.3 Flycheck

Flycheck 是一个飞行句法检查和提示工具,它使用多种语法检查和提示工具在你输入的时候自动检查缓冲区内容,并在缓冲区直接提示和报告警告和错误。Fly check 支持超过 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))

4.4 Helm

Helm 是一个增量补全和缩减选择的 Emacs 框架。它为开发人员提供非常容易使用的 API 以开发基于 Helm 的 Emacs 应用,同时提供了强大的搜索工具以及许多内建支持几乎所有常用的补全命令。

4.4.1 安装和配置

可以通过运行 M-x list-packages 命令选择并安装 *Helm* 包,或者打开 .emacs.d/Cask 文件,添加 (depends-on "helm") ,然后运行 cask install 命令安装 *Helm* 。完成安装后,最简单的配置如下,即可启动 *Helm*

(require 'helm-config)
(helm-mode 1)

更完整的配置,请参阅Helm 完整配置

4.4.2 Usage

通过适当的配置, Helm 会接管你大部分日常使用的 Emacs 操作界面,你可以借助其强大的增量式补全,逐步缩减候选列表范围直到找到你需要的项为止,例如,它可以接管 M-x 界面,允许你以 Helm 的方式选择要运行的命令,这通常会提升你的效率。它还有非常好用的正则表达式匹配和搜索界面。

Key 绑定命令说明
M-xhelm-M-x命令列表
M-yhelm-show-kill-ring显示剪切环内容
C-x bhelm-mini显示打开的缓冲区和最近打开的文件
C-x C-fhelm-find-filesFind-file 的 Helm 版本
C-shelm-ff-run-grep正则表达式版本的 helm-find-files
C-c h ihelm-semantic-or-imenuSemantic/imenu 的 Helm 界面
C-c h mhelm-man-woman跳转到任意 man 文档入口
C-c h /helm-findFind 的 Helm 界面
C-c h lhelm-locateLocate 的 Helm 界面
C-c h ohelm-occurOccure 的 Helm 界面
C-c h ahelm-apropos命令、函数、变量描述
C-c h h ghelm-info-gnus
C-c h h ihelm-info-at-point
C-c h h rhelm-info-emacs
C-c h <tab>helm-lisp-completion-at-point提供一个可用函数列表
C-c h bhelm-resume恢复前面一个 helm 会话
C-h SPChelm-all-mark-rings查看本地和全局标记环内容
C-c h rhelm-regrex可视化正则表达式匹配
C-c h xhelm-register显示 Emacs 注册表内容
C-c h thelm-topTop 系统命令的 Helm 界面
C-c h shelm-surfraw很多 Web 搜索引擎的命令行界面
C-c h ghelm-google-suggest在 Helm 缓冲区内支持交互式输入搜索项和从 Google 获取结果
C-c h chelm-color列出所有可用的 Faces
C-c h M- :helm-eval-expression-with-eldoc在 Helm 缓冲区获取 Emacs lisp 表达式实时结果
C-c h C- ,helm-calcul-expressionHelm 计算器界面
C-c C-lhelm-eshell-historyEshell 历史界面
C-c C-lhelm-comit-input-ringShell 历史界面
C-c C-lhelm-mini-buffer-historyMini-buffer 历史界面

4.4.3 Helm-projectile

Helm-projectile 是一个 Projectile 的 Helm 界面扩展,支持大多数 Projectile 命令甚者更多特性支持。详情,请参阅使用 Helm + Projectile 管理项目

4.5 Magit

Magit 是优秀的 Emacs Git 前端,实现大多数 Git 命令,足够处理常用的版本管理任务,可以让你不离开 Emacs 使用 Git。

4.5.1 安装和配置

可以通过 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 操作均可以通过该命令界面完成。

4.5.2 使用总结

运行 C-x g 打开 mgit-status 界面,该界面显示如下图。

docs/images/emacs-mgit-status.png

有关 Mgit 使用的更多介绍,请参阅 Emacs下的 git 工具 magit 简介

4.6 Projectile <<helm-projectile>>

Projectile 是一个 Emacs 项目管理库,其目标是为项目级别上的操作提供一组易用的特性。Helm-projectile 是一个 Projectile 的 Helm 界面扩展,支持大多数 Projectile 命令甚者更多特性支持。

  • 同时选择和打开多个文件
  • 任意位置位置打开文件
  • 任意位置标记和复制多个文件
  • 任意位置标记和删除文件
  • 任意切换当前和其他同名文件

4.6.1 安装和配置

可以通过 MELPA 安装 Projectile,使用如下代码配置和激活 helm-projectile

(use-package helm-projectile
      :init
      (helm-projectile-on)
      :config
      (setq projectile-completion-system 'helm))

4.6.2 快捷键绑定总结

所有 Projectile 命令均以 C-c p 为前缀。以下是有关快捷键绑定的总结。

快捷键命令说明
C-c p hhelm-projectileHelm projectile 界面
C-c p phelm-projectile-switch-project切换至另外的项目
C-c p fhelm-projectile-find-file列出当前项目所有文件
C-c p Fhelm-projectile-find-file-in-known-projects在所有已知项目中查找文件
C-c p ghelm-projectile-find-file-dwim基于上下文查找文件
C-c p dhelm-projectile-find-dir列出当前项目所有目录
C-c p ehelm-projectile-recentf列出当前项目最近打开的文件
C-c p ahelm-projectile-find-other-file在具有文件名但不同扩展名之间的文件切换
C-c p iprojectile-invalidate-cache作废缓存
C-c p zprojectile-cache-current-file添加当前选中缓冲区文件至缓存
C-c p bhelm-projectile-swith-to-buffer列出所有当前项目中打开的缓冲区
C-c p s ghelm-projectile-grep从项目根目录开始搜索符号
C-c p s ahelm-projectile-ack同上,但使用 ack
C-c p s shelm-projectile-ag同上,但使用 ag

4.7 TODO ORG

4.7.1 安装 MacTex

MacTex 被 ORG Mode 用于到处 PDF 以及 Tex 格式文档,可直接运行如下命令安装 MacTex :

$ brew cask install mactex

4.7.2 使用 Capture

  • 使用 Capture 快速添加 TODO 和 NOTE。
  • 指定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))

4.7.3 Spell check

建议使用 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)

4.8 TODO TRAMP Mode

5 TODO 科学写作

使用 Emacs + AUCTeX + LaTeX 可以帮助进行科学写作。

5.1 CDLaTeX

CDLaTeX 是一个 Minor Model,可以帮助加速输入 LaTeX 公式。在 Org 模式下,建议使用 Org 模式内置的轻量级 org-cdlatex-mode 版本。要在当前缓冲区打开该模式,请运行 M-x org-cdlatex-mode, 如果要为所有 Org 文件打开该模式,请做如下配置:

(add-hook 'org-mode-hook 'turn-on-org-cdlatex)

5.2 TODO Gunplot Mode

5.3 杂项

5.3.1 LaTeX 片段预览配置

LaTeX 片段预览支持行内预览。该功能需要安装 dvipng, dvisvgm 或者 convert 以处理 LaTeX 片段产生预览图片。可以通过定制变量 org-format-latex-optionsorg-format-latex-header 配置预览。特别是 :scale (对应 HTML 输出 :html-scale) 属性可以用来调整预览图片的大小。

5.3.2 Org Entities Help

Org Entities 帮助方便搜索和显示所有 Org 实体,包括 LaTeX 数学符号、函数等。输入 M-x 命令,可以查看完整的 entities:

$ M-x org-entities-help

5.4 进阶学习

5.4.1 一份不太简短的 LaTeX2e 介绍

英文版 by - 中文版 by ChinaTEX 论坛 - https://github.com/CTeX-org/lshort-cn/

5.4.2 CTAN

CATN (The Comprehensive TEX Archive Network) 是一个囊括各种类型 TEX 文档资源的中心站点。

6 开发环境 <<ide>>

6.1 Python IDE

使用 Emacs 及 Python 相关插件模块,可以自己动手,构建一个完善的 Python IDE 开发环境,除了支持基本的代码编辑、自动补全、代码调试以外,还支持 Python 虚拟环境、Jupyter Notebook 集成、Org 模块集成等。

有关详情,请参阅 Python IDE (TODO…)。

6.2 C/C++ IDE

使用 Emacs 可以构建一个完整的 C/C++ IDE 开发环境,从代码编辑、自动补全、代码调试、编译、运行测试到重构,甚至是项目管理均有良好的支持。

有关详情,请参阅 C/C++ IDE (TODO…)。

6.3 Java IDE

使用 lsp-java 构建完善的 Java IDE 开发环境,支持代码编辑、补全、风格检查、交叉引用索引等现代 IDE 支持。有关详情,请参阅 Java IDE

7 参考文献 <<references>>

  1. GNU Emacs, https://www.gnu.org/software/emacs/
  2. crossemacs, https://github.com/cnsworder/crossemacs.
  3. purcell, https://github.com/purcell/emacs.d.
  4. compay, https://company-mode.github.io.
  5. Emacs 下的 git 工具 magit 简介 - http://jixiuf.github.io/blog/000100-emacs-magit.html/.
  6. Emacs: 最好的 Python 编辑器, https://segmentfault.com/a/1190000004165173.
  7. Emacs IPython Notebook, https://tkf.github.io/emacs-ipython-notebook/.
  8. elpy, https://elpy.readthedocs.io/en/latest/introduction.html.
  9. ein, https://millejoh.github.io/emacs-ipython-notebook/.
  10. Master Emacs in 21 Days, zilongshanren, http://book.emacs-china.org/#orgheadline1.
  11. IPython Notebook, https://ipython.readthedocs.io/en/stable/.
  12. C/C++Development Environment for Emacs - https://tuhdo.github.io/c-ide.html.
  13. Ivy User Manual - https://oremacs.com/swiper/.
  14. Ivy swiper - https://github.com/abo-abo/swiper.
  15. A Package in a league of its own: Helm - https://tuhdo.github.io/helm-intro.htm.
  16. Exploring large projects with Projectile and Helm Projectile - https://tuhdo.github.io/helm-projectile.html.
  17. Helm Github - https://github.com/emacs-helm/helm.
  18. Python Progromming In Emacs - https://www.emacswiki.org/emacs?action=browse;oldid=PythonMode;id=PythonProgrammingInEmacs.
  19. latex - https://www.latex-project.org/get/.
  20. mactex - https://www.tug.org/mactex/.
  21. lst-java - https://github.com/emacs-lsp/lsp-java.
  22. Emacs Bootstrap - http://emacs-bootstrap.com.
  23. Emacs Tramp - https://writequit.org/denver-emacs/presentations/2017-06-20-tramp.html.
  24. EmacsWiiki - AUCTeX - https://www.emacswiki.org/emacs/AUCTeX.
  25. AUCTeX docuement - http://www.gnu.org/software/auctex/documentation.html.
  26. Spacemacs 和 Org-mode 和 LaTeX - https://blog.poi.cat/post/spacemacs-plus-org-mode-plus-latex
  27. CDLaTeX help, https://orgmode.org/manual/CDLaTeX-mode.html.
  28. LaTeX fragments Previewing, https://www.gnu.org/software/emacs/manual/html_node/org/Previewing-LaTeX-fragments.html.

本作品采用知识共享署名 4.0 国际许可协议进行许可。

You can’t perform that action at this time.