Emacs Practices

Table of Contents

1 简介

可能你已经听过 Emacs 被称为“神的编译器”,也有可能见过许多关于它和 “编译器之神” vim 之间的争论,我们不去管那些争论。我自己是一个实用主义者,什么东西好,我就直接拿来用,其实哪有什么东西是万能的,只有适合或者不适合。使用 Emacs 目的只有一个:效率!!

这篇文章主要根据GNU Emacs Manuals Online 以及所用到的插件的 manual 来介绍 Emacs 的安装和配置过程,可以说是.emacs.d 对应的一份说明书,配置中内容出现的顺序与各其在对应 manual 中出现的顺序基本保持相同,主要原因是为了以后方便对应 manual 进行查找,插件除非在逻辑关系上存在前后关系,配置文件中一般按照插件英文名字。当然查看这些 manual 更方便的方式是使用 Emacs 自带的 info 功能,而不是打开浏览器查看对应的 web 页面。

2 安装

2.1 Window

可以从官网下载编译的好的二进制 Emacs 包,但是官网是 32 位的,而且没有图片和 Gnutls 的 DLL 库,所以更推荐使用 ChrisZheng 编译的 64 位版本 emacs-w641,该版本进行自带了一切 windows 下一些要使用的 DLL,并且做了一些优化。

2.2 Linux

除了通过 apt 或者 yum 等包管理器安装外,还可以通过源码进行编译。

git clone git://git.savannah.gnu.org/emacs.git
cd emacs
# on ubuntu
sudo apt-get build-dep emacs24
# on centos

./autogen.sh
./configure                     # 此处注意查看还缺少什么库
make && sudo make install && make clean

3 配置

包含配置文件的.emacs.d 托管在 Github 上面,使用 git 进行版本控制,配置文件中私有、不方便的公开的部分放在私有的仓库里,通过 git 的子模块功能进行管理,具体参看《GIT 实践》 中的子模块部分。

当测试一个新功能或者新的插件的时候,使用 git 的分支功能,具体参看《GIT 实践》中的分支部分。

3.1 配置为强大的 IDE

这一小节主要讲解如何将 Emacs 配置成为一个强大的 IDE,内容包括项目工程管理、文件查找、代码补全等等。

3.1.1 项目管理(Project Management)

从项目层次对代码进行管理。

项目管理有很多工具,包括 ede,projectile 等工具,在尝试了几款插件之后,最合适我的还是 projectile。 正如 projectile 所言,它提供了一系列特性来支持工程管理,这些特性不依赖第三方,当然,有些情况下结合第三方工具能提供更好的性能。

projectile 中的工程概念十分简单:包含特殊文件的文件夹。目前 git, mercurial, darcs 和 bazaar 的容器都会默认为一个工程目录,lein, maven, sbt, scons, rebar and bundler 也同样如此。如果想手动指定文件夹为工程目录,只需要在其中新建一个名字为 .projectile 的空文件即可。

prjectile 通过和 helm 整合在一起(helm-projectile),可以在工程切换、文件路径补全方面得到更好的支持,如可以指定更多切换工程后的要执行的动作,补全可以为渐进补全等。helm-projectile 提供了一些 helm 版本的 projectile 命令,这些命令更加好用。参考 《Exploring large projects with Projectile and Helm Projectile》

下面将一步步介绍如何使用 projectile 来实现工程管理的一些需求,当然中间也会适当的引入其他插件作为补充。

切换项目

helm-projectile-switch-project

保存当前工程所有打开文件

projectile-save-project-buffers

关闭当前工程所有打开文件

projectile-kill-buffers

浏览当前工程目录
  • helm-projectile-find-dire
  • speedbar

    使用 cedet 包中的 speedbar 可以单独分出一个侧边栏,用来浏览整个工程,包括文件变量等。

清除当前工程文件缓存

projectile-invalidate-cache

定义工程项项目相关的变量
  • 目录变量

3.1.2 文件操作(File in Project)

  • 显示工程文件目录树
    • windows tree . /f
    • ubuntu
  • 在所有已知工程中查找文件

    helm-projectile-find-file-in-known-project(C-c p F)

  • 切换当前工程已打开文件

    helm-projectile-switch-to-buffer (C-c p b)

  • 当前工程中查找文件

    helm-projectile-find-file (C-c p f)

  • 当前工程指定目录中查找文件

    projectile-find-file-in-directory (C-c p l)

  • 打开当前光标下文件

    projectile-find-file-dwim(C-c p g)

  • 同名但不同类型文件切换,例如 .h <-> .c/.cpp, Gemfile <-> Gemfile.lock…

    helm-projectile-find-other-file (C-c p a)

  • 跳转到当前工程最近浏览文件(jump to recently visited files in the project)

    helm-projectile-recentf (C-c p e)

  • 添加文件到工程

    projectile-cache-current-file (C-c p z)

3.1.3 代码导航(Code Navigation)

程序中的变量和函数名称统称为符号。

搜索
  • 工程内搜索符号
    • helm-projectile-grep (C-c p s g)
    • helm-projectile-ag (C-c p s s)

    搜索速度 ag>ack>grep,所以推荐使用搭配 ag(the silver search)进行工程内符号 (symbol) 和单词 (word) 的全局搜索。

  • 查找定义(find tag defination)
    • semantic-complete-jump-local(C-c j)

      跳转到定义在当前文档中的符号。

    • semantic-complete-jump

      只要符号定义的文件被 semantic 分析过,都能进行跳转(C-c J)。

    • helm-semantic-or-imenu(C-c h i)
    • helm-gtags-select(C-c g A)

      与 helm-semantic-or-imenu 功能差不多。

    • helm-gtags-find-tag(C-c g t)

      查找 tag 引用 (find tag reference)

    • helm-gtags-find-rtags(C-c g r)

      跳回上次查看的地方

    • helm-gtags-pop-stack(C-c g p)
  • 查找引用
代码折叠
  • hide-show-mode
  • semantic-tag-folding
代码高亮
  • 高亮同名符号
    • auto-highlight-symbol
  • 高亮当前行

3.1.4 编辑代码(Source Code Editor)

全局替换(replace in project)

projctile-replace (C-c p r)

高亮文件内同名符号(highlight symbol in file)

helm-occur(C-c h o)

高亮作用域内同名符号(highlight symbol in function)

multi-occur

自动补全(auto complete)
  • completion-at-point(C-M-i)
  • semantic-complete-analyze-inline(C-c,SPC)

    显示当前 point 处符号可能的补全列表。

  • yasnippet

    使用 yasnippet 补全数据结构(class)、条件控制(if 等)、循环(for 等)、文件头(file head)、函数(类)注释。可以地带 doxymacs 和 header2 使用。

  • company
  • auto-complete
  • python
    • pymacs
    • ropemacs
    • jedi
代码格式化(format)
  • 符号命名法
    • subword-mode

      可以处理驼峰命名法的单词。

    • superword-mode

      可以将下划线‘_’连起来的单词当做一个符号。

自动换行
  • electric-layout-mode

    可以在编程模式中 {,},;等符号之后自动换行。

缩进(indentation)

自带的缩进效果已经很好,但是要注意的一点是: 如果想要改变缩进时 TAB 键插入的空白符,需要修改 TabStopList,tab-width 只对已经存在的制表符的显示效果起作用 6

3.1.5 语法检查

编程语言语法检查,单词检查。

  • flycheck
  • pylint

3.1.6 编译代码(Compiler)

自动化编译,一键编译

  • helm-projectile-compile-project

3.1.7 调试代码(Debug)

调试代码,直接跳转到测试文件,进行单元测试

  • jump to a test in project
    • projectile
  • toggle between code and its test
    • projectile

3.1.8 工程文档(Document)

查看函数说明,生成函数、类的文档。

  • manual
    • info-lookup-symbol(C-h S)
    • M-x man

      在 man mode buffer 中还可以使用 C-h m 跳转到其他 man page。

    • M-x woman

      不支持 man 程序的操作系统(如 windows)上可以使用该命令显示 man page。

  • Doxygen
  • GraphViz
  • UML

3.1.9 版本控制(Version Control)

  • projectile helm-projectile-vc (C-c p v)
  • magit

3.1.10 持续集成

Footnotes:

Author: lsl

Created: 2016-08-07 Sun 19:30

Validate