Emacs lisp突出显示

时间:2012-05-20 04:30:48

标签: emacs elisp

我编写了简单的宏来定义交互功能并同时将其绑定到密钥 (那是我之前的问题) 唯一令我烦恼的事情是,如果没有突出显示它看起来很难看。 它这样叫:

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

我希望define-and-bind-commandfoo突出显示。 好吧,为了突出显示define-and-bind-command,我可以在defmacro周围使用包装器, 虽然不是很漂亮,但我不知道foo。 我知道这是可能的,因为require的参数用const face突出显示。

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

2 个答案:

答案 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,则不会继承这些关键字。