A resposta do @Gilles é o caminho certo a seguir. Vou manter este aqui para obter informações e hacks.
Eu acredito que o point
movimento é realizado pelas funções C
window_scroll_line_based
e window_scroll_pixel_based
(dependendo dos parâmetros do seu quadro). Essas funções não estão expostas à máquina lisp, portanto você não pode aconselhá-las. Você precisaria aconselhar as funções que os chamam.
Duas das funções (acessíveis pelo Lisp) que podem fazer isso são
scroll-up
e
scroll-down
. Aqui está como eu descobri sobre eles:
- Vá para algum buffer longo.
- Selecione uma pequena região.
- Ligue para
M-x (put-text-property (region-beginning) (region-end) 'point-left (lambda (&rest _) (error "Point leaving")))
. Isso gerará um erro quando o ponto sair da região.
- Ative
M-x toggle-debug-on-error
.
- Verifique se o ponto está dentro desta região.
- Role com a roda do mouse até que o ponto seja arrastado para fora da região.
Você receberá um buffer de backtrace como este, que indica claramente a scroll-down
função.
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)
Eu segui scroll-down
a sua definição C, que me levou a
window_scroll
, o que me levou a essas duas funções acima.
O que você pode fazer
Você pode aconselhar scroll-down/up
com um around
conselho (assim como outras funções que também possam resultar em movimento de pontos). Use este conselho para verificar se a posição de point
mudou e registre a posição antiga. E então faça o que quiser com ele.
Esteja avisado, os conselhos não são muito confiáveis quando se trata de funções C. Algumas funções importantes têm endereços especiais no código compilado em bytes, o que significa que conselhos sobre eles não são chamados quando o código é compilado. Acho que não será o caso aqui, mas achei que você não deveria.