覆盖层使emacs变得非常缓慢

5

我使用hide-show折叠文本的特定部分,并使用下面的代码来显示隐藏行数。

然而,当文件够大时(如C++ 或 LaTeX),并且折叠所有区域(从而创建数十个覆盖层),Emacs 变得非常缓慢,以至于无法使用。甚至将标记从一行移动到另一行也需要大约半秒钟左右。

有没有办法解决这个问题?

(defun display-code-line-counts (ov)
    (overlay-put ov 'display
                 (format "...%d..."
                         (count-lines (overlay-start ov)
                                      (overlay-end ov))
                         ))
    (overlay-put ov 'face '(:foreground "red" :box (:line-width 1 :style none)))
  )

(setq hs-set-up-overlay 'display-code-line-counts)

编辑:原来emacs变得很慢的原因是由于linum小模式,它会创建成千上万个(隐藏的)叠加层,并使用hide-show进行折叠。有没有方法可以解决这个问题?或者有更好的行号模式吗?


你尝试过对代码进行性能分析吗? - NickD
谢谢。我做了那个,并且我认为我找到了主要的问题所在。请看一下我的修改。 - Tohiko
1
与 http://emacs.stackexchange.com/q/30563 进行交叉引用。 - phils
1个回答

3
正如你在标题中所说,叠加层可能会使Emacs变慢。
你可以做的一件事是,重新定位当前光标位置(point)周围的叠加层集合,这有时可以帮助缓解问题。你可以使用函数overlay-recenter来实现。
正如Elisp手册中的节点Managing Overlays所述:

此函数将当前缓冲区的叠加层重新定位到位置POS周围。这使得在靠近POS的位置查找叠加层更快,但在远离POS的位置查找叠加层会更慢。

如果你首先执行(overlay-recenter (point-max)),那么扫描向前创建叠加层的循环可以运行得更快。


谢谢。使用overlay-recenter确实加快了速度,但并没有显著的改善。我不明白的是,为什么我展示的代码会导致Emacs变慢,但是如果没有它(即使用hide-show的原始叠加层),Emacs仍然足够响应。 - Tohiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接