在Emacs中创建一个新模式

Nic*_*ick 3 emacs elisp

我对Emacs Lisp(或任何Lisp,无论如何)一无所知.我想做一些看起来非常简单的事情,但我对在线指南没有运气.我想为.packet文件创建"packet-mode.el" .我想做以下事情:

  • 启用C++模式
  • 创建packet一个关键字,同时保持C++模式的其余部分不变
(define-derived-mode packet-mode fundamental-mode
  (font-lock-add-keywords 'c++-mode `(("packet" . font-lock-keyword-face)))
  (c++-mode))

  (add-to-list 'auto-mode-alist '("\\.packet\\'" . packet-mode)
  (provide 'packet-mode)
Run Code Online (Sandbox Code Playgroud)

我也尝试在数据包模式下切换语句的顺序,但随后C++突出显示中断.

我想packet表现得像struct在这个意义上,

packet foo {
  int bar;
}
Run Code Online (Sandbox Code Playgroud)

突出显示的方式与struct用于代替的方式相同packet.

sds*_*sds 6

以下是您需要投入的内容packet-mode.el:

(defvar packet-mode-font-lock-keywords
  '(("\\<packet\\>" . font-lock-keyword-face)))
(define-derived-mode packet-mode c++-mode "Packet"
  "A major mode to edit GNU ld script files."
  (font-lock-add-keywords nil packet-mode-font-lock-keywords))
(add-to-list 'auto-mode-alist '("\\.packet\\'" . packet-mode))
(provide 'packet-mode)
Run Code Online (Sandbox Code Playgroud)

放入packet-mode.elload-path和(可选)字节中的目录进行编译.

现在,添加(require 'packet-mode)到您的.emacs.el.

  • 更好地将`font-lock-add-keywords`移动到模式定义中,使用`nil`作为模式参数:`(define-derived-mode packet-mode c ++ - mode"Packet"(font-lock-add-) keywords nil'(("packet".font-lock-keyword-face))))` (3认同)