当前线高亮显示(hl线)不尊重现有高亮显示



我正在尝试在emacs中配置hl-linehl-line+,以尊重缓冲区中现有的高亮显示/文本背景颜色。

我在~/.emacs中配置了hl-line,如下所示:

(require 'hl-line)
(global-hl-line-mode 1)

然后,我使用highlight-symbol-at-point(M-s h .(高亮显示该符号。这将以黄色背景在整个缓冲区中高亮显示光标下的符号。

但是,当我将光标移动到包含该符号的行上时,hl-line覆盖将隐藏黄色背景。我希望这条线能突出显示,但黄色背景能得到尊重。

在进行了一些挖掘之后,我还尝试了hl-line+包,因为它有一个覆盖优先级选项,听起来很有希望。我下载了hl行+.el文件,并按如下方式设置了我的~/.emacs

(add-to-list 'load-path (expand-file-name "~/.emacs.d/packages/hl-line+/"))
(require 'hl-line+)
(global-hl-line-mode 1)
(setq-default hl-line-overlay-priority -100)

然而,这仍然有同样不正确的行为来隐藏现有的黄色背景。

有人知道如何配置这两个包中的任何一个以尊重现有的背景色吗?

highlight-symbol使用字体锁,它将文本属性(facefont-lock-face(添加到缓冲区中的字符中。

覆盖属性(包括face和`font lock face(不应用于缓冲区中的字符。它们应用于缓冲位置。他们";覆盖";缓冲区内容;它们不是缓冲区内容的一部分。

覆盖属性始终优先于文本属性。这意味着覆盖高亮显示始终覆盖文本属性高亮显示(例如通过字体锁定(。

覆盖优先级仅指定覆盖之间的相对优先级。同样,任何覆盖高亮显示都会覆盖任何文本特性高亮显示。

所以我认为答案是你不能按照自己的要求去做。(如果有办法的话,其他人会纠正我的。(

阅读hi-lock.el文档,这个解释很突出:

"在启用"字体锁定"模式的缓冲区中,图案高亮显示使用字体锁定。在字体锁定模式被禁用的缓冲器中,使用覆盖层来施加图案";

因此,事实证明,hi-lock.el包能够使用覆盖来突出显示,但仅当禁用字体锁定模式时。我通过用M-x font-lock-mode禁用字体锁定来测试这一点,当用hl-line高亮显示当前行时,我可以确认高亮显示现在正确显示。问题是,所有的语言语法高亮显示现在都消失了,所以这个选项不好。

如果有人知道如何配置hi-lock.el以使用启用了font-lock-mode的覆盖,那么这将是最好的答案。

同时,还有一个支持叠加高亮显示的替代MELPA包,它与hl-line:symbol-overlay.el一起魅力四射。

话虽如此,我不太喜欢默认键绑定和突出显示颜色。作为参考,我在这里留下我的配置:

(require 'symbol-overlay)
(global-set-key (kbd "<f2>") 'symbol-overlay-jump-next)
(global-set-key (kbd "S-<f2>") 'symbol-overlay-jump-prev)
(global-set-key (kbd "C-<f2>") 'symbol-overlay-put)
(global-set-key (kbd "M-<f2>") 'symbol-overlay-query-replace)
(global-set-key (kbd "<f7>") 'symbol-overlay-mode)
(global-set-key (kbd "<f8>") 'symbol-overlay-remove-all)
(set-face-attribute 'symbol-overlay-default-face nil :background "coral1" :foreground "black")
(set-face-attribute 'symbol-overlay-face-1 nil :background "gold2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-2 nil :background "chocolate2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-3 nil :background "PaleGreen2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-4 nil :background "SkyBlue2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-5 nil :background "PaleVioletRed2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-6 nil :background "IndianRed2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-7 nil :background "PaleTurquoise2" :foreground "black")
(set-face-attribute 'symbol-overlay-face-8 nil :background "MediumOrchid2" :foreground "black")