Margin gulir yang berbeda di bagian atas dan bawah jendela?

8

T: apakah ada cara untuk mengatur margin gulir yang berbeda di bagian atas dan bawah jendela?

Variabel scroll-margin(didefinisikan dalam kode sumber C) menetapkan berapa banyak baris teks yang Emacs tampilkan, minimal, di bagian atas dan bawah jendela:

Jumlah garis margin di bagian atas dan bawah jendela. Masukkan kembali jendela kapan pun titik masuk dalam banyak baris ini di bagian atas atau bawah jendela.

Saya ingin menggunakan scroll-marginuntuk bagian bawah jendela, tetapi tidak ingin itu di bagian atas (misalnya, nilai positif di bagian bawah, tetapi 0 di bagian atas). Apakah ada cara untuk melakukannya?

Dan
sumber
Saya tidak tahu jawabannya, tetapi kemungkinan scroll-marginbukan alat yang tepat untuk pekerjaan itu. Anda mungkin memerlukan beberapa fungsi untuk digunakan post-command-hookuntuk menentukan apakah akan menggulir jendela.
Harald Hanche-Olsen
Untuk menindaklanjuti komentar saya sebelumnya, mencari tahu berapa banyak garis yang terlihat di sekitar titik tampaknya sangat tidak penting, mengingat garis yang dibungkus, teks tersembunyi dan sejenisnya. Saya menduga informasi yang diperlukan mudah tersedia hanya di dalam kode tampilan. Anda dapat mencoba mengirim permintaan fitur untuk mengizinkan (misalnya) kontra (top . bottom)untuk scroll-margin.
Harald Hanche-Olsen
Anda mungkin tertarik bermain-main dengan window-scroll-functionskail (yang mengambil dua argumen) dan menempatkan recenterperintah ke dalam fungsi yang melekat pada kail itu dan kemudian menggunakan pengaturan (setq scroll-conservatively 101)- pada dasarnya, Anda menentukan kapan recentering terjadi dan mematikan built-in auto -kontrol. Sesuatu seperti(when (and (>= (point) (window-end nil t)) (not (pos-visible-in-window-p (point) (get-buffer-window (current-buffer) (selected-frame))))) (recenter))
hukum
@lawlist: terima kasih atas sarannya, tetapi akhir dokumentasi berbunyi "Peringatan: Jangan gunakan fitur ini untuk mengubah cara jendela digulir. Tidak dirancang untuk itu, dan penggunaan seperti itu mungkin tidak akan berhasil."
Dan
Pertanyaan menarik, saya bertanya-tanya mengapa tidak ada komentar / suara pada jawaban yang diberikan oleh PythonNut.
Beri nama

Jawaban:

1

Berikut ini berfungsi untuk saya:

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

Perhatikan bahwa ini secara teoritis tidak efisien, tetapi kinerja pada komputer saya yang lumpuh tampaknya tidak terpengaruh.

PythonNut
sumber