【问题标题】:Current line highlight (hl-line) does not respect existing highlights当前行高亮(hl-line)不尊重现有高亮
【发布时间】:2021-11-10 19:59:46
【问题描述】:

我正在尝试在 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-line+.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)

但是,隐藏现有的黄色背景仍然有同样的错误行为。

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

【问题讨论】:

    标签: emacs overlay highlight face font-lock


    【解决方案1】:

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

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

    叠加属性始终优先于文本属性。这意味着覆盖突出显示始终覆盖文本属性突出显示(例如通过字体锁定)。

    叠加优先级仅指定叠加之间的相对优先级。同样,任何覆盖突出显示都会覆盖任何文本属性突出显示。

    所以我认为答案是你不能按照你的要求去做。 (其他人会纠正我,如果有办法解决这个问题。)

    【讨论】:

    • 感谢您花时间解释,希望有人能提出解决方法。这似乎是一个基本功能,即突出显示单词+突出显示当前行,不开箱即用很奇怪。有时感觉 emacs 故意让简单变得困难。
    【解决方案2】:

    阅读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")
    

    【讨论】: