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


83

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

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

这将是巨大的,如果亮点是永久性的,即运动点从突出显示的文字应远离引起被删除的亮点。

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

Answers:


41

您可能正在寻找http://nschum.de/src/emacs/highlight-symbol/上的Highlight-symbol.el :

替代文字


1
我尝试了一下,但无法正常工作-emacs抱怨“由于变量的符号值是无效的:highlight-symbol-idle-delay”。
Headcrab

1
我确实有那个特别的问题。我最终注释掉了整个(defcustom Highlight-symbol-idle-delay ...)部分,并在(defun Highlight-symbol-update-timer ...)之前移动了(defvar Highlight-symbol-idle-delay ...)。 ),这样可以避免错误。
polyglot

1
是的,最后我做了同样的事情。
头颅

1
抱歉,但是我认为没有必要为此任务添加外部程序包!参见jrockway的帖子。
mefiX

4
@mefiX:内置函数非常适合单次使用。外部软件包增加了方便性(除了其他功能),而且只需单击一次按键即可突出显示光标下方的单词,并自动更改不同单词的突出显示颜色。是的,您可以使用内置功能来做到这一点,但是如果您经常这样做,那为什么要浪费几分钟和数百次击键,而不是浪费几秒钟和几次击键?投票否决的人似乎很狭someone:有人可能会觉得此软件包很有用,即使您没有用。
polyglot 2010年

85

这些hi-lock建议是好的。我认为使用这些M-x版本更容易:

M-x highlight-regexp RET <REGEXP>

M-x highlight-phrase RET <REGEXP>

highlight-phrase只是highlight-regexp忽略了大小写并在正则表达式中转换一个空格以匹配任意空格而已。便利。


23
要清除突出显示,请使用:M-x unhighligh-regexkey-chord:C-x w r...此外,突出显示短语也不完全区分大小写。仅(单词的)字母小写使ae不区分大小写。(我想是要处理fredvs的Fred)..例如,它生成一个正则表达式,例如:[Cc]at[ ]+[Dd]og
Peter.O 2011年

谢谢,我发现您对差异的评论比内置帮助更清晰。
约书亚·戈德堡2014年

1
注意:错别字:应该unhighlight-regexp改为,而不是unhighligh-regex(missingtp)。
Zelphir Kaltstahl '17

36

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

这称为增量搜索


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

15

我用的是高亮显示

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。
Darryl Hebbes

10

轻符号将突出显示任何符号点。

或者,您可以使用begin,它列出所有与regexp匹配的行。快速查看类中的所有函数很有用。


这看起来非常好,但是如何知道是否找到了相同的符号或具有相同名称的另一个符号?
HelloGoodbye 2015年

6

尝试http://www.emacswiki.org/emacs/msearch.el 用光标选中的所有出现的文本都会突出显示。您必须将鼠标拖到要突出显示的字符串上。这样一来,您便可以轻松更改选择而无需更改突出显示。

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

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

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


5

这可能不如您希望的那样好,但是如果您把

(global-hi-lock-mode 1)

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



5

没有人提到symbol-overlay模式。基本上是对的更好重写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键对于在文件中切换给定单词的突出显示非常方便。
Matt Kneiser

2

库中的命令highlight.el 允许您使用覆盖或文本属性(取消显示)与正则表达式(在本例中为符号)匹配的文本。您可以在事件之间循环。突出显示可以是临时的也可以是永久的。(更多信息)


2

尝试iedit。它突出显示该单词,使您可以轻松编辑所有出现的单词。通过附加的击键(C-'),它可以隐藏其中没有该单词的所有行。非常便利!


0

这可能不会突出显示,但是会搜索一个单词,而无需您键入它...

当您到达要搜索的单词CS时,然后使用CW阅读完整的单词,然后可以CS进行搜索。在我的Emacs中,它还突出显示了文档中的所有实例。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.