我一直在尝试修改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-hook
和after-change-functions
,两者都是零。
我有一个复杂的.emacs,但是如果我按
运行emacs也会出现问题emacs -Q --load ~/emacs/vlf.el very-large-file.txt
所以我有两个问题,可以直接和间接地解决我的问题。
答案 0 :(得分:1)
在Emacs中滚动是一项棘手的事情:Emacs的重新显示通常会自动滚动(即移动窗口启动)以便在视图中保持点,因此在运行显式滚动命令时,滚动命令本身之间有时会发生冲突(这可能会强制指向移动以便保持在视图中)和自动滚动尝试移动窗口开始而不是移动点。
在调试器下运行通常会通过导致各种中间重新显示来影响此行为,以便“真实”重新显示(也可能在没有调试的情况下发生的重新显示)最终以不同的方式运行,因为点(和/或窗口启动)已被某些早期的重新播放所感动。
也许这就是你遇到的问题。
当然,也许不是。没有看到你的代码就很难分辨。
答案 1 :(得分:1)
有一个名为vlfi的新包扩展了vlf。其中一个功能是自动滚动批次。函数vlfi-next-batch
/ vlfi-prev-batch
显示相应的批处理,然后,与您的操作类似,在滚动文件时使用建议来调用它们。