# 前言

我个人主要使用的操作系统是 Windows ,所以我希望在这个环境下配置好 Emacs ,这里就有两个选择,一个是原生的 Windows 下的 Emacs 应用程序;另一种选择是 Linux 子系统下安装 Emacs ,因为现在 Linux 子系统也支持图形界面应用了,所以直接安装使用也非常方便。但是在实际配置的过程中间遇到了许多的问题,只能说各有优缺点,这里我最终还是选择了使用 Windows 下的原生 Emacs 程序。

# Linux 子系统

子系统下无论是安装 Emacs 还是设置其他配置都非常方便,基本和原生的 Linux 系统没有太大差别。但是一个比较大的问题就是对中文的支持并不好。在期间试过 cnfonts 插件[1],但是中文仍然显示乱码。

一开始我尝试通过在终端中而不是 GUI 界面使用 Emacs ,发现中文字体已经显示正常了。 Emacs 通过 emacs -nw 指令运行,可以进入非 GUI 的界面。本来到这里应该就能够结束了,但是后来发现部分快捷键在终端模式下失效,搜索一番后发现,原来是终端无法识别部分按键的模式,具体原因可以查看这个回答[2]

如此一来,只能尝试解决 GUI 界面的显示问题。后来经过搜索,发现是 Linux 子系统中无法直接找到 Windows 系统中的字体。 Linux 子系统中的字体可以通过 fc-list 指令查看,我发现其中并没有列举出中文相关字体,这也难怪中文显示会乱码了。

在我的系统中,字体文件存储在 /usr/share/fonts 下,为了导入 Windows 下的字体,我使用下面的指令建立了一个软链接指向 Windows 系统下存放字体文件的文件夹:

cd /usr/share/fonts
ln -s /mnt/c/Windows/Fonts ./windows

之后再使用 fc-cache 命令让系统识别新加入的字体,现在使用 fc-list 再查看字体就能够发现中文字体了。在 GUI 界面中使用 cnfonts 也能正常配置字体了。

但是此时其他问题又困扰了我,在 GUI 界面中,无法调用 Windows 系统的输入法,而 Emacs 系统自己的中文输入法使用体验又非常糟糕。除此之外更重要的问题就是在我每次打开 Emacs 时,编辑界面会不断写入 n 字符,如果我不进行任何操作,便会一直输入,这在编辑文件时非常让人恼火,总不能每次打开 Emacs 还要先删除一遍多出来的这些 n 字符吧。于是我最终在一番折腾之后,还是尝试使用 Windows 原生程序进行配置了。

# Windows 原生程序

相比于 Linux 子系统下的 Emacs 程序, Windows 原生的 Emacs 程序对于中文的支持要好得多,系统的输入法也能够直接调用,这方面的配置可以直接省略。在此之外, Windows 安装一些配置的时候可能会要稍微麻烦一些,因为 Windows 下的 Emacs 程序会在 C:\Users\YourUserName\AppData\Roaming 路径下建立 .emacs.d 文件夹作为配置文件的存放位置。因此这里参考了别人的做法,在其中的 init.el 文件中写入了以下内容让其读取对应路径下的配置:

(setenv "HOME" "D:/Programs/Emacs")
(setenv "PATH" "D:/Programs/Emacs")
;;set the default file path
(setq default-directory "D:/Programs/Emacs")
(load-file "D:/Programs/Emacs/.emacs.d/init.el")

虽然配置的时候麻烦了一些,但是总的来说还算比较方便,也没有快捷键的问题。

# Emacs 配置

在之前的文章中推荐过一个 Emacs 配置[3],但是这个配置对中文的适配并不友好,而且很多东西确实用不到,所以我又搜索了一些其他的配置。下面算是对这个愉快心酸的配置过程的一个记录。

# SpacemacsDoom Emacs

GitHub 上可以搜索的许多人提供的 Emacs 配置,目前最热门的应该是 Spacemacs [4]Doom Emacs [5]。但是这两个配置都比较庞大,添加的内容很多,而且在安装时因为需要从 GitHub 下载内容,经常安装到一半就因为网络问题出错。

尤其是 Doom Emacs ,虽然在 Emacs China 有相关教程帖[6],但是期间也还是会碰到许多问题。

主要的一个问题就是 clone Github 下的 repo 的时候经常无法成功,在配置了以下内容的时候才算是正常安装完成了:

git config --global url.https://github.com.cnpmjs.org/.insteadof https://github.com/

这个是将 github.com 的域名替换成 github.com.cnpmjs.org 的镜像域名,确实在下载的时候速度要快很多。但是在完成安装之后发现 Emacs 无法正常读取 Doom Emacs 的配置,我个人估计应该是路径问题。但是我之前使用 purcell 的配置又是可以的,估计应该是 Doom Emacs 的配置特殊一点。

于是我只能再尝试其他的配置了。

# Centaur Emacs

最终我选择了 Centaur Emacs ,尽管没有 SpacemacsDoom Emacs 那么流行,但是目前也有 1.5k 的 Star,而且作者应该是中国人,对中文的支持也更好。安装非常简单,使用:

git clone --depth 1 https://github.com/seagle0128/.emacs.d.git ~/.emacs.d

repo clone 下来之后即可使用。在第一次启动的时候,会下载安装一些插件,因此会比较慢一些。在安装过程中,可能会报出一些错误,如果是 package 找不到的错误,那么安装即可。我这里记录一些其他的错误,读者也可以参考其他的文章[7]

# 图标及字体下载

Centaur Emacs 使用到了一些图标,因此需要安装相应的字体才能够显示,使用 M-x all-the-icons-install-fonts 能够安装相应的字体。但是这个指令是访问 raw.githubusercontent.com 这个域名进行下载,因此不使用代理就无法顺利下载。尽管我这里有代理,但是依然无法下载成功,虽然我在浏览器中是能够成功使用代理的,不知道是哪里没有配置对。一番搜索之后发现只要在网页中下载,然后将字体安装到系统中即可。其他问题可以参考 GitHub 仓库下的 issue

https://github.com/domtronn/all-the-icons.el [8] 这个 repo 中的 fonts 文件夹下的字体安装好即可顺利显示图标。

不过有个图标还是显示异常,所以最终我还是决定关掉这个图标,在 custom.el 中将 (setq centaur-icon nil) 的注释去掉即可。

经过一番查找,最终发现应该是 Unicode 字符显示异常,在 custom.el 中字体设置相关的语句中,将 (cl-loop for font in '("Symbola" "Apple Color Emoji" "Segoe UI Symbol" "Symbol") 中的字体顺序调整成了现在的这个顺序,默认优先使用 Symbola 字体,现在显示已经正常。

# Dashboard 不显示信息

repo 下的 issue[9] 中找到了相同的问题,解决方法是将 .emacs.d 下的 elpa 文件夹删除,然后重新打开 Emacs 重新安装即可。

# org-mode 显示效果修改

我个人主要使用 Emacsorg-mode ,发现对于字体显示效果,配置会将 *+ 等特殊字体效果的标记符号给隐藏,这和我的习惯不同,在 list\init-org.el 配置文件中修改 org-hide-emphasis-markersnil

尽管如此,汉字斜体无法显示出倾斜的效果,这个应该是因为汉字字体没有真正的斜体字体,而是通过其他方式得到倾斜的效果,而 Emacs 是直接读取倾斜字体来显示倾斜效果的,对于没有倾斜字体的英文字体也无法显示出倾斜效果,因此这里就不折腾中文的显示效果了,可以用下划线或者其他方式体现强调的效果。

# 总结

尽管 Emacs 配置还是花费了很多时间,但也算是有了一些收获,对 Emacs 的配置也稍微有了些了解。在 Doom Emacs 的安装过程中,还发现了 Scoop 这款 Windows 下的包管理器,能够安装 gcc 是确实有些出乎我预料之外的,以后可以试着用 Scoop 来让 Powerline 下的命令和 Linux 终端更趋近一致,这样就不用再因为终端不同而要搜索不同命令了。


  1. cnfonts 插件 ↩︎

  2. 终端下 Emacs 快捷键失效 ↩︎

  3. Emacs 配置推荐 ↩︎

  4. Spacemacs ↩︎

  5. Doom Emacs ↩︎

  6. 零秒精通 Emacs 之 Windows10 上畅行无碍地使用 emacs 的 11 步骤 ↩︎

  7. CentaurEmacs - 一个奇特而快速的 Emacs 配置 ↩︎

  8. All The Icons ↩︎

  9. Doom-modeline not displaying anything except window number ↩︎