Emacs行号性能

6

我尝试过 linumnlinum。在超过100k行的文件上,两者的性能都很差。

$ for x in {1.100000}; do echo $x; done > 100k.txt
$ emacs -q 100k.txt
M-x load-library linum
M-x linum-mode
M-> ;; it's not too bad to go to end of file
M-< ;; now this completely locks up emacs

与像joe这样的编辑器相同的操作是瞬时完成的。
除了在大文件中关闭行号(正是您想要使用行号导航的文件类型——我指的是查找连接的Javascript文件中的错误行),还有其他解决方案吗?
或者只需使用不同的编辑器?

行号显示在模式行中。 - abo-abo
这对我来说在Emacs 24.3.50.1上是瞬间完成的。 - Tyler
@Tyler 对我来说不是瞬间完成的,在 Ubuntu Precise 3.5.0-40-generic 上运行 24.3.1,加载默认配置(正如您所见,我正在使用 -q)。在 rxvt 窗口中运行。 - Barry Kelly
@abo-abo 模式行太大了,扫描光标之间的视觉差距太大了。 - Barry Kelly
我发现Emacs的14259号bug与此相关,该问题于四月份报告。仅仅设置窗口边距就足以触发减速((set-window-margins (selected-window) 2))。 - Barry Kelly
显示剩余5条评论
4个回答

5

我认为你发现了一个bug,你可以报告(report-emacs-bug)。根据Tyler的评论,这个问题可能已经解决了。

在此期间可能有用的一些东西...line-number-mode, goto-line, narrow-to-region和这个便宜的将行号编号的临时缓冲区技巧:

(shell-command-on-region (point-min) (point-max)
    (concat "grep -n ^ " buffer-file-name)
    (get-buffer-create "*tmp-linum*") nil t)

4
据我所知,无论您是否看到它们,linum及其衍生品nlinum都会编号。在100k+行的情况下,如果对单个行进行编号需要超过几毫秒,这可能会很慢。对于我来说(Fedora 19,Emacs 24.3.1),没有明显的延迟。尝试使用仅对当前可见行进行编号的line-num.el,看看是否可以解决问题。

1

从Emacs 26开始,您应该使用[global-]display-line-numbers-mode

例如:

(global-display-line-numbers-mode 1)

或者:

(add-hook 'prog-mode-hook #'display-line-numbers-mode)

(或通过M-x手动切换。)

这些行号是作为C代码中的redisplay的一部分实现的,因此即使在非常大的缓冲区下也很高效且性能良好。


0
将此代码添加到 .emacs 文件中。
(global-linum-mode 1)

该问题认为 linum 太慢了。 - phils
M-x linum-mode的设置和.emacs文件不同。 到目前为止,我一直在CentOS上使用此设置,没有任何问题。 - 이승현
@phils 你提出的方法和我的有什么区别? 我认为在初始化文件中预设它使用起来更有优势。 - 이승현
当然,人们可以将(global-display-line-numbers-mode 1)放在初始化文件中;我没有明确说明,但是假设人们会知道。global-display-line-numbers-modeglobal-linum-mode是两个非常不同的东西。前者更加新,(对于这个问题至关重要的是)非常快(因为它集成到核心redisplay C代码中)。linum-mode没有这些好处,而且速度要慢得多。我给你的答案打了一个反对票的唯一原因是,你的建议已经在问题中被特别提到作为其中一个速度太慢的选项之一。 - phils

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