How to easily configure your emacs?

为啥用英文做标题呢?我也不知道,顺口瞎突突。。。

why

其实就是想更多的了解一些emacs,用了大概一年的spacemacs,什么也没学会,并且之前是在虚拟机终端上用,感觉非常卡。而且如果要学习spacemacs的哲学也需要花费一些时间,所以还不如自己配置emacs,不管好坏自己能用就行。

用了大概一周的时间整理了emacs的配置,包括一些常用的功能,搜索替换,工程,org,一些自定义函数等。

本文需要你有一点点的emacs使用基础,大概了解如何配置

doing

package

emacs自带插件管理,但是并不是很方便,所以我们需要一段代码来方便插件的安装。

参照子龙山人教程里面的配置代码,放到init.el里面,需要什么插件,直接添加就可以了。

除了melpa的源,我们也可以从github直接下载el文件,放在我们的配置文件目录~/.emacs.d/private下,当然这个目录用什么都行,然后在init.le里面添加如下代码就可以了。

1
2
(add-to-list 'load-path "~/.emacs.d/private")
(require 'package-name)

我经常用的插件管理方式就是这两种,应该也有像vim那样提供个github链接就能自动安装插件的功能,这个功能影响不大。

Major or Minor

Major mode和Minor mode是我觉得emacs很好玩的地方。

Major mode可以理解为主模式,比如我们编写php,Major就是php mode,html可以是web mode。

Major mode为某些文件提供针对性的功能,比如针对php的补全,高亮方案等

mode line上通常会显示当前的Major mode。

我们可以通过如下代码改变默认的行为,例如,我想让php用web mode作为主模式。

1
(add-to-list 'auto-mode-alist '("\\.php?\\'" . web-mode))

而Minor mode提供辅助功能,例如,行号显示。通过C-h m可以查看两者的详细信息。

如果我们需要为Major做一些特定的功能,就需要用到hook,例如下面是我的php mode的设置,主要是补全功能:

1
2
3
4
5
6
7
8
9
10
(defun my_php_mode_setting()
"php mode setting"
(setq indent-tabs-mode t)
(require 'company-php)
(company-mode t)
(ac-php-core-eldoc-setup)
(make-local-variable 'company-backends)
(add-to-list 'company-backends 'company-ac-php-backend))

(add 'php-mode-hook 'my_php_mode_setting)

这里我把需要的功能定义了一个函数,然后添加到php-mode-hook里面,这样看起来更简洁一些。

到这里你可能发现一些安装的插件并没有生效,或者行为有点问题,这时候就需要去插件的github地址详细看看README了。通常作者都会附上简短的使用代码,copy到init.el里面即可。

keymap

定义快捷键是必须的了,为了保护小拇指,之前学tmux的时候,用了三天不到黑,小拇指就疼了。。。

我最开始用vi,也习惯这套操作,所以安装了evilevil-leader插件。然后就可以定义leader key形式的快捷键,而不需要再ctrl到死了。

比如下面是我为快速开启init.el定义的快捷键:

1
2
3
4
5
6
(defun open-init-file()
(interactive)
(find-file "~/.emacs.d/init.el"))

(evil-leader/set-key
"e" 'open-init-file)

这样只要我按一下SPC e就可以打开init.el了。SPC就是leader key,我们可以通过Alt-x customize-groupRETevil-leaderRET这个键入步骤进入定制界面,然后更改leader key即可。

如果不用evil的话,也可以这样定义快捷键:

1
(global-set-key (kbd "M-x") 'helm-M-x)

我个人觉得emacs定义快捷键还是挺复杂的,没有一个放之四海而皆准的方法,可能与其Major和Minor的设计有关。如果碰到问题可查看下文的学习链接,都有相关的解释。

split

分久必合合久必分。

当你按着自己的习惯安装了一堆插件,定义了一堆个性化的功能后,你会发现init.el已经不堪重负。所以我们需要拆分代码了,也可以叫重构。

其实代码的组织有很多种形式,好像还能放到org里面,但是毕竟是newer,不求高端,只求能用。

做开发的都知道importrequireinclude这些关键字,就是用来把文件导入、或者引入用的。

我们这里用providerequire

比如我们拆分出来一个~/.emacs.d/my_config/my_theme.el

1
2
3
4
5
6
7
8
;; my_theme.el 主题相关设置
(require 'doom-modeline)
(doom-modeline-init)

(setq-default linum-format "%4d ")

;; 重点来了
(provide 'my_theme)

我们在文件末尾provide一下,注意要跟文件名一致。

然后我们在init.el里面这样写就可以了:

1
2
(add-to-list 'load-path "~/.emacs.d/my_config")
(require 'my_theme)

第一句话添加加载路径,第二句用来引入。简单吧!

我也就用了这些知识点,当然也用很多不懂的地方,现在的elisp代码基本就是抄。

end

这个过程还是挺好玩的,折腾配置根本停不下来,不过不要用太多的时间在这上面,玩玩就好,工作中的场景通常比较复杂,我工作的主力依然是phpstorm,能用就用,不能用也别太强求,最起码org你没得挑吧,^_^

这篇文章没有过多的写细节,主要是提供了一个自定义配置的思路,按照这个流程可以让你快速的使用上,之后的调优可以慢慢来,当然也可以fork我的项目,不过我这个比较渣。

值得说一句的是,emacs经过这么多年的发展,自身已经有很多功能了,我们可能总想着安插件来丰富emacs,其实不如探索下emacs文档,里面可能有你想不到多好用的功能

learn

附上几个对我帮助非常大的链接:
前文提到的子龙山人,以及emacs china
Practical Emacs Tutorial,这个不知道是谁,但是写的很不错,通俗易懂。

(完)