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里面添加如下代码就可以了。
(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作为主模式。
(add-to-list 'auto-mode-alist '("\\.php?\\'" . web-mode))
而Minor mode提供辅助功能,例如,行号显示。通过C-h m
可以查看两者的详细信息。
如果我们需要为Major做一些特定的功能,就需要用到hook,例如下面是我的php mode的设置,主要是补全功能:
(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,也习惯这套操作,所以安装了evil
,evil-leader
插件。然后就可以定义leader key形式的快捷键,而不需要再ctrl到死了。
比如下面是我为快速开启init.el定义的快捷键:
(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-group
,RET
,evil-leader
,RET
这个键入步骤进入定制界面,然后更改leader key即可。
如果不用evil的话,也可以这样定义快捷键:
(global-set-key (kbd "M-x") 'helm-M-x)
我个人觉得emacs定义快捷键还是挺复杂的,没有一个放之四海而皆准的方法,可能与其Major和Minor的设计有关。如果碰到问题可查看下文的学习链接,都有相关的解释。
split
分久必合合久必分。
当你按着自己的习惯安装了一堆插件,定义了一堆个性化的功能后,你会发现init.el已经不堪重负。所以我们需要拆分代码了,也可以叫重构。
其实代码的组织有很多种形式,好像还能放到org里面,但是毕竟是newer,不求高端,只求能用。
做开发的都知道import
,require
,include
这些关键字,就是用来把文件导入、或者引入用的。
我们这里用provide
,require
。
比如我们拆分出来一个~/.emacs.d/my_config/my_theme.el
:
;; my_theme.el 主题相关设置
(require 'doom-modeline)
(doom-modeline-init)
(setq-default linum-format "%4d ")
;; 重点来了
(provide 'my_theme)
我们在文件末尾provide
一下,注意要跟文件名一致。
然后我们在init.el里面这样写就可以了:
(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,这个不知道是谁,但是写的很不错,通俗易懂。
(完)
- 本文作者:吴泽辉
- 本文链接:https://mutex.top/posts/0290ce43/
- 发表日期:2018年10月13日
- 版权声明:本文章为原创,采用《知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议》进行许可