Procházet zdrojové kódy

Keyword highlighting now works.

Paul Onions před 11 roky
rodič
revize
8922bf3fce
1 změnil soubory, kde provedl 17 přidání a 16 odebrání
  1. 17 16
      sysrpl-mode.el

+ 17 - 16
sysrpl-mode.el

@@ -28,7 +28,7 @@
   "Face used for displaying SysRPL names."
   :group 'rpl)
 
-(defvar sysrpl-syntax-table
+(defvar sysrpl-mode-syntax-table
   (let ((table (make-syntax-table prog-mode-syntax-table)))
     (modify-syntax-entry ?:  "w" table)
     (modify-syntax-entry ?!  "w" table)
@@ -43,6 +43,7 @@
     (modify-syntax-entry ?_  "w" table)
     (modify-syntax-entry ?=  "w" table)
     (modify-syntax-entry ?+  "w" table)
+    (modify-syntax-entry ?*  "w" table)
     (modify-syntax-entry ?/  "w" table)
     (modify-syntax-entry ?<  "w" table)
     (modify-syntax-entry ?>  "w" table)
@@ -50,20 +51,16 @@
     table)
   "The SysRPL syntax table.")
 
-(defun sysrpl-make-keywords-regexp (calculator)
-  (cl-assert (keywordp calculator))
-  (concat "\\<" (regexp-opt (rpl-sysrpl-names calculator)) "\\>"))
-
-(defvar sysrpl-keywords-regexp
-  ;; !!! TODO Unfortunately does not work because Emacs complains that
-  ;; !!! the regular expression is too large (?!?)
-  (sysrpl-make-keywords-regexp rpl-sysrpl-default-calculator)
-  "Regular expression for SysRPL keywords.")
-
 (defvar sysrpl-keyword-face 'sysrpl-name)
 
+(defun sysrpl-font-lock-compile-keywords (names)
+  "Construct a list of keyword matcher clauses suitable for ``font-lock-keywords''."
+  (mapcar (lambda (str) (list (concat "\\<" (regexp-quote str) "\\>")
+                              (list 0 'sysrpl-keyword-face)))
+          names))
+
 (defvar sysrpl-font-lock-keywords
-  (list (cons sysrpl-keywords-regexp 'sysrpl-keyword-face)))
+  (sysrpl-font-lock-compile-keywords (rpl-sysrpl-names rpl-sysrpl-default-calculator)))
 
 (defvar sysrpl-selected-calculator rpl-sysrpl-default-calculator
   "Currently selected calculator model.")
@@ -72,25 +69,29 @@
   "Set the currently selected calculator model to be the 38G."
   (interactive)
   (setq sysrpl-selected-calculator :38G)
-  (setq sysrpl-keywords-regexp (sysrpl-make-keywords-regexp :38G)))
+  (setq sysrpl-font-lock-keywords (sysrpl-font-lock-compile-keywords (rpl-sysrpl-names :38G)))
+  (sysrpl-mode))
 
 (defun sysrpl-select-39g ()
   "Set the currently selected calculator model to be the 39G."
   (interactive)
   (setq sysrpl-selected-calculator :39G)
-  (setq sysrpl-keywords-regexp (sysrpl-make-keywords-regexp :39G)))
+  (setq sysrpl-font-lock-keywords (sysrpl-font-lock-compile-keywords (rpl-sysrpl-names :39G)))
+  (sysrpl-mode))
 
 (defun sysrpl-select-48g ()
   "Set the currently selected calculator model to be the 48G."
   (interactive)
   (setq sysrpl-selected-calculator :48G)
-  (setq sysrpl-keywords-regexp (sysrpl-make-keywords-regexp :48G)))
+  (setq sysrpl-font-lock-keywords (sysrpl-font-lock-compile-keywords (rpl-sysrpl-names :48G)))
+  (sysrpl-mode))
 
 (defun sysrpl-select-49g ()
   "Set the currently selected calculator model to be the 49G."
   (interactive)
   (setq sysrpl-selected-calculator :49G)
-  (setq sysrpl-keywords-regexp (sysrpl-make-keywords-regexp :49G)))
+  (setq sysrpl-font-lock-keywords (sysrpl-font-lock-compile-keywords (rpl-sysrpl-names :49G)))
+  (sysrpl-mode))
 
 (defvar sysrpl-mode-map
   (let ((map (make-sparse-keymap))