Emacs Lisp语法高亮

4

我写了一个简单的宏来定义交互式函数并将其同时绑定到按键上。(这就是我之前提出的问题)唯一让我烦恼的是,没有高亮显示看起来很丑。它被这样称呼:

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

我希望你能将define-and-bind-commandfoo翻译成中文。为了使define-and-bind-command高亮,我可以在defmacro的包装器中使用,虽然不是很好看,并且我对foo没有任何想法。我知道这是可能的,因为require的参数会用常量样式高亮显示。
或者,可能我在发明轮子,还有另一个lisp模式具有更先进的高亮显示吗?
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”并按回车键来非常容易地找到已经使用过的面的名称。 编辑2:当然,你需要将该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)

将这段代码插入在上面函数中另一个字体锁定关键字的行之后,然后就可以使用了。这个正则表达式匹配 'define-and-bind-command' 单词开头(\b表示)后跟着一个空格,然后返回(字体锁定)直到下一个空格为止的所有内容。

希望这能帮到你!


2

font-lock-add-keywords可以接受一个符号,表示要应用新关键字的模式。所以你可以这样做:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接