以下名为my-modeline-face-function
的函数会导致Emacs暂停大约一半到一整秒,我正在寻找一些建议请大大提高速度。
看起来并不多,但是这个功能使用了很多。例如,每次我启用多光标模式(也称为mc-mode)时,我都会在开始工作之前弄乱我的拇指 - 退出多光标模式时会发生同样的事情。
在函数的尾端添加(redisplay t)
无助于提高速度。
在此功能后使用(force-mode-line-update)
不会提高速度。
(defun my-modeline-face-function ()
(cond
((minibufferp)
(set-face-attribute 'mode-line nil :height 140 :foreground "gray70"
:background "black" :box '(:line-width 1 :color "black"))
(set-face-attribute 'minibuffer-prompt nil :background "black"
:foreground "cyan" :bold t)
(set (make-local-variable 'face-remapping-alist)
'((default :background "black" :foreground "yellow"))))
(save-as-variable
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "#eab700" :box nil))
(insert-variable
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "orange" :box nil))
((or multi-extract-variable multi-attach-variable)
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "magenta" :box nil))
(open-with-variable
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "ForestGreen" :box nil))
(mc-mode
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "cyan" :box nil))
(isearch-mode
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "yellow" :box nil))
((eq major-mode 'lawlist-calculator-mode)
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "firebrick" :box nil))
(t
(set-face-attribute 'mode-line nil :height 140
:foreground "black" :background "gray70" :box nil)
(set-face-attribute 'minibuffer-prompt nil
:background "black" :foreground "white"))) )
编辑(2014年8月5日):
●使用measure-time
宏(即http://lists.gnu.org/archive/html/help-gnu-emacs/2008-06/msg00087.html),我确认internal-set-lisp-face-attribute
内函数set-face-attribute
的运行时间仅在几分之一秒内发生。但是,我需要一整秒才能看到视觉效果。无论是函数的初始调用还是同一缓冲区内的后续调用,都是如此。
●对于缓冲区中face-remapping-alist
的第一次调用,视觉效果需要一整秒才能让我看到。但是,在同一缓冲区内使用face-remapping-alist
的后续调用发生在秒的几分之一内。我无法消除第一次通话后看到视觉效果所需的时间。这可能与它获得的一样好 - 即,第一次呼叫最多一秒,以及同一缓冲区内后续呼叫的光速。
(defun my-modeline-face-function ()
(cond
((minibufferp)
(set 'face-remapping-alist '(
(mode-line modeline-inactive-face)
(minibuffer-prompt minibuffer-prompt-active-face))) )
(save-as-variable
(set 'face-remapping-alist '((mode-line save-as-modeline-face))))
(insert-variable
(set 'face-remapping-alist '((mode-line insert-modeline-face))))
((or multi-extract-variable multi-attach-variable)
(set 'face-remapping-alist '((mode-line multi-attach-extract-modeline-face))))
(open-with-variable
(set 'face-remapping-alist '((mode-line open-with-modeline-face))))
(mc-mode
(set 'face-remapping-alist '((mode-line mc-modeline-face))))
(isearch-mode
(set 'face-remapping-alist '((mode-line isearch-modeline-face))))
((eq major-mode 'lawlist-calculator-mode)
(set 'face-remapping-alist '((mode-line lawlist-calculator-modeline-face))))
(t
(set 'face-remapping-alist '(
(mode-line modeline-active-face)
(minibuffer-prompt minibuffer-prompt-inactive-face))) )))
答案 0 :(得分:2)
动态更改面部会变慢,因为重新显示的代码是在面部不会改变的情况下编写的(如果它们发生了变化,我们基本上会重做批次的工作)。使用face-remapping-alist
将获得更好的性能,因为重新显示代码确实希望它能够更改并知道如何缓存结果。