如何突出显示 Emacs 缓冲区中所有出现的单词?

Posted

技术标签:

【中文标题】如何突出显示 Emacs 缓冲区中所有出现的单词?【英文标题】:How to highlight all occurrences of a word in an Emacs buffer? 【发布时间】:2010-09-27 23:47:59 【问题描述】:

Notepad++ 有一个方便的功能:如果您在文本中选择一个词(不一定是关键字),该词会在整个文本中突出显示。这也可以在 Emacs 中完成吗?如果是这样,怎么办?

它不一定必须像 Notepad++ 一样工作(即通过选择);理想情况下,我想设置一个键绑定,使光标下所有出现的单词都被突出显示。

如果突出显示是永久性的,那就太好了,即,将点从突出显示的单词移开应该不会导致突出显示被删除。

此外,如果有一种解决方案可以在亮点之间导航(使用自定义键绑定),那将会很有用。

【问题讨论】:

【参考方案1】:

hi-lock 的建议很好。不过,我认为使用 M-x 版本更容易:

M-x highlight-regexp RET <REGEXP>

M-x highlight-phrase RET <REGEXP>

highlight-phrase 只是highlight-regexp 周围的一点糖,它忽略大小写并转换正则表达式中的空格以匹配任意空格。方便。

【讨论】:

要清除突出显示,请使用:M-x unhighligh-regex key-chord: C-x w r ... 此外,highlight-phrase 并非完全不区分大小写。只有 initial 小写字母(单词)ae 不区分大小写。 (我想它的目的是处理fred vs Fred)..例如它生成一个正则表达式,如:[Cc]at[ ]+[Dd]og 谢谢,我发现您对差异的评论比内置帮助更清楚。 注意:错字:应该是unhighlight-regexp而不是unhighligh-regex(缺少tp)。 这很有帮助。我有 2 个问题。 1.有没有办法同时用不同的颜色突出显示2个单词?像M-x highlight-regexp RET <hello>, <world> 这样的东西。 2.如何同时unhighlight所有单词?类似M-x unhighlight-regexp RET <hello>, <world>【参考方案2】:

也许 http://nschum.de/src/emacs/highlight-symbol/ 上的 highlight-symbol.el 是您正在寻找的:

【讨论】:

我试过了,但无法正常工作 - emacs 抱怨“符号作为变量的值是无效的:highlight-symbol-idle-delay”。 我确实遇到过这个问题。我最终注释掉了整个 (defcustom highlight-symbol-idle-delay...) 部分,并在 (defun highlight-symbol-update-timer...) 之前移动 (defvar highlight-symbol-idle-delay...) ),这将避免错误。 是的,最后我做了同样的事情。 抱歉,我认为没有必要为此任务添加外部包!请参阅 jrockway 的帖子。 @mefiX:内置功能非常适合单人使用。外部包增加了(除其他外)只需 1 次击键即可突出显示光标下的单词的便利,以及自动更改不同单词的突出显示颜色。是的,您可以使用内置功能做到这一点,但是如果您经常这样做,为什么要浪费几分钟和数百次击键而不是几秒钟和一次击键呢?投反对票的人似乎是狭隘的:有人可能会发现这个包有用,即使你不这样做。【参考方案3】:

键入C-s,然后键入当前单词或键入C-w。作为奖励,您现在可以再次点击C-s 来搜索该词。

这称为增量搜索

【讨论】:

对于它的价值,我现在意识到这个问题的意图:即使你做其他工作,比如四处走动、打字等,你也希望“永久”突出显示事件(直到你把它关掉) .为此,Cs(增量搜索)将不起作用(突出显示是“临时的”;您可以在缓冲区中移动,但很难进行新的编辑工作)。我使用(并且赞成)M-x highlight-regexp 解决方案(并将其绑定到快捷方式)。【参考方案4】:

我用的是idle-highlight

http://www.emacswiki.org/emacs/IdleHighlight

M-x idle-highlight 设置一个空闲计时器,突出显示该点下单词缓冲区中的所有出现。

要为所有编程模式启用它,在~/.emacs.d/init.el

;; highlight words
(add-hook 'prog-mode-hook (lambda () (idle-highlight-mode t)))

【讨论】:

我与 lambda 的内部挂钩有一些不一致之处。也许考虑调用一个defun。【参考方案5】:

Light-symbol 将突出显示任何符号点结束。

或者,您可以使用occur,它会列出与正则表达式匹配的所有行。快速查看类中的所有函数很有用。

【讨论】:

这看起来很不错,但是它怎么知道找到的是同一个符号还是另一个同名符号呢?【参考方案6】:

没有人提到symbol-overlay mode。它基本上是对highlight-symbol-mode 的更好重写。 “更好”,缺少原始高亮符号 的错误(例如,临时高亮卡住,或临时高亮因在高亮单词内移动而消失;或无法高亮像 * 这样的符号),更好地集成和维护。请参阅其自述文件的“优势”段落。

你可以像往常一样安装它,使用 M-xpackage-install (确保事先使用 package-list-packages 更新软件包列表)。作为参考,我在底部附上了代码,用于启用该模式并禁用一些您可能想要也可能不想要的更高级的功能。

Notepad++ 有一个方便的功能:如果您在文本中选择一个词(不一定是关键字),该词会在整个文本中突出显示。这也可以在 Emacs 中完成吗?如果有,怎么做?

启用overlay-symbol后,屏幕上将显示您在超时后将光标放在的每个单词的出现(默认超时为0.5s,可以使用symbol-overlay-idle-time变量进行配置)时间>。如果一个词没有突出显示,这意味着屏幕上只有一个匹配项(您将光标放在的那个),因此无需突出显示它。

如果突出显示是永久性的,那就太好了,即,将点从突出显示的单词移开不会导致突出显示被删除。

要永久突出光标下的单词,有一个函数symbol-overlay-put。要取消突出显示,请再次调用它。

在我的配置示例中,它绑定到 Logo+` 键。


(require 'symbol-overlay)
(defun enable-symbol-overlay-mode ()
  (unless (or (minibufferp)
              (derived-mode-p 'magit-mode)
              (derived-mode-p 'xref--xref-buffer-mode))
    (symbol-overlay-mode t)))
(define-global-minor-mode global-symbol-overlay-mode ;; name of the new global mode
  symbol-overlay-mode                                ;; name of the minor mode
  enable-symbol-overlay-mode)
(global-symbol-overlay-mode)                         ;; enable it
(global-set-key (kbd "s-`") 'symbol-overlay-put)
(setq symbol-overlay-ignore-functions nil)           ;; don't ignore keywords in various languages
(setq symbol-overlay-map (make-sparse-keymap))       ;; disable special cmds on overlays

【讨论】:

symbol-overlay-mode 正是我想要的。将symbol-overlay-put 绑定到 F 键对于在文件中切换给定单词的突出显示非常方便。 symbol-overlay-put 可以不区分大小写吗? @efe373 恐怕我看不到这种可能性。我尝试修改case-fold-search,但它对symbol-overlay-put 突出显示的文本没有影响。我认为您可以创建一个功能请求on the project bugtracker。【参考方案7】:

这可能不如你希望的那么好,但如果你放了

(global-hi-lock-mode 1)

在您的.emacs 文件中,您可以输入C-x w h REGEX <RET> <RET> 以突出显示所有出现的REGEX,并输入C-x w r REGEX <RET> 以再次取消突出显示它们。再说一次,虽然没有你想的那么优雅,但它会起作用。

【讨论】:

【参考方案8】:

试试http://www.emacswiki.org/emacs/msearch.el 用光标选择的所有文本都将突出显示。 您必须拖动要突出显示的字符串。这使您可以轻松更改选择而不更改突出显示。

如果你想保留一个字符串的高亮,你可以冻结它。

您可以将一个缓冲区奴役到另一个缓冲区。在主缓冲区中选择的文本也将在从缓冲区中突出显示。这对于比较缓冲区很有用。 当您在另一个缓冲区中调查文本时,它也可用于在一个缓冲区中记笔记。您可以在注释缓冲区中有一组关键字。拖动这样的关键字,它在调查文本中的出现将被突出显示。

我多年来一直在使用这些东西。我最近添加了冷冻。所以,也许有些东西坏了。如果是这种情况,请在 http://www.emacswiki.org/emacs/msearch 或此处给我留言。

【讨论】:

【参考方案9】:

查看Interactive Highlighting

应该是:

C-x w h

【讨论】:

首先,hi-lock-mode 应该通过 M-x hi-lock-mode 来开启。然后,它起作用了。顺便说一句,交互式突出显示的链接已失效。现在在这里:gnu.org/software/emacs/manual/html_node/emacs/…【参考方案10】:

库中的命令highlight.el 让您(取消)突出显示匹配正则表达式(在本例中为符号)的文本,使用覆盖或文本属性。您可以在事件之间循环。突出显示可以是暂时的或持久的。 (more info).

【讨论】:

【参考方案11】:

试试iedit。它突出显示该单词,并让您轻松编辑它的所有出现。通过额外的击键(C-'),它会隐藏所有没有该单词的行。很方便!

【讨论】:

【参考方案12】:

这可能不会突出显示,但会在您无需输入的情况下搜索单词...

当您找到要搜索的单词时,C-S,然后用 C-W 阅读完整的单词,然后您可以 C-S,它会搜索它。在我的 Emacs 中,它还会突出显示文档中的所有实例。

【讨论】:

【参考方案13】:

这个包在 Melpa 作品中可用,您也可以自定义高亮样式。

https://github.com/ignacy/idle-highlight-in-visible-buffers-mode

【讨论】:

以上是关于如何突出显示 Emacs 缓冲区中所有出现的单词?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

如何在 Visual Studio 中突出显示文本中出现的搜索词?

如何在 Emacs 中选择或突出显示一个块?

emacs 列表缓冲区行为

如何使 emacs 突出显示超过 80 个字符的行?

将 hl-line 最后放在 Emacs 背景堆栈中