如何在Emacs的lisp模式下突出显示所有函数的名字?我希望他们粗体。如何在Emacs的lisp模式中突出显示所有函数的名称?
换句话说,从(
到第一个space
的所有单词。 不在乎例外像(a . b)
就像GitHub的:
如何在Emacs的lisp模式下突出显示所有函数的名字?我希望他们粗体。如何在Emacs的lisp模式中突出显示所有函数的名称?
换句话说,从(
到第一个space
的所有单词。 不在乎例外像(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)))
一件有趣的事情:这个食堂了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
UPDATE ---
我创造了这个小-mode命令和库:
它可以让你突显定义的Emacs Lisp的符号:函数和变量,只有函数,或者只有变量。或者,您可以仅突出显示已知的已定义符号而不是。
谢谢!现在我明白'\\(... \\)'是重点。但是我想知道那个“1”是什么意思? – kuanyui
1表示“第一个捕获组”,2表示第二个捕获组,如果有的话。 0意味着整场比赛 –
更好:请删除变量,并离开'defface'。脸部变量已过时。您可能想要使用内置的'font-lock-function-name-face'来代替。正则表达式无法捕获一些相当常见的函数名称(即'string =','<=','+'或'foo/bar')。 '“(\\ s - * \\(\\ _ <\\(?:\\ sw \\ | \\ s _ \\)+ \\)\\ _>”'给出了更完整的覆盖范围 – lunaryorn