@ギレスの答えは正しい方法です。情報とハックのためにこれをここに保管します。
私は信じているpoint
動きがC関数によって実行される
window_scroll_line_based
とwindow_scroll_pixel_based
(自分のフレームパラメータのdependinyg)。これらの関数はlispマシンに公開されていないため、アドバイスすることはできません。それらを呼び出す関数にアドバイスする必要があります。
これを行うことができます(lispのアクセス)機能の二つがある
scroll-up
と
scroll-down
。ここに私がそれらについて知った方法があります:
- 長いバッファに移動します。
- 小さな領域を選択します。
- コール、
M-x (put-text-property (region-beginning) (region-end) 'point-left (lambda (&rest _) (error "Point leaving")))
。これは、ポイントが領域を離れるとエラーをスローします。
- をアクティブにし
M-x toggle-debug-on-error
ます。
- ポイントがこの領域内にあることを確認してください。
- ポイントが領域の外にドラッグされるまで、マウスホイールでスクロールします。
このようなバックトレースバッファーが与えられ、scroll-down
関数を明確に示します。
Debugger entered--Lisp error: (error "Point leaving")
signal(error ("Point leaving"))
error("Point leaving")
(lambda (&rest _) (error "Point leaving"))(1508 1192)
scroll-down(10)
funcall(scroll-down 10)
mwheel-scroll((double-mouse-4 (#<window 50 on *Backtrace*> 1299 (578 . 545) 77086296 nil 1299 (57 . 25) nil (398 . 20) (10 . 21)) 2))
funcall-interactively(mwheel-scroll (double-mouse-4 (#<window 50 on *Backtrace*> 1299 (578 . 545) 77086296 nil 1299 (57 . 25) nil (398 . 20) (10 . 21)) 2))
call-interactively(mwheel-scroll nil nil)
command-execute(mwheel-scroll)
私はscroll-down
Cの定義に従いました。その結果、になり
window_scroll
、上記の2つの関数につながりました。
あなたができること
あなたは助言できるscroll-down/up
とaround
アドバイス(だけでなく、また点移動につながる可能性のある他の機能)。このアドバイスを使用して、ポジションpoint
が変更されたかどうかを確認し、古いポジションを記録します。そして、それであなたがやりたいことを何でもしてください。
C関数に関しては、アドバイスは非常に信頼できません。一部の重要な関数は、バイトコンパイルされたコードで特別なアドレスを持っています。つまり、コードがコンパイルされるときに、関数に関するアドバイスは呼び出されません。ここではそうはならないと思いますが、そうすべきではないと考えました。