Margini di scorrimento diversi nella parte superiore e inferiore della finestra?


8

D: c'è un modo per impostare diversi margini di scorrimento nella parte superiore e inferiore di una finestra?

La variabile scroll-margin(definita nel codice sorgente C) imposta il numero di righe di testo che Emacs visualizza almeno nella parte superiore e inferiore di una finestra:

Numero di linee di margine nella parte superiore e inferiore di una finestra. Rientra la finestra ogni volta che il punto rientra in queste tante righe nella parte superiore o inferiore della finestra.

Mi piacerebbe usare scroll-marginper il fondo della finestra, ma non lo voglio in alto (ad esempio, un valore positivo in fondo, ma 0 in alto). c'è un modo per farlo?


Non conosco la risposta, ma con ogni probabilità scroll-marginnon è lo strumento giusto per il lavoro. Potrebbe essere necessario inserire alcune funzioni post-command-hookper determinare se scorrere la finestra.
Harald Hanche-Olsen,

Seguire il mio precedente commento, scoprire quante linee sono visibili intorno al punto sembra altamente non banale, considerando le linee avvolte, il testo nascosto e simili. Sospetto che le informazioni necessarie siano facilmente disponibili solo all'interno del codice visualizzato. Si potrebbe provare a inviare una richiesta di funzionalità per consentire (ad esempio) un cons (top . bottom)per scroll-margin.
Harald Hanche-Olsen,

Potresti essere interessato a giocare con l' window-scroll-functionshook (che accetta due argomenti) e mettere un recentercomando in una funzione collegata a quell'hook e quindi usare un'impostazione di (setq scroll-conservatively 101)- in sostanza, definisci quando si verifica il recente e disattiva l'auto incorporata -scorrere. Qualcosa di simile(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
elenco delle leggi

@lawlist: grazie per il suggerimento, ma la fine del docstring recita "Avvertenza: non utilizzare questa funzione per modificare il modo in cui la finestra viene fatta scorrere. Non è progettata per questo, e probabilmente tale uso probabilmente non funzionerà."
Dan

Domanda interessante, mi chiedo perché non ci siano commenti / voti sulla risposta fornita da PythonNut.
Nome

Risposte:


1

Per me funziona quanto segue:

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

Si noti che questo è teoricamente inefficiente, ma le prestazioni sul mio computer zoppo sembrano inalterate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.