Windows 10 下 line-number-at-pos 函数造成卡顿

不确定这个问题是否是在折磨自己和大家 :sweat_smile:

我是Windows 10系统,使用gnu emacs上下载的26.3版本的emacs压缩包解压出来的版本。安装了spacemacs develop分支。

在使用emacs进行编码时,经常发现操作卡顿不流畅,有时候阻塞数秒甚至十数秒。

通过profiler-startprofiler-report查看,主要是line-number-at-pos这个函数占用了CPU,而lsp-mode又大量使用了这个函数,不知道是否有什么解决思路?

是英文卡还是中文卡?

这个文件是c文件,但是文件内部存在gb2312编码的中文注释。

卡的时候可能是在编写代码(删写英文)或在evil模式下浏览代码触发一些lsp-mode的函数,比如symbol highlight之类的

btw,这个文件比较大,有1万多行。。。

一万行的c代码需要考虑分开文件了

公司的陈年老代码,你懂的。。。

Emacs27有这个问题没?

用函数 (format-mode-line “%l”) 替换,性能会提高很多

请问是直接替换调用的代码吗?目前我找到的很多调用地方都是如lsp-mode.el这种现有的包,请问有没有类似重定向的方式在不修改现有包的情况下实现您说的这个替换?

没使用过emacs27,不是很清楚,目前应该也是只在windows平台遇到这种问题了

可以写一个 advice ,不知道有没有副作用。

多种尝试未果,还是再问一下具体写法。

我在dotspacemacs/user-config中增加了如下一段:

  (defun my-line-num (&optional pos absolute)
    (format-mode-line "%l")
    )
  (advice-add 'line-number-at-pos :override #'my-line-num)

启动时message会报错:forward-line: Wrong type argument: number-or-marker-p, "2"

请问应该如何调整?

(string-to-number (format-mode-line "%l"))

format-mode-line 还是有些限制的,可以看 这儿 的第一个回答。前两天查别的问题时正好查到这个。

1 个赞

感谢各位的帮助,最后在dotspacemacs/user-config中增加了下面一段,性能明显有提升。

  (advice-add
   'line-number-at-pos
   :override
   (lambda (&rest r)
     (string-to-number (format-mode-line "%l"))
     )
   )

14楼引用的连接为本问题提供了几种额外思路,可以扩展着看下

终极方案,换到vim,就不卡顿了。我就是这么干的

如果性能瓶颈在“count-lines”,好像“line-number-at-pos”可以改成这样:

(with-eval-after-load 'simple
  (define-advice line-number-at-pos (:override (&optional pos absolute) fixing)
    (save-restriction
      (when absolute (widen))
      (save-excursion
        (goto-char (or pos (point)))
        (string-to-number
         ;; avoid "??" in `(format-mode-line "%l")'
         (let ((line-number-display-limit-width 2000000))
           (format-mode-line "%l")))))
    )
  ;; (advice-remove 'line-number-at-pos #'line-number-at-pos@fixing)
  )