求助一个utf-8显示问题

Org-mode的标题符号,用了org-bullets做美化,但是有些字体不完全支持utf8的符号,然后在论坛找到大神的解决方案:

  (when (display-graphic-p)
    (dolist (character '(?\x25C9 ?\x25CB ?\x2738 ?\x273F))
  (set-fontset-font nil character "DejaVu Sans Mono"))
    )

现在是这个情况: 如果打开emacs,创建一个org文件,可以正常加载用DejaVu字体显示的utf8符号, 但是,如果是上次关闭emacs的时候是一个org文件,再打开的时候就不会自动加载上面的语句。

求助一下,应该怎样让emacs打开的时候自动加载,而不是在打开org-mode的时候才进行加载。

上面的配置有没有放到 org-mode-hook 中呀?

放到这里了,新建或者打开一个org文件的时候,会起作用。但是不是打开emacs就加载的。

(use-package org-bullets
  :ensure t
  :defer t
  :hook
  (org-mode . org-bullets-mode)
  :config
  (when (display-graphic-p)
    (dolist (character '(?\x25C9 ?\x25CB ?\x2738 ?\x273F))
  (set-fontset-font nil character "DejaVu Sans Mono"))
    )
  ;;  (setq org-bullets-bullet-list '("◉" "⁑" "⁂" "❖" "✮" "✱" "✸"))
  (message "Loading Org-bullets...DONE")
)

粗看起来是因为:config是在加载org-bullets时才会执行的,而配置中声明了 :defer t,做了延迟加载。

你试下去掉 :defer t 看看?

现在是这么个想法: 不想让这个配置在这里边待着了。 怎么写成全局调用这个配置? add-hook,还是with-eval-after-load?

都可以吧,我倾向放在org-mode-hook中来设置。

不是全局设置的话,会有这种情况: 关闭emacs的时候,当前文件是一个org文件,然后再打开emacs,默认就打开上次关闭的文件,他不会加载。

默认就打开上次关闭的文件——这个是怎么设置的?

我刚刚测了下你的配置,应该没问题,在我这里是正常的。上面我说的延迟加载有误,因为如果org-mode正常的话,org-bullets应该也加载了。 所以我感觉是默认打开上次关闭文件时,org-mode实际没有触发。

你可以看下再打开emacs时,默认打开的org文件的major-mode是啥。

这个是用的recentf

无法复现你的问题,可能是其他配置干扰。我这里有个最小配置,你可以试下。

用 emacs --init-directory=<init.el path> 来启动。

;;; -*- lexical-binding: t -*-

(setq package-archives '(("gnu"    . "https://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
                         ("nongnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/nongnu/")
                         ("melpa"  . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))
(package-initialize) ;; You might already have this line

(setq inhibit-splash-screen 1)

(add-to-list 'load-path "/Users/user/test/org-bullets")

(use-package org-bullets
  :defer t
  :hook
  (org-mode . org-bullets-mode)
  :config
  (when (display-graphic-p)
    (dolist (character '(?\x25C9 ?\x25CB ?\x2738 ?\x273F))
      (set-fontset-font nil character "DejaVu Sans Mono"))
    )
  ;;  (setq org-bullets-bullet-list '("◉" "⁑" "⁂" "❖" "✮" "✱" "✸"))
  (message "Loading Org-bullets...DONE")
  )

(use-package org)

(require 'recentf)
(recentf-mode 1)
(recentf-open-most-recent-file 1)

你放在org-bullets 的 use-package 里面,又是延迟加载的,自然就只会在加载 org-bullet 这个 package 时配置才会生效。最简单的,把这段配置从 org-bullet 里面拿出来,直接放在外面就可以。(不知道你这个要达成什么效果,我没有测试)

另外这属于配置的加载顺序问题,不是 utf-8 的显示问题。

显示

这几个符号。 拿出来试了,就是要解决加载顺序问题。 拿出来以后重新启动emacs的时候,不自动加载。

看到你在那个帖子下的问题了,我在这里回你吧,这个代码并不需要和 mode 有关联,你完全可以放在 use-package 之外

此外,对于 org-bullets 来说,应该可以通过 org-bullets-face-name 设置 face

最后再顺便说一下我目前的配置,我现在是在使用 org-superstar,它是有相应的 face 的,所以可以这样设置

(use-package org-superstar
  :defer t
  :hook
  (org-mode . org-bullets-mode)
  :custom-face
  (org-superstar-header-bullet
   ((t (:family "DejaVu Sans"))))
  (org-superstar-item
   ((t (:family "Roboto Mono")))))

他这里延迟加载没问题,因为添加了org-mode的hook,但神奇的是用recentf打开org文件后,org-mode加载了,但没有带上org-bullets加载。

我上面放了个最小配置,在我机器上是可以正常加载的。所以我怀疑是他其他的配置影响了org-bullets的加载,比如实际init.el执行出错中断了什么的。