From fe88e456a7a71de02b1460b637df7d409dff7475 Mon Sep 17 00:00:00 2001 From: mcbloch Date: Fri, 24 Jan 2020 01:31:37 +0100 Subject: [PATCH] Add initial HLDS syntax highlighting for Emacs --- etc/emacs/hlds-mode.el | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 etc/emacs/hlds-mode.el diff --git a/etc/emacs/hlds-mode.el b/etc/emacs/hlds-mode.el new file mode 100644 index 0000000..436d40f --- /dev/null +++ b/etc/emacs/hlds-mode.el @@ -0,0 +1,72 @@ +;;;;;:;;;;;;;;;;;;;;;;;;; +;;; Haldis menu files ;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun my-font-lock-restart () + "Reload the syntax highlighting" + (interactive) + (setq font-lock-mode-major-mode nil) + (font-lock-fontify-buffer) + (message "hldsmode: Reloaded syntax highlighting!")) + +(defun my-restart-hlds-mode () + (interactive) + (let ((lisp-mode-hook nil)) + (normal-mode) + (message "hldsmode: Reloaded mode!"))) + +(setq hlds-font-lock-keywords + (let* ( + ;; define several category of keywords + (x-keywords '()) + (x-types '("base")) + (x-constants '()) + (x-events '()) + (x-functions '("single_choice" "multi_choice")) + + ;; generate regex string for each category of keywords + (x-keywords-regexp (regexp-opt x-keywords 'words)) + (x-types-regexp (regexp-opt x-types 'words)) + (x-constants-regexp (regexp-opt x-constants 'words)) + (x-events-regexp (regexp-opt x-events 'words)) + (x-functions-regexp (regexp-opt x-functions 'words)) + + ;(x-functions-regexp-final (concat "

\\|

" "\\|" x-functions-regexp)) + (x-constants-regexp-final (concat "\\({[^{]+?}\\)" "\\|" x-constants-regexp)) + (x-keywords-regexp-final (concat "\\(€.+\\)$" "\\|" x-keywords-regexp)) + (x-events-regexp-final (concat "^\\([a-zA-Z0-9_]+?\\):" "\\|" x-events-regexp))) + + `( + (,x-types-regexp . font-lock-type-face) + ;(,x-constants-regexp-final . font-lock-constant-face) + (,x-constants-regexp-final .(1 font-lock-constant-face)) + (,x-events-regexp-final . (1 font-lock-builtin-face)) + (,x-functions-regexp . font-lock-function-name-face) + (,x-keywords-regexp-final . (1 font-lock-keyword-face)) + ;; note: order above matters, because once colored, that part won't change. + ;; in general, put longer words first + ))) + +(defvar hlds-mode-syntax-table nil "Syntax table for `hlds-mode'.") + +(setq hlds-mode-syntax-table + (let ( (synTable (make-syntax-table))) + ;; hlds style comment: “== …” + (modify-syntax-entry ?# "<" synTable) + (modify-syntax-entry ?\n ">" synTable) + synTable)) + +;;;###autoload +(define-derived-mode hlds-mode fundamental-mode "hlds" + "Major mode for editing Haldis menu files." + + ;; code for syntax highlighting + (setq font-lock-defaults '((hlds-font-lock-keywords))) + + (set-syntax-table hlds-mode-syntax-table) + ) + + + +;; add the mode to the `features' list +(provide 'hlds-mode)