hl-line-mode隐藏背景,如何避免这种情况?


10

带有:

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

当前行以黄色背景突出显示,但是如果文本具有背景属性,它也会被覆盖(例如diff-mode,rainbow-mode)。

是否可以仅为没有适当属性的零件设置背景?

我开始进行实验的UPDATE,似乎点画与背景没有冲突:

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

但是不幸的是,点画会损坏文本外观。


1
您可能希望考虑的另一种可能性是,在每个hl-line命令循环的末尾放置删除功能,以便从当前行的开头到当前行的结尾(或到行的结尾)执行搜索。则可以从存在其他背景颜色的其他文本的任何位置删除当前视线和hl线覆盖面。您可能会搜索字体锁定放置的突出显示,尽管您可能还会将突出显示放置在其他覆盖上(例如,flyspell错误/重复项)。
法律列表

@lawlist我对它的实现感兴趣;您能否在下面添加完整的解决方案?
Kaushal Modi

@kaushalmodi-我知道如何针对特定的叠加层或原始文本执行此操作,但不适用于针对特定的文本属性/字体锁定突出显示。因为我需要研究如何测试后两种情况才能正确回答此问题,所以我选择发表评论。这是一个片段[从Drew的一个图书馆借来的],用于测试特定的叠加点: (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))
律师名单

Answers:


5

问题是有时文本属性face用于突出显示,并hl-line-mode使用覆盖。并且覆盖总是显示在文本属性face突出显示的“顶部”

diff-mode,例如,使用text属性,而不使用叠加层。因此,对于这种情况,您很不幸。

但是,对于叠加层产生的突出显示,您可以降低hl线叠加层的叠加优先级:hl-line-overlayglobal-hl-line-overlay,使该叠加层看起来在其他叠加层突出显示的“下方”。

如果使用库,hl-line+.el则可以使用选项hl-line-overlay-priority设置覆盖优先级。另请参阅Emacs Wiki页面“ 突出显示当前行”。(但同样,如果其他突出显示不是来自叠加层,则更改叠加层优先级也无效。)


感谢您的回答。我不担心面孔和覆盖物之间的区别... +1
吉通哥亚2015年

如何访问该hl-line-overlay财产?例如,它没有出现在中customize-variable
9000

@ 9000:正如答案所说,如果您使用库,hl-line+.el则只需自定义option hl-line-overlay-priority。否则,您将无法(除非重新定义或建议预先提供的功能)。这就是提供此用户选项的重点。
提请

3

我以部分解决方案结束-仅从行尾突出显示:

(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

尝试不尝试hl-line覆盖背景时偶然发现了这个问题(尽管在本例中为缩进指导):

我解决了这个问题,它开始在缩进之后绘制高亮线:

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

更换(+ (line-beginning-position 1) (current-indentation))(point)作品也(在光标处开始)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.