2013-05-15 80 views
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表示該點位於新批次的中間。但是,在函數完成和顯示刷新完成之間的某個時間點,該點將移動到緩衝區的開始附近,但不是全部。它似乎已經到了文件的頂部,然後將點移動到了屏幕的中心。

爲了弄清楚發生了什麼,我做了(debug-on-entry 'vlf-force-near-center)。通過該功能,它按預期工作。但是,在完成之後(我使用c讓它運行完成),該點保持在它應該在的位置。

我看着post-command-hookafter-change-functions,兩者都是零。

我有一個複雜的.emacs,但問題也存在,如果我通過

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

運行的emacs所以我有兩個問題,將給予直接和間接解決我的問題。

  1. 爲什麼這一點是移動?
  2. 爲什麼在運行調試器時不會發生問題?

回答

1

滾動在Emacs是棘手的問題:Emacs中的重新顯示正常滾動(即移動窗口啓動)自動使視野內保持點,因此在運行一個明確的滾動命令時,有時會出現的滾動命令本身之間的衝突(這可能會強制點移動,以保持在視圖中),而自動滾動嘗試移動窗口啓動而不是移動點。

在調試器下運行通常會通過導致各種中間重新顯示,以便「真實」重新顯示(不會發生調試的情況下也會發生的重新顯示)最終以不同方式運行,因爲point(和/或window-start )已經被一些較早的重新顯示所移動。

也許這是你遇到的問題。

當然,也許不是。沒有看到你的代碼很難說。

1

有一個名爲vlfi的新軟件包,它擴展了vlf。其中一項功能是自動滾動批次。功能vlfi-next-batch/vlfi-prev-batch顯示適當的批次,然後,類似於您所做的,在滾動文件時使用通知來調用它們。