如何在Emacs中加速自定义模式行面部更改功能

时间:2014-08-03 20:55:19

标签: emacs elisp

以下名为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))) )))

1 个答案:

答案 0 :(得分:2)

动态更改面部会变慢,因为重新显示的代码是在面部不会改变的情况下编写的(如果它们发生了变化,我们基本上会重做批次的工作)。使用face-remapping-alist将获得更好的性能,因为重新显示代码确实希望它能够更改并知道如何缓存结果。