如何在Emacs的lisp-mode中突出显示所有函数名称?

6
如何在Emacs的lisp-mode中突出显示所有函数名?我希望它们是加粗的。
换句话说,所有从(到第一个空格的单词都要突出显示。不关心像(a.b)这样的例外。
就像GitHub一样:
2个回答

7
请使用以下内容:
(defface font-lock-func-face 
    '((nil (:foreground "#7F0055" :weight bold))
      (t (:bold t :italic t)))
  "Font Lock mode face used for function calls."
  :group 'font-lock-highlighting-faces)

(font-lock-add-keywords 
 'emacs-lisp-mode
 '(("(\\s-*\\(\\_<\\(?:\\sw\\|\\s_\\)+\\)\\_>"
    1 'font-lock-func-face)))

一个有趣的事情:这会影响到let绑定,就像Github一样。但这正是您要求的,对吧:)?

1
谢谢!现在我明白\\(...\\)是关键点了。但我想知道那个“1”代表什么意思? - kuanyui
1
1 表示“第一个捕获组”,2 表示第二个捕获组(如果有的话)。0 表示整个匹配。 - abo-abo
请删除变量,只保留defface。面部变量已经过时。您可能希望改用内置的font-lock-function-name-face。正则表达式无法捕获一些非常常见的函数名(例如string =<=+foo/bar)。"(\\s-*\\(\\_<\\(?:\\sw\\|\\s_\\)+\\)\\_>"可以提供更全面的覆盖范围。 - user355252
这不会覆盖已经高亮显示的文本:(font-lock-add-keywords 'lisp-mode '(("(\\s-*\\(\\_<\\(?:\\sw\\|\\s_\\)+\\)\\_>" 1 'font-lock-func-face keep)) t) - Bad_ptr

6
下面的代码突出显示已知的Emacs-Lisp函数名称。
请注意,即使某个给定函数名称的出现不代表该函数,它也会这样做。例如,该名称可能用作变量名称。在实践中不是一个大问题,但了解这一点很好。
;; `setq' is a variable here, but it is highlighted anyway.
(let ((setq  (foobar)))...)

为了在Emacs-Lisp模式下自动开启高亮显示,请按照以下步骤操作:
(font-lock-add-keywords 'emacs-lisp-mode
                        '((my-fl . 'font-lock-constant-face)) ; Or whatever face you want.                            'APPEND)

(defun my-fl (_limit)
  (let ((opoint  (point))
        (found   nil))
    (with-syntax-table emacs-lisp-mode-syntax-table
      (while (not found)
        (cond ((condition-case ()
                   (save-excursion
                     (skip-chars-forward "'")
                     (setq opoint  (point))
                     (let ((obj  (read (current-buffer))))
                       (and (symbolp obj)  (fboundp obj)
                            (progn (set-match-data (list opoint (point))) t))))
                 (error nil))
               (forward-sexp 1)
               (setq opoint  (point)
                     found   t))
              (t
               (if (looking-at "\\(\\sw\\|\\s_\\)")
                   (forward-sexp 1)
                 (forward-char 1)))))
      found)))

注意:如果您只想看到这种高亮效果,请先在Emacs-Lisp模式缓冲区中执行此操作,以消除其他Emacs-Lisp字体锁定高亮显示。
M-: (setq font-lock-keywords  ()) RET

更新 ---

我为此创建了一个小型模式命令和库:

它可以让你突出显示定义的Emacs-Lisp符号:函数和变量,仅函数或仅变量。或者你可以突出显示仅未知是否定义的符号。


2
我可能误读了代码,但整个condition-case不能用(thing-at-point 'symbol)替换吗? - user355252
可能是,也可能不是。;-) 例如,请参见function-called-at-point - Drew

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