如何在emacs中突出显示特定行?

14

我需要在使用emacs时突出显示某些文件中的行,它应该类似于M-s h l,但应该基于行号而不是正则表达式工作。我想要突出显示当前行,但是hl-line-mode不适用于我,因为我需要在每个按下特定键的行上都突出显示许多行。


"Some lines" 是一个区域。请参见 https://dev59.com/CUbRa4cB1Zd3GeqPz2Iz。你可能需要 highlight.el 库。 - artscan
这些行不是连续的。它只是一组有趣的行。 - Necto
2
酷,我甚至不知道我想要这个。+1 - harpo
下面的“bm”包是我推荐的,而不是重新发明轮子。但是发明轮子也很有趣! - event_jr
3个回答

15
我只是快速写下了以下内容:
(defun find-overlays-specifying (prop pos)
  (let ((overlays (overlays-at pos))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))

(defun highlight-or-dehighlight-line ()
  (interactive)
  (if (find-overlays-specifying
       'line-highlight-overlay-marker
       (line-beginning-position))
      (remove-overlays (line-beginning-position) (+ 1 (line-end-position)))
    (let ((overlay-highlight (make-overlay
                              (line-beginning-position)
                              (+ 1 (line-end-position)))))
        (overlay-put overlay-highlight 'face '(:background "lightgreen"))
        (overlay-put overlay-highlight 'line-highlight-overlay-marker t))))


(global-set-key [f8] 'highlight-or-dehighlight-line)

(这里的find-overlays-specifying来源于手册页面

它会突出显示当前行,再次使用时会将其移除。

也许以下内容也很有用:从缓冲区中删除所有高亮显示(可能很危险,如果您高亮显示了重要内容,则可能不希望这样做)

(defun remove-all-highlight ()
  (interactive)
  (remove-overlays (point-min) (point-max))
  )

(global-set-key [f9] 'remove-all-highlight)

如果某些行的开头或结尾有点,则此方法将无法正常工作。 - Necto
这是一个临时解决方案,但它仍然存在show-paren-mode和hl-line-mode的问题。 - Necto
如果你关闭了 hl 模式,高亮是否会保留? - PascalVKooten
当然它们都很有用,因为hl-line-mode可以帮助处理长行的混乱文本,而highlight-or-degighlight-line可以在视觉上强调某些行以标记它们。如果我关闭hl模式,你的高亮显示仍然会保留。我认为你应该使用一种命名覆盖方式,以避免与其他模式发生冲突,但我还不知道如何实现。 - Necto
1
如果您需要更改颜色,这是列表http://raebear.net/comp/emacscolors.html。 - Truong Ha
显示剩余10条评论

14
你可以使用 bm.el。你可以从 MELPA 安装 bm.el。
bm.el 提供了 bm-toggle 来高亮和取消当前行的高亮。 bm.el 还提供了 bm-bookmark-regexp,它仅高亮匹配的行。 你可以通过 bm-previousbm-next 在高亮的行之间跳转。
以下是 bm.el 的样例配置:
(require 'bm)
(global-set-key (kbd "<f5>") 'bm-toggle)
(global-set-key (kbd "<f6>") 'bm-previous)
(global-set-key (kbd "<f7>") 'bm-next)
(global-set-key (kbd "<f8>") 'bm-bookmark-regexp)

谢谢。这很好,但我认为对于这么简单的任务来说有点过重了。 - Necto
bm 是一款简单、灵活、强大且直观的软件。 - EdwardG

5

Bookmark+可以满足您的需求。使用C-x p RET(默认情况下)在点处设置书签。您可以配置所需书签的突出显示方式。这与bm.el提供的功能类似(syohex的答案),但更加灵活。


请注意,书签在EWW缓冲区中无法使用,只能在目录和文件中使用。我正在寻找Emacs中的解决方案,允许我在EWW缓冲区中突出显示某些行,并想到了寄存器和书签。虽然可以使用寄存器来记住网页缓冲区中的某些点,然后跳转到它们,但不能使用书签。(EWW缓冲区不是OP的要求,我只是想扩展您的答案。) - hajovonta
1
@hajovonta:不,我不认为这是真的。使用Bookmark+,EWW书签应该可以正常工作,包括缓冲区。当然,EWW本身会不断变化,因此可能会引入一些我尚未意识到的问题。如果您觉得发现了问题,请向我报告:M-x customize-group bookmark-plus,然后按照(例如点击)链接Send Bug Report,它将帮助您准备发送给我的电子邮件。谢谢。 - Drew
我不是专家,但我有一种感觉,EWW书签仅适用于EWW网址。我需要在EWW缓冲区中添加一个书签位置。使用Bookmark+可以实现吗? - hajovonta
1
@hajovonta:不,EWW书签的工作方式类似普通书签。它们不仅会为URL设置书签,还会为您设置书签的位置(例如HTML页面)。并且,您还可以在该位置设置区域书签。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接