Différentes marges de défilement en haut et en bas de la fenêtre?

8

Q: existe-t-il un moyen de définir différentes marges de défilement en haut et en bas d'une fenêtre?

La variable scroll-margin(définie dans le code source C) définit le nombre de lignes de texte qu'Emacs affiche, au minimum, en haut et en bas d'une fenêtre:

Nombre de lignes de marge en haut et en bas d'une fenêtre. Plus récente la fenêtre chaque fois que le point se trouve dans ces nombreuses lignes du haut ou du bas de la fenêtre.

Je voudrais utiliser scroll-marginpour le bas de la fenêtre, mais je ne veux pas qu'il soit en haut (par exemple, une valeur positive en bas, mais 0 en haut). Existe-t-il un moyen de le faire?

Dan
la source
Je ne connais pas la réponse, mais selon toute vraisemblance, ce scroll-marginn'est pas le bon outil pour le travail. Vous devrez peut-être une fonction à mettre post-command-hookpour déterminer s'il faut faire défiler la fenêtre.
Harald Hanche-Olsen
Pour faire suite à mon commentaire précédent, trouver combien de lignes sont visibles autour du point semble très simple, compte tenu des lignes enveloppées, du texte masqué et autres. Je soupçonne que les informations nécessaires sont facilement disponibles uniquement à l'intérieur du code d'affichage. Vous pouvez essayer de soumettre une demande de fonctionnalité pour autoriser (par exemple) un inconvénient (top . bottom)pour scroll-margin.
Harald Hanche-Olsen
Vous pourriez être intéressé à jouer avec le window-scroll-functionscrochet (qui prend deux arguments) et à mettre une recentercommande dans une fonction attachée à ce crochet, puis à utiliser un paramètre de (setq scroll-conservatively 101)- en substance, vous définissez quand le recentrage se produit et désactivez l'auto intégrée -faire défiler. Quelque chose comme(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
Lawlist
@lawlist: merci pour la suggestion, mais la fin de la docstring indique "Avertissement: n'utilisez pas cette fonctionnalité pour modifier le défilement de la fenêtre. Elle n'est pas conçue pour cela, et une telle utilisation ne fonctionnera probablement pas."
Dan
Question intéressante, je me demande pourquoi il n'y a pas de commentaires / vote sur la réponse fournie par PythonNut.
Nom du

Réponses:

1

Ce qui suit fonctionne pour moi:

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

Notez que cela est théoriquement inefficace, mais les performances sur mon ordinateur boiteux ne semblent pas affectées.

PythonNut
la source