Inspirado por esta pergunta: Deixe o Emacs mover o cursor para fora da tela , estou pensando em escrever um modo secundário que manterá o cursor em uma posição fixa que não seja afetada pelas operações de rolagem. Tenho algumas idéias de como implementar isso, mas seria necessário um gancho para me informar quando o cursor está sendo "empurrado" para fora da tela.
Em algum lugar dentro das entranhas do Emacs, existe um código chamado quando a localização de point
é removida da tela. Embora tenha sido dito que o código que controla esse comportamento vive profundamente com o código-fonte C, eu gostaria de saber se há alguma maneira de ser notificado quando estiver prestes a acontecer.
Existe alguma maneira de ser notificado quando um comando de rolagem estiver prestes a mover o cursor? Ou pelo menos, existe uma maneira de eu ser notificado quando a tela estiver prestes a ser rolada?
Atualização: não estou mais planejando escrever um modo menor para conseguir isso, porque um novo pacote foi lançado no GNU ELPA chamado scroll-restore
que fornece exatamente os recursos que eu estava pensando em me implementar!
(window-start)
com rolagem horizontal? (observe quewindow-hscroll
não realiza o trabalho quando a fonte no buffer é diferente da fonte padrão).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 Cwindow_scroll_line_based
ewindow_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
escroll-down
. Aqui está como eu descobri sobre eles: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.M-x toggle-debug-on-error
.Você receberá um buffer de backtrace como este, que indica claramente a
scroll-down
função.Eu segui
scroll-down
a sua definição C, que me levou awindow_scroll
, o que me levou a essas duas funções acima.O que você pode fazer
Você pode aconselhar
scroll-down/up
com umaround
conselho (assim como outras funções que também possam resultar em movimento de pontos). Use este conselho para verificar se a posição depoint
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.
fonte
scroll-down
escroll-up
seria útil aqui. Existem muitas outras maneiras pelas quais a rolagem pode acontecer. Pelo menos todos os comandos que possuem aisearch-scroll
propriedade devem ser considerados comandos de rolagem.