Margens de rolagem diferentes na parte superior e inferior da janela?

8

P: existe uma maneira de definir margens de rolagem diferentes na parte superior e inferior de uma janela?

A variável scroll-margin(definida no código fonte C) define quantas linhas de texto o Emacs exibe, no mínimo, na parte superior e inferior de uma janela:

Número de linhas de margem na parte superior e inferior de uma janela. Atualize a janela sempre que houver um ponto dentro de muitas linhas da parte superior ou inferior da janela.

Eu gostaria de usar scroll-marginna parte inferior da janela, mas não a quero na parte superior (por exemplo, um valor positivo na parte inferior, mas 0 na parte superior). Tem algum jeito de fazer isso?

Dan
fonte
Não sei a resposta, mas com toda a probabilidade scroll-marginnão é a ferramenta certa para o trabalho. Você pode precisar de alguma função post-command-hookpara determinar se deve rolar a janela.
Harald Hanche-Olsen
Para acompanhar o meu comentário anterior, descobrir quantas linhas são visíveis ao redor do ponto parece altamente não trivial, considerando linhas quebradas, texto oculto e similares. Suspeito que as informações necessárias estejam facilmente disponíveis apenas dentro do código de exibição. Você poderia tentar enviar uma solicitação de recurso para permitir que (por exemplo) um contras (top . bottom)para scroll-margin.
Harald Hanche-Olsen
Você pode estar interessado em brincar com o window-scroll-functionsgancho (que recebe dois argumentos) e colocar um recentercomando em uma função anexada a esse gancho e, em seguida, usar uma configuração de (setq scroll-conservatively 101)- em essência, você define quando ocorre a ocorrência de recentes e desativa o recurso automático incorporado. -rolagem. Algo como(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
lawlist
@lawlist: obrigado pela sugestão, mas o final da documentação diz "Aviso: Não use esse recurso para alterar a maneira como a janela é rolada. Ela não foi projetada para isso e esse uso provavelmente não funcionará".
Dan
Pergunta interessante, estou me perguntando por que não há comentários / votos na resposta fornecida pelo PythonNut.
Name

Respostas:

1

O seguinte funciona para mim:

(defun my-define-scroll-margins (&rest _args)
  (interactive)
  (with-demoted-errors
    (let ((computed-margin
            (if (> (cdr (nth 6 (posn-at-point)))
                  (/ (window-body-height) 2)) 5 0)))
      (setq
        scroll-margin computed-margin
        smooth-scroll-margin computed-margin))))

(add-hook 'post-command-hook #'my-define-scroll-margins)

Observe que isso é teoricamente ineficiente, mas o desempenho no meu computador coxo parece não ser afetado.

PythonNut
fonte