Emacs模式: 高亮光标下的变量使用

6
在Python模式下,如果我将点放在下面函数定义中的x参数上。
def f(x):
  #   ^------ point here
  print x

在函数体中使用x会被突出显示为黄色。

  • 这是如何实现的?
  • 如果我要编写自己的Emacs模式,我该如何为我的语言添加此类突出显示?

1
内置的Python模式不支持此功能,Emacs中的任何其他模式也不支持。您是否使用了某个起始套件,或者安装了第三方模式,例如highlight-symbols? - user355252
抱歉,@lunaryorn。我正在使用入门工具包,我不知道它会影响python-mode。 - tibbe
1
只是为了澄清一下,下面提到了3个高亮库 - highlight-symbol(15k),hi-lock(31k)和highlight(137k)- hi-lock是Emacs的一部分。更多信息请参见http://www.emacswiki.org/emacs/HighlightTemporarily。 - Brian Burns
4个回答

3
我不会在主要模式中实现这样的功能。一个通用的次要模式,基于Emacs的通用接口(例如语法表),尽可能支持多种主要模式,更适合,并且毫不奇怪,有人已经编写了这样的模式:highlight-symbol
使用此包和以下代码在你的init.el中,Emacs将突出显示点下面的所有符号(例如变量、函数、类)的所有出现:
(add-hook 'prog-mode-hook #'highlight-symbol-mode)

这个软件包还提供了其他很多与光标下符号相关的实用工具,例如 highlight-symbol-nav-mode,可以让你使用 C-nC-p 快捷键跳转到下一个和上一个光标下的符号。看一下源代码,了解它的能力。


此外,对于@tibbe提出的特定情况,人们可能更感兴趣的是颜色标识模式 - Hi-Angel
请注意,highlight-symbol存在漏洞且未维护(自2016年以来没有更新);现在,您最好使用symbol-overlay mode模式(https://github.com/nschum/highlight-symbol.el/pull/53),它基本上是`highlight-symbol`的更好的重写。 - Hi-Angel

2

highlight.el库中,命令hlt-highlight-symbol可以实现您想要的功能。(还请查看选项hlt-auto-faces-flag。)它可以像highlight-symbol库一样(包括在多个出现之间导航),并且更多功能。请参阅Highlight library

此外,Emacs 24.4(即当前开发快照)的命令hi-lock-face-symbol-at-point也可以实现您想要的功能,我认为这两种方式不同。


1
(require 'hi-lock)


(defvar args-highlighted-p nil)
(defvar args-highlighted-regexp "\_<.+\_>")

(defun highlight-args ()
  "With cursor at function's argument, highlight args in body.

When already highlighted, un-highlight. "
  (interactive)
  (save-excursion
    (if args-highlighted-p
    (progn
      (setq args-highlighted-p nil)
      (hi-lock-unface-buffer args-highlighted-regexp))
      (let ((erg (prin1-to-string (symbol-at-point)))
        (end (funcall end-of-defun-function)))
    (if
        erg
        (progn
          (setq args-highlighted-p t)
          (setq args-highlighted-regexp (concat "\\_<" erg "\\_>"))
          (hi-lock-face-symbol-at-point)
          (while
          (re-search-forward "\_<erg\_>" nil t end)
        (hi-lock-face-symbol-at-point))))))))

0

不确定该模式是如何实现的,但这里有一个我之前写的highlight-tags小模式,它可以类似地匹配sgml标签。

它不能很好地确定要匹配哪些标签,但对你来说相关部分是highlight-tags-update/hide/show。请记住,由于sgml标签只有一个匹配标签,因此我只需要为缓冲区设置一对全局覆盖层即可。您的用例可能需要更多的高亮显示,因此您需要将它们列成列表。

抽象地说,您的工作方式如下:

  1. 获取word-at-point的输出
  2. 在以下块中查找所有单词出现的位置(可能使用一些python-nav-*-block命令和search-forward的组合)
  3. 收集每个匹配项的start/end
  4. 为每个start/end对创建一个新的overlay,并使用make-overlay返回这些覆盖物的列表。

然后,您需要编写一个函数,将上述输出存储在某个地方,以便稍后可以执行(mapcar #'delete-overlay overlays)

最后,您需要将一个hook添加到post-command-hook中,以运行一个函数来删除旧的覆盖物并生成新的覆盖物。


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