如何修改 initial-scratch-message 的 face 属性?

我希望有一个漂亮的 *scratch* message, 所以有如下 .emacs:

(setq initial-scratch-message #(";;     *
;;      May the Code be with You!
;;     .                                 .
;;                               *
;;          /\\/|_      __/\\\\
;;         /    -\\    /-   ~\\  .              \\='
;;         \\    = Y =T_ =   /
;;          )==*(\\=`     \\=`) ~ \\
;;         /     \\     /     \\
;;         |     |     ) ~   (
;;        /       \\   /     ~ \\
;;        \\       /   \\~     ~/
;; _/\\_/\\_/\\__  _/_/\\_/\\__~__/_/\\_/\\_/\\_/\\_/\\_
;; |  |  |  | ) ) |  |  | ((  |  |  |  |  |  |
;; |  |  |  |( (  |  |  |  \\\\ |  |  |  |  |  |
;; |  |  |  | )_) |  |  |  |))|  |  |  |  |  |
;; |  |  |  |  |  |  |  |  (/ |  |  |  |  |  |
;; |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
\n"
                                0 671 (face (:foreground "green"))))

但是我发现我设置的 (:foreground "green") 好像没有效果 (即使有效果, 好像也会被 face for comments 给覆盖掉)…

请问这个问题有什么解决方案吗?

propertize试试。例如 (propertize "foobar" 'face 'error),另外elisp里面没有#(...)这种写法吧,只有#'function-name这种而且和'function-name没实际区别。

还有一个可能的原因是major-mode的font-lock把你设置的face覆盖了,试试(setq initial-major-mode 'fundamental-mode)

有的, 看 manual.

试过 #("..." (font-lock-face (:foreground "green"))) 了, 没啥用.

直接把 major mode 改了有点激进啊 …

我这里没问题

(setq initial-scratch-message
      (propertize
";;     *
;;      May the Code be with You!
;;     .                                 .
;;                               *
;;          /\\/|_      __/\\\\
;;         /    -\\    /-   ~\\  .              \\='
;;         \\    = Y =T_ =   /
;;          )==*(\\=`     \\=`) ~ \\
;;         /     \\     /     \\
;;         |     |     ) ~   (
;;        /       \\   /     ~ \\
;;        \\       /   \\~     ~/
;; _/\\_/\\_/\\__  _/_/\\_/\\__~__/_/\\_/\\_/\\_/\\_/\\_
;; |  |  |  | ) ) |  |  | ((  |  |  |  |  |  |
;; |  |  |  |( (  |  |  |  \\\\ |  |  |  |  |  |
;; |  |  |  | )_) |  |  |  |))|  |  |  |  |  |
;; |  |  |  |  |  |  |  |  (/ |  |  |  |  |  |
;; |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
\n" 'face '(:foreground "green")))

学到了

改成fundermental-mode还能启动快点,不改的话,只能用put-text-property在打开scratch buffer之后处理了,scratch buffer没有专门的hook,只能找个合适的函数advice一下,更麻烦。。。

fundamental-mode 肯定没问题啊. 问题是之后还要不要用 lisp-interaction-mode 提供的各种语法高亮及其它功能了? 当然这不是重点, 重点是这么做只是把问题扔在一边, 并没有实际解决它.

谢谢, 我试一下.

试了, 没成功.

你把函数加到 *scratch* 的模式的 hook 里就行了, 检查 buffer 名就行. 只要 buffer 名是 "*scratch*", 就是所谓的那个 *scratch* buffer.

https://www.emacswiki.org/emacs/HighlightLibrary#InteractionWithFontLock

随手查的,下次自己先搜索

如果只是给scratch buffer加高亮的话;使用fontlock-add-keyword函数,然后把它加到 emacs-startup-hook这个钩子里,这样emacs打开scratch buffer以后,就会给scratch buffer做高亮了

你这个要用 font-lock+.el, 文件里写最多支持到 v26. 我有空再去问下 Drew 他还打不打算维护这个库了…

谢谢, 我对 font-lock 不咋了解, 第一次知道这个函数. 我看了下这玩意好像是靠 regexp 过滤要高亮的部分的, 那我得把我的 initial-scratch-message 里的特殊字符全转义了, 我明天试一下.

另外好像在 buffer 中编辑那段 initial-scratch-message 之后, 就匹配不了 regexp, 高亮就没了. 或许我应该重新定义一个简洁一点的高亮规则, 这样即使编辑 initial-scratch-message 的部分内容也不会失去高亮, 但过于简洁又会对日常使用产生微妙的影响…