关于Emacs更新到26之后的配置更新汇总

更新的Emacs26之后还是给我带来了一些bug问题,浪费点时间调试(主要还是自己不懂),总结下惠及大家,我抛砖引玉了:

  • daemon的启动和emacsclient链接问题,
  • transparent titlebar的加载问题,
  • 新的native line number display。

运行deamon和emacsclient链接问题: 26相比25严格了许多

比如原来25,OSX下可以用tcp:emacs --daemon=main(setq server-use-tcp t)启动,用emacsclient -nc --server-file=main链接;关闭server的话野蛮的直接kill掉,重新再运行上述命令,server依然可以启动。重复运行(不关闭原来的main server)也不会有报错,查看会有多个进程用同样的server名字main。这是我原来默认的方式。

现在不行了,直接kill掉相应daemon的进程,下次运行会报错,因为tcp方式会在~/.emacs.d/server/生成一个名为main的文件(之前例子给的daemon名字)。正常在emacsclient的frame中运行kill-emacs关闭emacs server的话会删掉这个问题。Emacs25不管这些,26会检查报错。同时现在也不能运行多个同server名字的进程了(这个很合理;原来只是不报错)。

查了查发现,其实Linux/Unix下,local socket是更好的方式,(如果还想野蛮的通过kill关daemon进程):

  • emacs --daemon=main (名字main随便给)
  • emacsclient -nc --socket-name=main 用来连接、创建frame

另外,现在daemon有了两个模式,--bg-daemon--fg-daemon,arch linux中的emacs.service文件建议用fg-daemon。另外,Linux想在emacs中用fctix打中文(我很少输中文,可能一直都有这个问题吧,没发现),需要加前缀改LC_CTYPE,但直接
ExecStart=LC_CTYPE=zh_CN.UTF-8 /usr/bin/emacs --fg-daemon systemd语法报错,不懂为什么懒得深究,重新创建一个bash文档把它wrap成一个新命令就行了。

Transparent titlebar的加载问题

(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))这个别卸载你的ui loading函数中(就是daemon下,你需要push到after-make-frame-functions中,用来加载theme,修改modeline,修改字体等的函数),尽量靠前写,不然第一个frame不是透明标题栏,第二个就好了。

根据不同的theme设置用于ns-transparent-titlebar的底色:

1
2
3
(if (eq (frame-parameter frame 'background-mode) 'light)
(add-to-list 'default-frame-alist '(ns-appearance . light))
(add-to-list 'default-frame-alist '(ns-appearance . dark)))

这里有个比较蛋疼的问题我解决不了(daemon模式下):
我运行两个daemon分别使用亮色和暗色的主题,上面那个设置的位置就很纠结了:

  • 首先它得放在load-theme之后,不然我不可能知道主题的background-mode是light还是dark
  • 它又“该”放在load-theme之前,不然第一个frame创建时使用默认的值light(当用dark-theme时)

我暂时折衷用的第一方案,所以emacsclient的第一个frame的titlebar底色设置是不对的(其实只影响标题的字体颜色,背景色是正确的),如果使用dark theme。关了再开一个frame就好了😝

Native line numbering

下面是我用的设置,分享给伸手党们 :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;; config built-in "display-line-number-mode" (require Emacs >= 26)
(setq-default display-line-numbers-width 2)
(setq-default display-line-numbers-type 'relative)
(setq display-line-numbers-current-absolute t)
;; advanced linum style (optional)
(use-package linum-highlight-current-line-number
:config
(setq linum-format 'linum-highlight-current-line-number))
;; enable line numbering (or "linum-mode")
(let ((hook-list '(sh-mode-hook
cmake-mode-hook
matlab-mode-hook
python-mode-hook
c-mode-common-hook
makefile-gmake-mode-hook ; Gnome
makefile-bsdmake-mode-hook ; OS X
ess-mode-hook))) ; R
(dolist (hook-element hook-list)
(add-hook hook-element 'display-line-numbers-mode)))