Bagaimana saya bisa mengisi seluruh baris nomor bar dengan warna latar belakang khusus?

9

Pada tangkapan layar di bawah ini saya cukup mengatur latar belakang linumwajah ke beberapa warna, namun ada daerah kosong di ujung buffer dan ada celah di antara garis ketika pembungkus garis ( global-visual-line-mode) diaktifkan:

Latar belakang emas rusak dengan garis bungkus.

Idealnya seluruh sisi kiri harus dalam warna yang seragam. Apakah ini mungkin? Saya kenal beberapa Elisp, jadi jika memungkinkan, saya mungkin bisa menulis perbaikan sendiri dengan beberapa instruksi.

Lenar Hoyt
sumber
Saya perhatikan ini ketika berpindah tema. Pekerjaan untuk saya adalah kembali ke tema default dan kemudian mengaktifkan kembali tema tertentu. Itu biasanya mengatur ulang warna latar belakang. Mungkin bermanfaat untuk melihat pada pengaturan tema default untuk melihat apakah itu lebih rajin dengan wajah-wajah tertentu yang mungkin memberi petunjuk bagaimana menulis fungsi untuk memperbaikinya.
elarson
Memperbaiki warna "di antara" mungkin layak (saya akan mencobanya). Sayangnya, memperbaiki warna setelah ujung buffer tidak --- tidak ada yang diwarnai.
Malabarba
Bahkan, saya sudah sering melihat ini bertanya-tanya bahwa itu mungkin permintaan fitur yang bermanfaat.
Malabarba
@Malabarba Mengapa tidak mungkin memperluasnya ke area di bawah buffer? Pinggiran melakukan ini juga setelah semua.
Lenar Hoyt
1
@ MCB Saya mengerti sedikit lebih baik apa yang Anda maksud sekarang. Pinggiran memiliki wajah sendiri (yang latar belakangnya melebar ke bagian bawah layar), margin tidak (hanya meminjam wajah default).
Malabarba

Jawaban:

6

Masalah

Masalahnya di sini adalah bahwa tidak ada wajah untuk mengontrol penampilan margin. Anda dapat menampilkan teks dalam margin menggunakan overlay (seperti itulah linum-modecaranya) tetapi, seperti teks apa pun di Emacs, itu dibatasi hingga batas buffer. Jadi Anda tidak dapat memiliki kontrol atas tampilan margin di luar baris terakhir buffer.

Apa yang dapat Anda lakukan, adalah memperbaiki garis-garis yang salah di antara keduanya.

Apa yang harus diletakkan di sana

Variabel ini mengontrol apa yang ingin Anda tampilkan pada garis-garis visual "antara" dua garis logis. Bagian yang penting adalah 'face 'linum, yang memastikan garis-garis ini akan mengikuti penampilan linum-mode. Bagian "-----"ini demonstratif, Anda dapat mengubahnya menjadi spasi atau apa pun yang Anda inginkan.

(defvar endless/margin-display
  `((margin left-margin) ,(propertize "-----" 'face 'linum))
  "String used on the margin.")

Bagaimana cara melakukannya

Kode berikut melewati buffer dan menempatkan overlay (mirip dengan yang linum-modedigunakan) pada setiap baris yang tidak "nyata".

(defvar-local endless/margin-overlays nil
  "List of overlays in current buffer.")

(defun endless/setup-margin-overlays ()
  "Put overlays on each line which is visually wrapped."
  (interactive)
  (let ((ww (- (window-width)
               (if (= 0 (or (cdr fringe-mode) 1)) 1 0)))
        ov)
    (mapc #'delete-overlay endless/margin-overlays)
    (save-excursion
      (goto-char (point-min))
      (while (null (eobp))
        ;; On each logical line
        (forward-line 1)
        (save-excursion
          (forward-char -1)
          ;; Check if it has multiple visual lines.
          (while (>= (current-column) ww)
            (endles/make-overlay-at (point))
            (forward-char (- ww))))))))

(defun endles/make-overlay-at (p)
  "Create a margin overlay at position P."
  (push (make-overlay p (1+ p)) endless/margin-overlays)
  (overlay-put
   (car endless/margin-overlays) 'before-string
   (propertize " "  'display endless/margin-display)))

Dan kami ingin menjalankannya setiap kali linum-modememperbarui nomor baris.

(add-hook 'linum-before-numbering-hook #'endless/setup-margin-overlays)
Malabarba
sumber
Saya baru saja mengujinya org-modedan tampaknya memperkenalkan beberapa kelambatan selama pengguliran dan melewatkan celah tanpa alasan yang jelas dengan bungkus adaptif dihidupkan. Tangkapan layar
Lenar Hoyt
@ mcb Ya, kinerja adalah masalah di sini, tetapi meningkatkan itu akan menjadi masalah yang panjang dan rumit. Sedangkan untuk masalah mode-org, org banyak menggunakan overlay, jadi masuk akal jika ada konflik. Saya tidak mengetahui cara untuk memperbaikinya, tetapi saya akan memikirkannya.
Malabarba
-1

Anda bisa meletakkan ini di konfigurasi Anda:

(set-face-background 'fringe "#f4a460")

... jelas mengubah kode warna ke yang Anda inginkan.

tealeg
sumber
2
Ini akan mengubah warna pinggiran, nomor garis tidak ditampilkan di pinggiran. (coba dan Anda akan melihat perbedaannya)
Malabarba
1
Hal ini juga terlihat pada tangkapan layar dalam pertanyaan: "kolom nomor baris" adalah warna latar belakang yang sama dengan buffer, sedangkan pinggiran adalah area kecil antara kolom nomor baris dan buffer, berwarna abu-abu.
T. Verron
Ya kau benar. Saya menduga Anda harus memperkenalkan overlay baru dalam fungsi functon di kait linum-sebelum-penomoran dan memberikan wajah yang dapat Anda atur.
tealeg