hl-line-mode hide background, comment éviter cela?


10

Avec:

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

ligne actuelle surlignée par un arrière-plan jaune, mais si le texte a des propriétés d'arrière-plan, il est également écrasé (comme le mode diff, le mode arc-en-ciel).

Est-il possible de définir l'arrière-plan uniquement pour les pièces qui n'ont pas de propriétés appropriées?

MISE À JOUR Je commence à expérimenter, il semble que le pointillé ne soit pas en conflit avec le fond:

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

Mais le pointillé endommage malheureusement l'apparence du texte ...


1
Une autre possibilité que vous voudrez peut-être envisager est une fonction de suppression placée à l'extrémité arrière de chaque boucle de commande de ligne hl, de sorte qu'une recherche soit effectuée du début de la ligne actuelle à la fin de la ligne actuelle (ou jusqu'à la fin de la ligne visuelle actuelle, le cas échéant) et la face de superposition de la ligne hl peuvent ensuite être supprimées de tout autre texte avec une couleur d'arrière-plan différente. Vous rechercherez probablement des surlignages placés par font-lock, bien que vous puissiez également avoir des surlignages placés avec d'autres superpositions (par exemple, des erreurs / doublons d'orthographe).
lawlist

@lawlist Je suis intéressé par sa mise en œuvre; pouvez-vous s'il vous plaît ajouter la solution complète ci-dessous?
Kaushal Modi

@kaushalmodi - Je sais comment faire cela pour des superpositions spécifiques ou du texte brut au point, mais pas pour des propriétés de texte / surlignage de police spécifiques au point. Parce que je devrais rechercher comment tester ces deux dernières occurrences afin de répondre correctement à cette question, j'ai choisi de faire un commentaire à la place. Voici un extrait [emprunté à l'une des bibliothèques de Drew] pour tester des superpositions spécifiques au point: (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

Réponses:


5

Le problème est que la propriété text est parfois faceutilisée pour la mise en surbrillance et hl-line-modeutilise une superposition. Et les superpositions apparaissent toujours "au-dessus de" la facemise en évidence des propriétés de texte .

diff-mode, par exemple, utilise la propriété text, pas une superposition. Donc, pour des cas comme celui-ci, vous n'avez pas de chance.

Mais pour la mise en surbrillance produite par une superposition, vous pouvez simplement réduire la priorité de superposition de la superposition de ligne hl: soit hl-line-overlayou global-hl-line-overlay, de sorte que cette superposition semble être "au-dessous" de l'autre superposition de superposition.

Si vous utilisez la bibliothèque, hl-line+.elvous pouvez utiliser l'option hl-line-overlay-prioritypour définir la priorité de superposition. Voir aussi la page Wiki Emacs Mettre en surbrillance la ligne actuelle . (Mais encore une fois, la modification de la priorité de superposition n'a aucun effet si l'autre surbrillance ne provient pas d'une superposition.)


Merci de répondre. Je ne me soucie pas de la différence entre les faces et les superpositions ... +1
gavenkoa

Comment accéder à cette hl-line-overlaypropriété? Par exemple, il n'apparaît pas dans customize-variable.
9000

@ 9000: Comme l'indique la réponse, si vous utilisez la bibliothèque, hl-line+.elvous n'avez qu'à personnaliser l'option hl-line-overlay-priority. Sinon, vous ne pouvez pas (sauf en redéfinissant ou en conseillant les fonctions pré-fournies). C'est le point de fournir cette option utilisateur.
Drew

3

Je termine avec une solution partielle - surlignez uniquement à la fin de la ligne:

(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

Je suis tombé sur cette question en essayant de ne pas faire de la hl-linesubstitution l'arrière-plan (bien qu'il s'agissait de guides d'indentation dans ce cas):

Je me suis installé là-dessus, qui commence à dessiner la ligne de surbrillance après l'indentation:

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

Remplacer (+ (line-beginning-position 1) (current-indentation))par des (point)œuvres aussi (en commençant par le curseur).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.