Пользовательский формат препроцессора C в режиме Emacs cc - PullRequest
2 голосов
/ 09 января 2020

Я генерирую исходный файл C из шаблона Mako . Шаблоны Mako имеют директивы, подобные директивам препроцессора C, за исключением того, что они начинаются с % вместо #. Например:

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

При редактировании источника шаблона эти директивы воспроизводят havo c с блокировкой шрифта cc-mode и автоматическим отступом c.

Есть ли способ сказать cc-mode, что он должен обрабатывать строки, начинающиеся с %, так же, как строки препроцессора (начинающиеся с #)?

1 Ответ

1 голос
/ 09 января 2020

Возможно, существует более простой способ, но, поскольку cc -mode готовит материал для фонификации во время компиляции, я не уверен, как вы получите фонификацию, не объявляя производный cc -мод (без простого добавления их все через 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))
...