highlight-indent-guides竟然会导致卡?

   2521  50% - redisplay_internal (C function)
    2321  46%  - jit-lock-function
    2321  46%   - jit-lock-fontify-now
    2317  45%    - jit-lock--run-functions
    2317  45%     - #<compiled -0x1554130d5a356240>
    1806  35%      + highlight-indent-guides--guide-region
     502   9%      + font-lock-fontify-region
       5   0%      + goto-address-fontify-region
     176   3%  + eval
      11   0%  + #<compiled 0x8155b5d711d81ee>
       3   0%    undo-tree-update-menu-bar
       1   0%    keymap-canonicalize
       1   0%  + mode-line-default-help-echo
       1   0%    doom-modeline-refresh-bars
       1   0%    page-break-lines--update-display-tables
     775  15% + company-post-command
     674  13% + command-execute
     637  12% + ...
     383   7% + timer-event-handler
      41   0% + #<compiled 0xf63cc21e5bed664>
       2   0% + #<lambda 0x94531f0447>
       1   0% + #<compiled -0x2222a2822fd8b99>
       1   0%   posframe-run-hidehandler
       1   0%   undo-auto--add-boundary
       1   0% + global-flycheck-mode-check-buffers
       1   0%   global-anzu-mode-check-buffers
       1   0% + symbol-overlay-post-command
       1   0% + winner-save-old-configurations

Emacs 28.05 native-comp, macos 11, c-mode,基本是默认配置。而且关闭之后肉眼可见的流畅度提升。是只有我这样还是普遍现象?大家有没有什么替代品可以用?除了highlight-indent,因为真的有点丑。。。

1 个赞

就是因为卡,我关闭了好长时间了

多谢分享这个!

这玩意比lsp-mode还占cpu真的过分了…

确实有性能问题,所以做了一些优化

这东东是不是整个buffer都解析并画线,那对于几百上千行以上的buffer简直是灾难。我发现这种UI图形开销永远是最大的。

比较好的方案应该是针对显示部分画提示线(可以上下预处理个几十行的做备用,用户翻动时也足够了)。

预处理几十行不一定够用,必须往上处理直到缩进的最顶层:

  indent-level-0
      indent-level-1
          indent-elve-2
              ....

  indent-level-0
  .   indent-level-1
  .   .   indent-elve-2
  .   .   .   ....
+-.---.---.-----------------------+
| .   .   .                       |
| .   .   .                       |
| .   .   .                       |   visible area
| .   .   .                       |
| .   .   .                       |
+---------------------------------+

性能问题的终极解决方案我认为还是多线程

以响应用户输入为第一要务。语法着色、画缩进线等装饰性的任务放到较低优先级的工作者线程中慢慢处理。

假如用户连续快速输入,工作者线程应中断当前未完成的任务,改为处理最新的指令。

这样即便电脑性能不好,也能保证流畅使用。也许在快速的操作过程中(例如翻页),有可能短暂出现语法着色和缩进线滞后的情况,但体验仍好过输入卡顿

可惜在单线程的 Emacs 上,一切都是妄想。

2 个赞

我现在是干脆不用这个包了。因为有时候删除一行中的内容时,绘制的线还在,搞的很乱。

弱弱地问问,vim / neovim是不是可以跳过这个坑,设计本身就包含了多线程?

开启 highlight-indent-guides 试了一下,它的确如我猜测,是处理到顶层缩进。验证方法:

  1. 打开任意代码文件,找一个超过一屏的函数或者类,移动光标到其底部。
  2. M-: (highlight-indent-guides-mode 1)
  3. M-: (jit-lock-unregister 'highlight-indent-guides--guide-region)

Screenshot_2021-03-14_at_1.32.48_AM__highlight-indent-guideline-test

2 个赞

是的,是的,我也是同样的问题,所以删了。

一年了, 有没有替代品