2

我正在从Mako模板生成 C 源文件。Mako 模板具有类似于 C 预处理器指令的指令,不同之处在于它们以%而不是#. 例如:

%if some_condition:
   /* Condition is true */
%else:
   /* Condition is false */
%endif

在编辑模板源代码时,这些指令会破坏cc-mode' 的字体锁定和自动缩进。

有没有办法告诉cc-mode它应该以%与预处理器行(以 a 开头)相同的方式处理以 a 开头的行#

4

1 回答 1

1

可能有一种更简单的方法,但是由于 cc-mode 在编译时准备字体化内容,我不确定如果不声明派生的 cc-mode (而不是简单地将它们全部添加font-lock-add-keywords),您将如何获得字体化。

我相信,只需c-opt-*在您的 . c-mode-hook但是,这是一个示例派生模式,它将在mako-mode从缓冲区调用之后字体化您的预处理器语句并提供正确的缩进(希望如此)。

(eval-when-compile
  (require 'cc-langs)
  (require 'cc-fonts))
(require 'cc-mode)

;;; create inherited mako-mode from c-mode
(eval-and-compile (c-add-language 'mako-mode 'c-mode))

;;; variables to control font-locking preprocessor stuff
(c-lang-defconst c-cpp-expr-intro-re mako
                 (concat "\\s *%\\s*" (regexp-opt '("if" "else" "endif")) ":?"))
(c-lang-defconst c-opt-cpp-prefix mako "\\s *%")
(c-lang-defconst c-opt-cpp-symbol mako "%")
(c-lang-defconst c-opt-cpp-start mako "\\s *%\\s *\\([[:alnum:]:]+\\)")

(defconst mako-font-lock-keywords-1 (c-lang-const c-matchers-1 mako))
(defconst mako-font-lock-keywords-2 (c-lang-const c-matchers-2 mako))
(defconst mako-font-lock-keywords-3 (c-lang-const c-matchers-3 mako))
(defvar mako-font-lock-keywords (c-lang-const c-matchers-3 mako))
(defun mako-font-lock-keywords ()
  (c-compose-keywords-list mako-font-lock-keywords))

(defvar mako-mode-syntax-table nil)
(define-derived-mode mako-mode prog-mode "Mako"
  :after-hook (c-update-modeline)
  :syntax-table c-mode-syntax-table

  ;; initialize cc-mode stuff
  (c-initialize-cc-mode t)
  (c-init-language-vars mako-mode)
  (c-common-init 'mako-mode))
于 2020-01-09T19:12:06.773 回答