¿Diferentes márgenes de desplazamiento en la parte superior e inferior de la ventana?

8

P: ¿hay alguna manera de establecer diferentes márgenes de desplazamiento en la parte superior e inferior de una ventana?

La variable scroll-margin(definida en el código fuente C) establece cuántas líneas de texto muestra Emacs, como mínimo, en la parte superior e inferior de una ventana:

Número de líneas de margen en la parte superior e inferior de una ventana. Vuelva a colocar la ventana cuando el punto se encuentre dentro de estas líneas de la parte superior o inferior de la ventana.

Me gustaría usarlo scroll-marginpara la parte inferior de la ventana, pero no lo quiero en la parte superior (por ejemplo, un valor positivo en la parte inferior, pero 0 en la parte superior). ¿Hay una manera de hacerlo?

Dan
fuente
No sé la respuesta, pero con toda probabilidad scroll-marginno es la herramienta adecuada para el trabajo. Es posible que necesite alguna función post-command-hookpara determinar si se desplaza la ventana.
Harald Hanche-Olsen
Para seguir mi comentario anterior, descubrir cuántas líneas son visibles alrededor del punto parece muy poco trivial, teniendo en cuenta las líneas ajustadas, el texto oculto y similares. Sospecho que la información necesaria está fácilmente disponible solo dentro del código de visualización. Usted podría intentar enviar una solicitud de función para permitir que (por ejemplo) una cons (top . bottom)para scroll-margin.
Harald Hanche-Olsen
Es posible que le interese jugar con el window-scroll-functionsgancho (que toma dos argumentos) y poner un recentercomando en una función adjunta a ese gancho y luego usar una configuración de (setq scroll-conservatively 101)- en esencia, usted define cuándo ocurre la reenfoque y apaga el auto incorporado -Desplazarse. Algo así como(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
abogados el
@lawlist: gracias por la sugerencia, pero el final de la cadena de documentación dice "Advertencia: no use esta función para alterar la forma en que se desplaza la ventana. No está diseñada para eso, y tal uso probablemente no funcionará".
Dan
Pregunta interesante, me pregunto por qué no hay comentarios / votaciones sobre la respuesta proporcionada por PythonNut.
Nombre

Respuestas:

1

Lo siguiente funciona para mí:

(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)

Tenga en cuenta que esto es teóricamente ineficiente, pero el rendimiento en mi computadora no parece afectado.

PythonNut
fuente