指向命令后移动但不在调试器中移动

时间:2013-05-15 14:29:54

标签: emacs elisp

我一直在尝试修改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表示该点位于新批次的中间。但是,在函数完成和显示完成刷新之间的某个时间点,该点移动到缓冲区的开头附近,但不是一直到位。它似乎已经移到文件的顶部,然后将点移动到屏幕的中心。

为了弄清楚发生了什么,我做了(debug-on-entry 'vlf-force-near-center)。单步执行该功能,它按预期工作。但是,在它完成后(我使用c让它运行完成),该点保持原来的位置。

我查看了post-command-hookafter-change-functions,两者都是零。

我有一个复杂的.emacs,但是如果我按

运行emacs也会出现问题
emacs -Q --load ~/emacs/vlf.el very-large-file.txt

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

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

2 个答案:

答案 0 :(得分:1)

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

在调试器下运行通常会通过导致各种中间重新显示来影响此行为,以便“真实”重新显示(也可能在没有调试的情况下发生的重新显示)最终以不同的方式运行,因为点(和/或窗口启动)已被某些早期的重新播放所感动。

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

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

答案 1 :(得分:1)

有一个名为vlfi的新包扩展了vlf。其中一个功能是自动滚动批次。函数vlfi-next-batch / vlfi-prev-batch显示相应的批处理,然后,与您的操作类似,在滚动文件时使用建议来调用它们。