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

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

运行deamonemacsclient连接问题: 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

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

;; 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)))
10 个赞

这个行号好是好,问题就是不能在行号和正文之间加一条线分割开,感觉很别扭 :joy:

线我不知道,但是只是区分开的话可以改face嘛。

很有道理的样子。我试试看。

是很有道理,画条线的话脑补一下觉得挺丑。

我也想改它的背景色,你找到face的名字分享下,谢谢!

line-number line-number-current-line

1 个赞

你这个是什么意思?做什么的?

我查了下,发现既没有以此命名的函数,也没有变量。

行号和当前行行号的face 你可以用customize-face来修改成自己喜欢的样子,和正文部分区分开来

明明是你自己说的找到face分享…绝了

doom-one 配色 用起来还可以

(use-package display-line-numbers
  :init
  (setq display-line-numbers-width 2)
  (setq display-line-numbers-grow-only t)
  (set-face-background 'line-number "#313335")
  (set-face-foreground 'line-number-current-line "#859393")
  (add-hook 'prog-mode-hook #'display-line-numbers-mode)
  (add-hook 'text-mode-hook #'display-line-numbers-mode)
  (add-hook 'web-mode-hook #'display-line-numbers-mode))

1 个赞

哦,是face啊,谢谢!

哈,忘记查face了。。。没反应过来

这个为何不直接写为

(add-to-list 'default-frame-alist '(ns-appearance . (frame-parameter frame 'background-mode)))

第一个frame可以用initial-frame-alist,另外在每次切换theme时建议也要重新设置下。

1 个赞

Good to know display-line-numbers.el

恩,这个看起来优雅多了。我也不知道当时为什么用if分开写了