【问题标题】:Remove all fontlock faces (except flyspell-incorrect flyspell-duplicate)删除所有 fontlock 面(除了 flyspell-incorrect flyspell-duplicate)
【发布时间】:2014-05-20 00:08:11
【问题描述】:

为了从使用 2 秒空闲计时器(自定义函数梳理缓冲区)设置的自定义函数的运行时间减少大约 .3 秒,我使用 (font-lock-mode -1) 禁用字体锁定模式。副作用是我的flyspell-incorrectflyspell-duplicate 被删除。用(flyspell-region (window-start) (window-end)) 重新放回那些flyspell 字体的成本远远超过 .3 秒。因此,我正在考虑通过删除所有字体锁定字体 except flyspell-incorrectflyspell-duplicate 来采取中间立场。有没有办法从font-core 向以下代码 sn-p 添加一个条件,以保留 flyspell 字体,但删除其他所有内容?

;; Turn off Font Lock mode.

(unless mode
  ;; Remove `font-lock-face' as an alias for the `face' property.
  (set (make-local-variable 'char-property-alias-alist)
 (copy-tree char-property-alias-alist))
  (let ((elt (assq 'face char-property-alias-alist)))
    (when elt
(setcdr elt (remq 'font-lock-face (cdr elt)))
(when (null (cdr elt))
  (setq char-property-alias-alist
  (delq elt char-property-alias-alist))))))

【问题讨论】:

    标签: emacs elisp font-lock


    【解决方案1】:

    (font-lock-mode -1) 不会删除 flyspell-incorrect 和 flyspell-duplicate 的东西。它只是禁用了它们的视觉效果(使用您发布的代码)。所以你可以在之后重新设置char-property-alias-alist,那些flyspell的东西会“立即”再次显示出来。

    我确实想知道你在做什么,字体锁定会减慢 0.3 秒。也许有另一种方法可以避免这 0.3 秒而不是 (font-lock-mode -1),因为启用/禁用字体锁定非常昂贵。

    【讨论】:

    • 我有一个垂直线荧光笔的工作草稿,它跟踪我在visual-line-mode 中的光标位置。它在window-startwindow-end 之间通过缓冲区两 (2) 次。第一次通过re-search-backward "\n" . . . 第二次通过vertical-motion -1。第一次通过在所有行尾(例如,硬回车)以及每个 first 行(直到窗口结束)上放置叠加层。第二遍根据visual-line-mode 布局在自动换行区域上放置叠加层。运行时间是tex-mode 缓冲区中使用 font-lock-mode 的 两倍
    • 我通过在每个re-search-backward 和每个vertical-motion -1 开始时只执行一次计算来显着改进运行时。今天早上,我使用改进的代码运行了一个新测试,并验证了在启用font-lock-mode 的情况下运行时间仍然是double。然而,不可否认,运行时间现在比.3 少得多——我将它缩小到大约.08.12(font-lock-mode -1)。对于(font-lock-mode 1),运行时间是double——即.16.24。我使用AUCTeX。我使用 tex-mode.el 和一些添加的关键字。
    • 如何添加视觉效果?如果您通过修改缓冲区(例如 put-text-property)来做到这一点,那么确实 font-lock 会减慢它,除非您使用with-silent-modifications
    • 我今天发现使用remove-overlays 有一个名称,但是没有一个特定的name,具有删除 ALL 覆盖的效果。这就是我的flyspell标记被删除的根本原因。出于某种原因,我错误地认为 flyspell 是字体锁定 - 相反,flyspell 使用覆盖。我所有的垂直线视觉效果都是用(overlay-put (make-overlay (point) (point)) 'after-string value)创建的;或使用点和点+ 1 和'display variable-character;或使用'face variable-face;或'invisible t.
    【解决方案2】:

    令我惊讶的是,flyspell 使用 overlaysnot 字体锁定。我的问题发生是因为我不正确地使用了remove-overlays,没有包含一个存在的精确值。 remove-overlays 的不当使用会删除该地区的整个小猫卡布多 - 包括 flyspell 覆盖。以下相关线程描述了如何通过确保在使用 remove-overlays 时始终包含正确的值(如果存在值)来避免此问题:

    https://stackoverflow.com/a/23773934/2112489

    这是一个有用的小功能,可以查看幕后发生的事情:

    (defun reveal-overlays (&optional beg end)
    (interactive)
      (let* (
          (beg (if beg beg (window-start)))
          (end (if end end (window-end))))
        (overlay-recenter end)
        (dolist (o (overlays-in beg end))
          (when o
            (message "%s\n%s\n" (overlay-properties o) o)))
        (switch-to-buffer "*Messages*")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多