hl-line-mode nascondi sfondo, come evitarlo?


10

Con:

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

riga corrente evidenziata da sfondo giallo, ma se il testo ha proprietà di sfondo viene sovrascritto (come diff-mode, rainbow-mode).

È possibile impostare lo sfondo solo per le parti che non hanno proprietà appropriate?

AGGIORNAMENTO Ho iniziato a sperimentare, sembra che la punteggiatura non sia in conflitto con lo sfondo:

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

Ma la punteggiatura sfortunatamente danneggia l'aspetto del testo ...


1
Un'altra possibilità che potresti prendere in considerazione è una funzione di rimozione posizionata alla fine di ogni ciclo di comando della riga hl, in modo tale che una ricerca venga eseguita dall'inizio della riga corrente alla fine della riga corrente (o fino alla fine di la linea visiva corrente, se applicabile) e la faccia di sovrapposizione della linea hl possono quindi essere rimosse da qualsiasi altro testo con un colore di sfondo diverso. Probabilmente stai cercando l'evidenziazione posizionata con il blocco dei caratteri, anche se potresti avere anche l'evidenziazione posizionata con altri overlay (ad esempio, errori di flyspell / duplicati).
elenco delle leggi

@lawlist Sono interessato alla sua implementazione; puoi per favore aggiungere la soluzione completa di seguito?
Kaushal Modi

@kaushalmodi - So come fare per sovrapposizioni specifiche o testo non elaborato in un punto, ma non per evidenziare specifiche proprietà del testo / blocco dei caratteri in quel punto. Poiché avrei bisogno di cercare come testare queste ultime due occorrenze per rispondere correttamente a questa domanda, ho scelto invece di fare un commento. Ecco uno snippet [preso in prestito da una delle librerie di Drew] per testare sovrapposizioni specifiche al punto: (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))
elenco delle leggi

Risposte:


5

Il problema è che a volte la proprietà text faceviene utilizzata per l'evidenziazione e hl-line-modeutilizza una sovrapposizione. E le sovrapposizioni vengono sempre visualizzate in primo piano " faceevidenziando " la proprietà del testo .

diff-mode, ad esempio, utilizza la proprietà text, non una sovrapposizione. Quindi per casi come questo sei sfortunato.

Ma per evidenziare che è prodotto da un overlay è possibile semplicemente ridurre la priorità di overlay dell'overlay hl-line: o hl-line-overlayoppure global-hl-line-overlay, in modo che tale overlay appaia "sotto" l'altro evidenziazione dell'overlay.

Se si utilizza la libreria, hl-line+.elè possibile utilizzare l'opzione hl-line-overlay-priorityper impostare la priorità di overlay. Vedi anche la pagina Wiki di Emacs Evidenzia Linea corrente . (Ma ancora una volta, la modifica della priorità di overlay non ha alcun effetto se l'altra evidenziazione non proviene da un overlay.)


Grazie per la risposta. Non mi preoccupo della differenza tra volti e sovrapposizioni ... +1
gavenkoa

Come accedo a quella hl-line-overlayproprietà? Ad esempio non si presenta in customize-variable.
9000

@ 9000: come dice la risposta, se si utilizza la libreria, hl-line+.elè sufficiente personalizzare l'opzione hl-line-overlay-priority. Altrimenti, non è possibile (tranne ridefinendo o avvisando le funzioni prestabilite). Questo è il punto di fornire questa opzione utente.
Disegnato il

3

Termino con una soluzione parziale - evidenziare solo dalla fine della riga:

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

2

Mi sono imbattuto in questa domanda quando si è tentato di non eseguire l' hl-lineoverride dello sfondo (anche se in questo caso si trattava di guide di rientro):

Ho optato per questo, che inizia a disegnare la linea di evidenziazione dopo il rientro:

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

Sostituzione anche (+ (line-beginning-position 1) (current-indentation))con (point)lavori (a partire dal cursore).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.