我编写了简单的宏来定义交互功能并同时将其绑定到密钥 (那是我之前的问题) 唯一令我烦恼的事情是,如果没有突出显示它看起来很难看。 它这样叫:
(define-and-bind-command foo "C-x £" (message "Hello world"))
我希望define-and-bind-command
和foo
突出显示。
好吧,为了突出显示define-and-bind-command
,我可以在defmacro
周围使用包装器,
虽然不是很漂亮,但我不知道foo
。
我知道这是可能的,因为require
的参数用const face突出显示。
或者,可能,我正在发明轮子,还有另一种更多的lisp模式 高级突出显示?
答案 0 :(得分:3)
使用'font-lock-add-keywords'可以非常轻松地突出显示'define-and-bind-command',用法将是
(defun my-elisp-mode-keywords()
(font-lock-add-keywords nil
'(
("\\<\\(define-and-bind-command\\)" . 'font-lock-keyword-face)
)
)
)
当然,您可以将'font-lock-keyword-face'更改为您喜欢的任何面孔,或创建并使用您自己的面孔。您可以通过将点(光标)移动到文本的字体锁定部分并输入“describe-face”然后返回来轻松找到已经使用过的面部名称。
Edit2:哦,当然你需要将这个defun挂钩到某个钩子,对于elisp模式,它将是:
(add-hook 'emacs-lisp-mode-hook 'my-elisp-mode-keywords)
使用正则表达式可以突出显示foo部分。
不幸的是我还不能帮你解决这个问题,因为我不确定如何匹配包含'define-and-bind-command'的正则表达式,但只突出显示后面的单词。
编辑,除非您想要突出显示同一面中的'define-and-bind-command'和foo部分,否则它应该非常简单。但我猜你想让他们有不同的面孔?
编辑3:更正了我的代码,stackoverflow之前吃了一些大括号...
编辑4:好的,我有一个仅用于匹配第二部分的解决方案,我没有广泛测试它,但它似乎工作。我允许foo包含任何字符但是包含空格(我认为是换行符),我想可以将该事件限制为a-zA-z0-9和“ - ”,所以请随意根据自己的喜好进行更改。负责仅匹配foo部分的代码是
("\\bdefine-and-bind-command\s\\([^\s]*\\)" 1 'font-lock-function-name-face t)
在上面的函数中插入另一个font-lock关键字之后的行中,你就可以了。 regexp匹配'define-and-bind-command',它必须开始一个单词(即 \ b for),然后是空格,然后返回(font-locks)所有内容,直到空格存在。
希望这有帮助!
答案 1 :(得分:2)
font-lock-add-keywords
可以采用符号,即应用新关键字的模式。所以你可以做到
(font-lock-add-keywords
'emacs-lisp-mode
'(("\\<\\(define-and-bind-command\\)" . 'font-lock-keyword-face)))
与使用函数和钩子相比的缺点是,这对派生模式不起作用;也就是说,如果您的模式源自emacs-lisp-mode
,则不会继承这些关键字。