hl-line-mode Hintergrund ausblenden, wie vermeide ich das?

10

Mit:

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

Aktuelle Zeile durch gelben Hintergrund hervorgehoben, aber wenn Text Hintergrundeigenschaften hat, wird er auch überschrieben (wie Diff-Modus, Regenbogen-Modus).

Ist es möglich, den Hintergrund nur für Teile festzulegen, die keine geeigneten Eigenschaften haben?

UPDATE Ich beginne zu experimentieren, scheint, dass Punktierung nicht mit dem Hintergrund in Konflikt steht:

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

Aber Tupfen beschädigen leider das Aussehen des Textes ...

Gavenkoa
quelle
1
Eine andere Möglichkeit, die Sie in Betracht ziehen könnten, ist eine Entfernungsfunktion, die am hinteren Ende jeder hl-Zeilen-Befehlsschleife platziert wird, sodass eine Suche vom Anfang der aktuellen Zeile bis zum Ende der aktuellen Zeile (oder bis zum Ende von) durchgeführt wird Die aktuelle visuelle Linie (falls zutreffend) und die Überlagerungsfläche der hl-Linie können dann überall dort entfernt werden, wo anderer Text mit einer anderen Hintergrundfarbe vorhanden ist. Sie werden wahrscheinlich nach Hervorhebungen suchen, die durch die Schriftsperre platziert wurden, obwohl Sie möglicherweise auch Hervorhebungen mit anderen Überlagerungen platzieren (z. B. Flyspell-Fehler / Duplikate).
Lawlist
@lawlist Ich interessiere mich für die Implementierung; Können Sie bitte die vollständige Lösung unten hinzufügen?
Kaushal Modi
@kaushalmodi - Ich weiß, wie dies für bestimmte Überlagerungen oder Rohtexte am Punkt gemacht wird, aber nicht für bestimmte Texteigenschaften / Hervorhebungen der Schriftsperre am Punkt. Da ich untersuchen müsste, wie diese beiden letzteren Vorkommen getestet werden können, um diese Frage richtig zu beantworten, habe ich mich stattdessen für einen Kommentar entschieden. Hier ist ein Ausschnitt [aus einer von Drews Bibliotheken ausgeliehen], um auf bestimmte Überlagerungen zu testen: (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

Antworten:

5

Das Problem ist, dass manchmal die Texteigenschaft facezum Hervorheben verwendet wird und hl-line-modeeine Überlagerung verwendet wird. Und Überlagerungen werden immer "über" der faceHervorhebung von Texteigenschaften angezeigt .

diff-modeVerwendet beispielsweise die Texteigenschaft, keine Überlagerung. In solchen Fällen haben Sie kein Glück.

Für die Hervorhebung, die durch eine Überlagerung erzeugt wird, können Sie einfach die Überlagerungspriorität der hl-Linien-Überlagerung verringern: entweder hl-line-overlayoder global-hl-line-overlay, sodass diese Überlagerung "unter" der anderen Überlagerungshervorhebung zu liegen scheint.

Wenn Sie die Bibliothek verwenden hl-line+.el, können Sie mit der Option hl-line-overlay-prioritydie Überlagerungspriorität festlegen. Siehe auch Emacs-Wiki-Seite Aktuelle Zeile markieren . (Das Ändern der Überlagerungspriorität hat jedoch keine Auswirkung, wenn die andere Hervorhebung nicht aus einer Überlagerung stammt.)

Drew
quelle
Danke für die Antwort. Ich
kümmere
Wie greife ich auf diese hl-line-overlayEigenschaft zu? Es erscheint zB nicht in customize-variable.
9000
@ 9000: Wie die Antwort sagt, wenn Sie die Bibliothek verwenden, passen hl-line+.elSie einfach die Option an hl-line-overlay-priority. Andernfalls können Sie dies nicht (außer durch Neudefinition oder Beratung der vorab bereitgestellten Funktionen). Das ist der Punkt, an dem diese Benutzeroption bereitgestellt wird.
Drew
3

Ich beende mit Teillösung - nur am Zeilenende hervorheben:

(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
quelle
2

Stolperte über diese Frage, als versucht wurde, den hl-lineHintergrund nicht zu überschreiben (obwohl es sich in diesem Fall um Einrückungsrichtlinien handelte):

Ich habe mich dazu entschlossen, die Hervorhebungslinie nach dem Einzug zu zeichnen :

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

Ersetzen (+ (line-beginning-position 1) (current-indentation))durch (point)funktioniert auch (beginnend am Cursor).

ideasman42
quelle