Emacs模式:突出显示变量在点下的使用

时间:2014-03-16 08:05:19

标签: emacs

在Python模式下,如果我将点放在下面函数定义中的x参数

def f(x):
  #   ^------ point here
  print x

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

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

4 个答案:

答案 0 :(得分:3)

我不会在主要模式下实现这样的功能。尝试基于通用Emacs接口(例如语法表)支持尽可能多的主要模式的通用次要模式更适合,并且毫不奇怪,有人已经编写了这样的模式:highlight-symbol

使用此程序包以及init.el中的以下代码,Emacs将在点下突出显示符号的所有匹配项(例如变量,函数,类):

(add-hook 'prog-mode-hook #'highlight-symbol-mode)

此软件包还提供了许多其他实用程序来处理点下的符号,例如highlight-symbol-nav-mode,它允许您跳转到带有C-n的点下一个和上一个符号。分别为C-p。看看源代码,了解它的功能。

答案 1 :(得分: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))))))))

答案 2 :(得分:1)

highlight.el中的命令hlt-highlight-symbol可以满足您的需求。 (另请参阅选项hlt-auto-faces-flag。)它执行库highlight-symbol的功能(包括事件之间的导航)等。请参阅Highlight library

另外,Emacs 24.4(即当前开发快照),命令hi-lock-face-symbol-at-point做你想要的,我想(不同)。

答案 3 :(得分:0)

不确定该模式是如何具体做到这一点的,但here&#39; sa highlight-tags次要模式我之前作为思考练习编写了类似的匹配sgml标签

它并没有很好地确定要点击哪些标签,但无论如何,相关部分将是highlight-tags-update / hide / show。请记住,由于sgml标记只有一个匹配的标记,因此我只为缓冲区提供了一对全局叠加层。您的用例可能会有更多亮点,因此您需要保留其中的列表。

你的抽象方式是:

  1. 获取word-at-point
  2. 的输出
  3. 查找以下块中出现的所有单词(可能使用python-nav-*-block命令和search-forward的某种组合)
  4. 收集每场比赛的start / end
  5. 为每个overlay / startend创建一个新make-overlay,并返回这些重叠列表。
  6. 然后你需要一个能够获取上述输出并将其存储在某个地方的函数,以便以后可以(mapcar #'delete-overlay overlays)

    最后,您需要向hook添加一个post-command-hook来运行一个功能,以删除旧的叠加层并生成新的叠加层。