ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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


i
itsjeyd

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

Mx highlight-regexp RET <REGEXP>

Mx 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> 之类的东西
C
Community

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

https://nschum.de/src/emacs/highlight-symbol/highlight-symbol.png


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

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

这称为增量搜索。


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

我用的是idle-highlight

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

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

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

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

我与 lambda 的内部钩子有一些不一致之处。也许考虑调用一个defun。
i
ieure

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

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


这看起来很不错,但是它如何知道它是否找到了相同的符号或具有相同名称的另一个符号?
H
Hi-Angel

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

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

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

启用 overlay-symbol 后,屏幕上将显示您将光标放在超时后的每个单词的出现次数(默认超时为 0.5 秒,可以使用 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
d
dancavallaro

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

(global-hi-lock-mode 1)

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


T
Tobias

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

如果要保留字符串的突出显示,可以将其冻结。

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

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


n
nbro

检查Interactive Highlighting

应该:

Cx wh 字


首先,hi-lock-mode 应该由 Mx hi-lock-mode 启用。然后,它起作用了。顺便说一句,交互式突出显示的链接已失效。它现在在这里:gnu.org/software/emacs/manual/html_node/emacs/…
E
Ehvince

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


D
Drew

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


G
George

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

当你找到你想搜索的单词时,CS,然后用 CW 阅读完整的单词,然后你可以 CS,它会搜索它。在我的 Emacs 中,它还突出显示了文档中的所有实例。


P
Pharaoh

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

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