怎么为自己的语言创建mode?(借用别的mode)


#1

大家都知道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的代码高亮、分析器之类的一个起点)


#2

derived-mode?


#3

看了一下文档:

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。。。


#4
(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,没用。。。


#5

搞定了。。。

(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果然强大。


#6

对啊,老兄没有仔细读文档


#7

是的,很惭愧。。。

不过已经可以了(虽然yasnippet会继承parent mode,不过这应该是它的一个特性,无所谓了)。

多谢:smiling_face_with_three_hearts: