更新的Emacs26之后还是给我带来了一些bug问题,浪费点时间调试(主要还是自己不懂),总结下惠及大家,我抛砖引玉了:
运行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不是透明标题栏(不过第二个frame就好了)。
根据不同的theme设置用于ns-transparent-titlebar的底色:
(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
下面是我用的设置,分享给伸手党们
;; 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)))