hl-line-mode menyembunyikan latar belakang, bagaimana cara menghindari ini?

10

Dengan:

(when window-system
  (set-face-background 'hl-line "light yellow")
  (global-hl-line-mode 1))

baris saat ini disorot oleh latar belakang kuning, tetapi jika teks memiliki properti latar belakang juga ditimpa (seperti mode-diff, mode pelangi).

Apakah mungkin untuk menetapkan latar belakang hanya untuk bagian yang tidak memiliki properti yang sesuai?

PEMBARUAN Saya mulai bereksperimen, sepertinya stipple tidak bertentangan dengan latar belakang:

(set-face-stipple 'hl-line '(4 4 "\x01\x00\x00\x00"))
(set-face-attribute 'hl-line nil :inherit nil)

Namun sayangnya, kerusakan tampilan teks ...

gavenkoa
sumber
1
Kemungkinan lain yang mungkin ingin Anda pertimbangkan adalah fungsi penghapusan yang ditempatkan di ujung ekor setiap loop perintah hl, sehingga pencarian dilakukan dari awal baris saat ini ke akhir baris saat ini (atau ke akhir baris garis visual saat ini, jika berlaku) dan wajah overlay garis-hl kemudian dapat dihapus dari mana pun teks lain dengan warna latar yang berbeda ada. Anda mungkin akan mencari penyorotan yang ditempatkan oleh font-lock, meskipun Anda mungkin juga telah menyoroti yang ditempatkan dengan overlay lainnya (mis. Kesalahan flyspell / duplikat).
hukum
@lawlist Saya tertarik dengan implementasinya; dapatkah Anda menambahkan solusi lengkap di bawah ini?
Kaushal Modi
@kaushalmodi - Saya tahu cara melakukan ini untuk overlay spesifik atau teks mentah pada titik, tetapi tidak untuk penyorotan properti-teks / font-lock tertentu pada titik tersebut. Karena saya perlu meneliti bagaimana menguji dua kejadian terakhir untuk menjawab pertanyaan ini, saya memilih untuk memberikan komentar. Berikut adalah cuplikan [dipinjam dari salah satu perpustakaan Drew] untuk menguji overlay spesifik di titik: (when (memq NAME-OF-FACE (mapcar (function (lambda (ovr) (overlay-get ovr 'face))) (overlays-at (point)))) (remove-overlays BEGINNING-POINT ENDING-POINT 'face hl-line))
hukum

Jawaban:

5

Masalahnya adalah bahwa terkadang properti teks facedigunakan untuk menyorot, dan hl-line-modemenggunakan overlay. Dan overlay selalu muncul "di atas" facemenyoroti properti teks .

diff-mode, misalnya, menggunakan properti teks, bukan overlay. Jadi untuk kasus seperti ini Anda kurang beruntung.

Tetapi untuk sorotan yang dihasilkan oleh overlay, Anda bisa mengurangi prioritas overlay dari over-line hl: salah satu hl-line-overlayatau global-hl-line-overlay, sehingga overlay tersebut tampak "di bawah" penyorotan overlay lainnya.

Jika Anda menggunakan perpustakaan hl-line+.elmaka Anda dapat menggunakan opsi hl-line-overlay-priorityuntuk mengatur prioritas overlay. Lihat juga halaman Wiki Emacs Sorot Baris Saat Ini . (Tetapi sekali lagi, mengubah prioritas overlay tidak berpengaruh jika sorotan lainnya bukan dari overlay.)

Drew
sumber
Terima kasih atas jawabannya. Saya tidak peduli tentang perbedaan antara wajah dan overlay ... +1
gavenkoa
Bagaimana saya mengakses hl-line-overlayproperti itu? Misalnya tidak muncul di customize-variable.
9000
@ 9000: Seperti jawabannya, jika Anda menggunakan perpustakaan hl-line+.elmaka Anda cukup menyesuaikan opsi hl-line-overlay-priority. Jika tidak, Anda tidak dapat (kecuali dengan mendefinisikan ulang atau menyarankan fungsi yang sudah disiapkan sebelumnya). Itulah gunanya menyediakan opsi pengguna ini.
Drew
3

Saya akhiri dengan solusi parsial - sorot hanya dari ujung baris:

(defun my-hl-line-range-function ()
  (cons (line-end-position) (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

(when window-system
  (require 'hl-line)
  (set-face-attribute 'hl-line nil :inherit nil :background "light yellow")
  (setq global-hl-line-sticky-flag t)
  (global-hl-line-mode 1))
gavenkoa
sumber
2

Tersandung pada pertanyaan ini ketika mencoba untuk tidak membuat hl-linemenimpa latar belakang (meskipun itu panduan lekukan dalam kasus ini):

Saya menyelesaikan ini, yang mulai menggambar garis sorot setelah lekukan:

(defun my-hl-line-range-function ()
  (cons
   (+ (line-beginning-position 1) (current-indentation))
   (line-beginning-position 2)))
(setq hl-line-range-function #'my-hl-line-range-function)

Mengganti (+ (line-beginning-position 1) (current-indentation))dengan (point)bekerja juga, (mulai dari kursor).

gagasanman42
sumber