1

我一直在尝试修改vlf,以便当点接近当前批次的边缘时,通常滚动会重新加载文件的其他部分。这么多工作,但我遇到了一个奇怪的问题。

我正在通过这样的建议实施重新加载。

(defadvice scroll-up (after vlf-scroll-up activate)
  "In `vlf-mode', scrolling will reload sections to avoid getting
  near the edge of the block."

  (vlf-force-near-center))

vlf-force-near-center是我编写的一个函数,用于在必要时重新加载文件。它工作正常,message末尾的 a 表示该点位于新批次的中间。但是,在函数完成和显示完成刷新之间的某个时间,该点移动到缓冲区的开头附近,但不是一直移动。它似乎已经到了文件的顶部,然后将该点移到了屏幕的中心。

为了弄清楚发生了什么,我做了(debug-on-entry 'vlf-force-near-center)。逐步执行该功能,它按预期工作。然而,在它完成之后(我曾经c让它运行到完成),点停留在它应该在的地方。

我看了看,post-command-hook两者after-change-functions都是零。

我有一个复杂的 .emacs,但如果我运行 emacs,问题也会出现

emacs -Q --load ~/emacs/vlf.el very-large-file.txt

所以我有两个问题,可以直接和间接地解决我的问题。

  1. 为什么点在移动?
  2. 为什么我通过调试器运行时不会出现问题?
4

2 回答 2

1

在 Emacs 中滚动是一项棘手的工作:Emacs 的重新显示通常会自动滚动(即移动窗口开始)以便将点保持在视图内,因此当运行显式滚动命令时,滚动命令本身有时会发生冲突(这可能会强制点移动以便保持在视图内)以及尝试移动窗口开始而不是移动点的自动滚动。

在调试器下运行通常会通过导致各种中间重新显示来影响此行为,因此“真正的”重新显示(在没有调试的情况下也会发生)最终以不同的方式运行,因为点(和/或窗口开始)已经被一些较早的重新展示所感动。

也许这就是你遇到的问题。

当然,也许不是。没有看到你的代码很难说。

于 2013-05-16T12:53:22.427 回答
1

有一个名为vlfi的新包扩展了 vlf。其中一项功能是批量自动滚动。函数vlfi-next-batch/vlfi-prev-batch显示适当的批处理,然后,与您所做的类似,在滚动文件时使用通知来调用它们。

于 2013-05-16T15:16:22.447 回答