hl-line-mode hide background, como evitar isso?

10

Com:

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

a linha atual destacada pelo fundo amarelo, mas se o texto tiver propriedades de fundo, ele também será substituído (como modo diferencial, modo arco-íris).

É possível definir plano de fundo apenas para peças que não possuem propriedades apropriadas?

ATUALIZAÇÃO Começo a experimentar, parece que o pontilhado não está em conflito com o plano de fundo:

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

Infelizmente, pontilhado danifica a aparência do texto ...

gavenkoa
fonte
11
Outra possibilidade que você pode considerar é uma função de remoção colocada no final de cada loop de comando da linha hl, de modo que uma pesquisa seja realizada desde o início da linha atual até o final da linha atual (ou até o final de a linha visual atual, se aplicável) e a face de sobreposição da linha hl podem ser removidas de onde houver outro texto com uma cor de fundo diferente. Você provavelmente procurará por realce colocado por bloqueio de fonte, embora também possa ter realce colocado com outras sobreposições (por exemplo, erros de duplicação / duplicação).
lawlist
@lawlist Estou interessado em sua implementação; você pode adicionar a solução completa abaixo?
Kaushal Modi
@kaushalmodi - Eu sei como fazer isso para sobreposições específicas ou texto bruto no ponto, mas não para propriedades de texto específicas / realce de bloqueio de fonte no ponto. Como eu precisaria pesquisar como testar essas duas últimas ocorrências para responder adequadamente a essa pergunta, optei por fazer um comentário. Aqui está um trecho [emprestado de uma das bibliotecas de Drew] para testar para sobreposições específicas no ponto: (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

Respostas:

5

O problema é que, às vezes, a propriedade de texto faceé usada para realçar e hl-line-modeusa uma sobreposição. E as sobreposições sempre aparecem "em cima" do facerealce da propriedade de texto .

diff-mode, por exemplo, usa a propriedade text, não uma sobreposição. Portanto, para casos como este, você está sem sorte.

Mas, para o destaque produzido por uma sobreposição, você pode reduzir a prioridade da sobreposição da linha hl: hl-line-overlayou global-hl-line-overlay, ou , para que essa sobreposição pareça estar "abaixo" do outro destaque da sobreposição.

Se você usar a biblioteca hl-line+.el, poderá usar a opção hl-line-overlay-prioritypara definir a prioridade da sobreposição. Veja também a página Wiki do Emacs, Destaque a Linha Atual . (Mas, novamente, alterar a prioridade da sobreposição não terá efeito se o outro realce não for de uma sobreposição.)

Desenhou
fonte
Obrigado pela resposta. Eu não me incomodo sobre a diferença entre as faces e sobreposições ... +1
gavenkoa
Como faço para acessar essa hl-line-overlaypropriedade? Por exemplo, não aparece customize-variable.
9000
@ 9000: Como a resposta diz, se você usa a biblioteca hl-line+.el, basta personalizar a opção hl-line-overlay-priority. Caso contrário, você não poderá (exceto redefinindo ou aconselhando as funções pré-fornecidas). Esse é o objetivo de fornecer essa opção ao usuário.
Desenhou
3

Termino com solução parcial - destaque apenas no final da linha:

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

Tropecei nessa questão ao tentar não hl-linesubstituir o plano de fundo (apesar de serem guias de recuo nesse caso):

Eu decidi sobre isso, que começa a desenhar a linha de destaque após o recuo:

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

Substituir (+ (line-beginning-position 1) (current-indentation))por (point)funciona também (começando no cursor).

ideasman42
fonte