4

我编写了简单的宏来定义交互功能并将其同时绑定到键(这与我之前的问题有关)唯一让我烦恼的是,它看起来很难看,没有突出显示。它是这样调用的:

(define-and-bind-command foo "C-x £" (message "Hello world"))

我想要define-and-bind-command并被foo突出显示。好吧,为了define-and-bind-command突出显示,我可以使用 wrapper defmacro,虽然不是那么漂亮,而且我不知道foo. 我知道这是可能的,因为参数 ofrequire用 const face 突出显示。

或者,可能,我正在发明轮子,并且还有另一种具有更高级突出显示的 lisp 模式?

4

2 回答 2

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”但仅突出显示后面的单词的正则表达式。
编辑:除非您想在同一张面上同时突出显示“定义和绑定命令”和 foo 部分,否则它应该很容易。但我猜你想让他们有不同的面孔?
Edit3:更正了我的代码,stackoverflow 之前吃了一些大括号...
Edit4:好的,我有一个仅匹配第二部分的解决方案,我没有对其进行广泛测试,但它似乎有效。我允许 foo 包含除空格以外的任何字符(我认为还有换行符),我想可以将该事件进一步限制为 a-zA-z0-9 和“-”,因此请随意更改为您喜欢的。只负责匹配 foo 部分的代码是

("\\bdefine-and-bind-command\s\\([^\s]*\\)" 1 'font-lock-function-name-face t)

将它插入到上述函数中另一个 font-lock 关键字之后的行中,你就可以开始了。正则表达式匹配 'define-and-bind-command',它必须以一个单词(即\b表示)开头,后跟一个空格,然后返回(字体锁定)后面的所有内容,直到存在空格。

希望这可以帮助!

于 2012-05-20T09:41:48.660 回答
2

font-lock-add-keywords可以采用符号,即应用新关键字的模式。所以你可以做

(font-lock-add-keywords 
 'emacs-lisp-mode
 '(("\\<\\(define-and-bind-command\\)" . 'font-lock-keyword-face)))

与使用函数和钩子相比的缺点是这不适用于派生模式;也就是说,如果您有一个派生自 的模式emacs-lisp-mode,它将不会继承这些关键字。

于 2012-05-21T18:00:34.657 回答