2012-05-20 116 views
3

我写了一个简单的宏来定义交互功能,并将它绑定到键上 (这是我以前的问题相关) 唯一让我烦恼的是,它看起来很难看,没有突出显示。 它呼吁这样的方式:Emacs lisp highlighting

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

我想define-and-bind-commandfoo突出。 那么,要得到define-and-bind-command突出显示,我可以使用包装defmacro, altho不是很漂亮,我不知道foo。 我知道这是可能的,因为参数require用const面板突出显示。

或者,也许,我发明了轮子,还有一个是另一个LISP方式更 先进的高亮?

回答

3

突出“定义和绑定命令”可以非常轻松地使用“字体锁定附加关键字”来实现,用法是

(defun my-elisp-mode-keywords() 
    (font-lock-add-keywords nil 
    '(
     ("\\<\\(define-and-bind-command\\)" . '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:纠正了我的代码,计算器之前吃了一些支撑...
Edit4:好吧,我对第二部分只匹配的解决方案,我还没有广泛的测试,但它似乎工作。我已经允许FOO到包含任何字符,但空间(和换行符我认为),我想一个可能会限制该事件futher到-ZA-Z0-9和“ - ”,可以随意改变自己的喜好。该守则只负责foo的部分匹配是

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

插入的是,在上述功能的其他字体锁定关键字后面的线,你是好去。正则表达式匹配“定义和绑定命令”,其必须开始一个字(这是\ b为)后跟一个空格,然后将其返回(字体锁)一切,接着直到存在空间。

希望这会有所帮助!

2

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

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

缺点相比,使用功能和挂钩的是,这并不派生的模式下工作;也就是说,如果您的模式来自emacs-lisp-mode,它将不会继承这些关键字。