Unterschiedliche Bildlaufränder oben und unten im Fenster?

8

F: Gibt es eine Möglichkeit, am oberen und unteren Rand eines Fensters unterschiedliche Bildlaufränder festzulegen?

Die Variable scroll-margin(im C-Quellcode definiert) legt fest, wie viele Textzeilen Emacs mindestens oben und unten in einem Fenster anzeigt:

Anzahl der Randlinien am oberen und unteren Rand eines Fensters. Zentrieren Sie das Fenster neu, wenn der Punkt innerhalb dieser vielen Zeilen oben oder unten im Fenster liegt.

Ich möchte es scroll-marginfür den unteren Rand des Fensters verwenden, möchte es aber nicht oben (z. B. einen positiven Wert unten, aber 0 oben). Gibt es eine Möglichkeit dazu?

Dan
quelle
Ich kenne die Antwort nicht, aber höchstwahrscheinlich scroll-marginist sie nicht das richtige Werkzeug für den Job. Möglicherweise müssen Sie eine Funktion aktivieren, um post-command-hookzu bestimmen, ob das Fenster gescrollt werden soll.
Harald Hanche-Olsen
Um meinem vorherigen Kommentar nachzugehen, erscheint es angesichts trivialer Linien, versteckter Texte und dergleichen höchst trivial, herauszufinden, wie viele Linien um den Punkt herum sichtbar sind. Ich vermute, dass die erforderlichen Informationen nur innerhalb des Anzeigecodes leicht verfügbar sind. Sie können versuchen, eine Funktionsanforderung zu senden, um (zum Beispiel) Nachteile (top . bottom)für zuzulassen scroll-margin.
Harald Hanche-Olsen
Möglicherweise möchten Sie mit dem window-scroll-functionsHook spielen (für den zwei Argumente erforderlich sind ) und einen recenterBefehl in eine an diesen Hook angehängte Funktion (setq scroll-conservatively 101)einfügen. Anschließend verwenden Sie die Einstellung - im Wesentlichen definieren Sie, wann eine erneute Zentrierung erfolgt, und deaktivieren das integrierte Auto -scrollen. So etwas wie(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
Lawlist
@lawlist: Danke für den Vorschlag, aber am Ende der Dokumentzeichenfolge steht "Warnung: Verwenden Sie diese Funktion nicht, um die Art und Weise zu ändern, in der das Fenster gescrollt wird. Sie ist nicht dafür ausgelegt, und eine solche Verwendung wird wahrscheinlich nicht funktionieren."
Dan
Interessante Frage, ich frage mich, warum es keine Kommentare / Stimmen zu der Antwort von PythonNut gibt.
Name

Antworten:

1

Folgendes funktioniert für mich:

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

Beachten Sie, dass dies theoretisch ineffizient ist, die Leistung auf meinem lahmen Computer jedoch nicht beeinträchtigt zu sein scheint.

PythonNut
quelle