大家都知道lisp语言的好处就是能自己创造语言,假设我用lisp创造了自己的一个语言名字叫:abc
这个abc虽然是完全的新语言(有自己的解释器/编译器,比如:abc.exe),但是仍然使用lisp语法。
我现在想创建一个新的mode来处理它,比如:就叫abc-mode,这个具体要怎么做呢?
我现在的想法是:
(1)由于abc语言仍然是lisp,只不过增加了一些关键字而已,能不能直接调用lisp-mode代码?换句话说,对于emacs来说,他能识别这个新mode叫abc-mode,但是这个mode的实现是lisp-mode。
(2)我不需要实现完善的代码高亮,我只需要lisp-mode默认 对注释的高亮 和 indent功能 即可,所以希望借用他的功能。以后对于新关键词的高亮什么的,可以再参考lisp-mode慢慢加。
有人可能要问,为什么必须要一个自己的mode?直接把.abc auto-mode-alist 到 lisp-mode里不就行了吗?
原因是:
(1)yasnippet只支持对特定mode做隔离,而不是对文件后缀做隔离
(2)某些关键词只在abc语言里出现,而不在lisp-mode里出现,从逻辑上也应该分离。
注:小弟之前一直也就是使用emacs,没有开发过emacs的代码高亮、分析器之类的东西,所以对这一块不是很熟悉。望大大们指点一二,多谢。(我也希望这个案例能成为未来开发emacs的代码高亮、分析器之类的一个起点)
看了一下文档:
The recommended way to define a new major mode is to derive it from an existing one using define-derived-mode
. If there is no closely related mode, you should inherit from either text-mode
, special-mode
, or prog-mode
define-derived-mode 似乎只能继承 text-mode
, special-mode
, or prog-mode
三者之一(他们才是major-mode?),不能直接继承lisp-mode?或scheme-mode?
另外,之前对emacs mode的理解有错误?lisp-mode不是major mode?故已编辑标题,干脆就叫mode。。。
(require 'lisp-mode)
;;;###autoload
(define-derived-mode abc-mode prog-mode
"ABC"
"Major mode for editing abc-mode."
(lisp-mode t))
(provide 'abc-mode)
在abc-mode里企图调用lisp-mode,没用。。。
搞定了。。。
(require 'lisp-mode)
;;;###autoload
(define-derived-mode abc-mode lisp-mode
"ABC"
"Major mode for editing abc-mode.")
(provide 'abc-mode)
也就是说:
Macro: define-derived-mode variant parent name docstring keyword-args… body…
这里parent这个参数是可以设置特定major-mode的(之前的理解没错),并不限与 text-mode
, special-mode
, or prog-mode
三者之一,他们的“子mode”也是可以的。
Emacs果然强大。
2 个赞
是的,很惭愧。。。
不过已经可以了(虽然yasnippet会继承parent mode,不过这应该是它的一个特性,无所谓了)。
多谢:smiling_face_with_three_hearts:
这个很有用,正好准备创建一个用于宏脚本的mode。请问怎么增加新的关键字?
我记得 xahlee 的博客有几页写关于这个的,你可以搜搜