如何突出显示所有功能';在Emacs';lisp模式?

如何突出显示所有功能';在Emacs';lisp模式?,emacs,lisp,elisp,syntax-highlighting,font-lock,Emacs,Lisp,Elisp,Syntax Highlighting,Font Lock,如何在Emacs的lisp模式下突出显示所有函数名?我要他们加粗 换句话说,从(到第一个空格的所有单词都不关心异常,如(a.b) 就像GitHub一样: 使用以下方法: (defface font-lock-func-face '((nil (:foreground "#7F0055" :weight bold)) (t (:bold t :italic t))) "Font Lock mode face used for function calls." :gro

如何在Emacs的lisp模式下突出显示所有函数名?我要他们加粗

换句话说,从
到第一个
空格的所有单词都不关心
异常,如
(a.b)

就像GitHub一样:

使用以下方法:

(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)))
(defface字体锁定功能面
((无(:前景“#7F0055”:粗体)
(t(:粗体t:斜体t)))
“用于函数调用的字体锁定模式面。”
:组字体锁定突出显示面)
(字体锁定)添加关键字
'emacs lisp模式
“(”(\\s-*\\(\\\\”
1“字体锁定功能面”))
有趣的是:这会弄乱
let
绑定,就像Github一样。
但这正是您所要求的,对吗?

下面的代码突出显示了已知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符号:函数和变量、仅函数或仅变量。或者,您可以仅突出显示已知已定义的符号。

谢谢!现在我明白了,
\(…\\)
是重点。但我想知道“1”是什么含义?1表示第一个捕获的组
,2表示第二个捕获的组,如果有。0表示整个匹配更好:请删除变量,只保留
defface
。面变量已过时。您可能需要使用内置的
字体锁定函数名称Face
。regexp无法捕获一些相当常见的函数名(即
string=
这不会覆盖已高亮显示的文本:
(字体锁定添加关键字'lisp mode'(“(\\s-*\(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(点上的对象符号)
?可能,可能不是;-)例如,请参阅在点调用的函数。