Tryb hl-line ukryj tło, jak tego uniknąć?

10

Z:

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

bieżąca linia jest podświetlona na żółtym tle, ale jeśli tekst ma właściwości tła, jest również nadpisywany (np. tryb różnicowy, tryb tęczowy).

Czy można ustawić tło tylko dla części, które nie mają odpowiednich właściwości?

AKTUALIZACJA Zaczynam eksperymentować, wydaje się, że punktowanie nie koliduje z tłem:

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

Ale punktowanie niestety uszkadza wygląd tekstu ...

gavenkoa
źródło
1
Inną możliwością, którą warto rozważyć, jest funkcja usuwania umieszczona na końcu każdej pętli poleceń wiersza hl, dzięki czemu wyszukiwanie jest przeprowadzane od początku bieżącego wiersza do końca bieżącego wiersza (lub do końca bieżącego wiersza bieżąca linia wizualna, jeśli dotyczy) i powierzchnia nakładki linii hl mogą być następnie usunięte z dowolnego miejsca, w którym istnieje inny tekst o innym kolorze tła. Prawdopodobnie będziesz szukał wyróżnienia umieszczonego przez blokadę czcionek, chociaż możesz również wyróżnić umieszczone z innymi nakładkami (np. Błędy / duplikaty pisowni).
prawnik
@lawlist Jestem zainteresowany jego wdrożeniem; czy możesz dodać pełne rozwiązanie poniżej?
Kaushal Modi
@kaushalmodi - Wiem, jak to zrobić dla określonych nakładek lub nieprzetworzonego tekstu w punkcie, ale nie dla określonych właściwości tekstu / podświetlenia blokady czcionki w punkcie. Ponieważ musiałbym zbadać, jak przetestować te dwa ostatnie wystąpienia, aby poprawnie odpowiedzieć na to pytanie, postanowiłem zamiast tego skomentować. Oto fragment [wypożyczony z jednej z bibliotek Drew] w celu przetestowania określonych nakładek w punkcie: (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))
lawlist

Odpowiedzi:

5

Problem polega na tym, że czasami właściwość text facejest używana do podświetlania i hl-line-modeużywa nakładki. A nakładki zawsze pojawiają się „na górze” facepodświetlenia właściwości tekstu .

diff-mode, na przykład używa właściwości text, a nie nakładki. Więc w takich przypadkach nie masz szczęścia.

Ale w celu wyróżnienia, które powstaje w wyniku nakładki, można po prostu zmniejszyć priorytet nakładki w nakładce linii hl: albo hl-line-overlayalbo global-hl-line-overlay, aby nakładka wyglądała „poniżej” drugiego podświetlenia nakładki.

Jeśli korzystasz z biblioteki hl-line+.el, możesz użyć opcji, hl-line-overlay-priorityaby ustawić priorytet nakładki. Zobacz także stronę Emacs Wiki Podkreśl bieżącą linię . (Ale znowu zmiana priorytetu nakładki nie ma żadnego efektu, jeśli inne wyróżnienie nie pochodzi z nakładki).

Rysował
źródło
Dziękuję za odpowiedź. Nie przejmuję się różnicą między twarzami a nakładkami ... +1
gavenkoa
Jak uzyskać dostęp do tej hl-line-overlaywłaściwości? Np. Nie pojawia się w customize-variable.
9000
@ 9000: Jak mówi odpowiedź, jeśli korzystasz z biblioteki, hl-line+.elpo prostu dostosuj opcję hl-line-overlay-priority. W przeciwnym razie nie będzie można tego zrobić (chyba, że ​​przedefiniuje lub doradzi wstępnie skonfigurowane funkcje). To jest punkt zapewnienia tej opcji użytkownika.
Drew
3

Kończę rozwiązaniem częściowym - zaznacz tylko od końca wiersza:

(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
źródło
2

Natknąłem się na to pytanie, próbując nie hl-linezastępować tła (chociaż w tym przypadku były to wskazówki wcięcia):

Postawiłem na to, co zaczyna rysować linię podświetlenia po wcięciu:

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

Wymiana (+ (line-beginning-position 1) (current-indentation))z (point)prac też, (począwszy od kursora).

ideasman42
źródło