;;; part21.el --- Major mode for editing Express schemata in Emacs ;; Author: Craig Lanning ;; Keywords: languages, step, iso ;; Code: ;; select Express-Mode for *.exp files ;;;###autoload (dolist (typ '("\\.ste?p\\'" "\\.2[0-9][0-9]\\'" "\\.p21\\'")) (pushnew (cons typ 'part21-mode) auto-mode-alist :test (lambda (x y) (equal (car x) (car y))))) (defconst part21-mode-version "Part21-Mode 0.1" "Version of `part21.el'.") (defgroup part21 nil "Major mode for editing Part21 data in Emacs" :group 'languages) (defvar part21-mode-abbrev-table nil "Abbrev table for Part21 mode.") (define-abbrev-table 'part21-mode-abbrev-table '()) (defvar part21-mode-syntax-table nil "Syntax table for Part21 mode.") (if (not part21-mode-syntax-table) (let ((i ?0)) (setq part21-mode-syntax-table (make-syntax-table)) (while (< i (1+ ?9)) (modify-syntax-entry i "w" part21-mode-syntax-table) (setq i (1+ i))) (setq i ?A) (while (< i (1+ ?Z)) (modify-syntax-entry i "w" part21-mode-syntax-table) (setq i (1+ i))) (setq i ?a) (while (< i (1+ ?z)) (modify-syntax-entry i "w" part21-mode-syntax-table) (setq i (1+ i))) ;; add (modify-syntax-entry ...) forms (modify-syntax-entry ?\ " " part21-mode-syntax-table) (modify-syntax-entry ?\t " " part21-mode-syntax-table) (modify-syntax-entry ?\[ "(]" part21-mode-syntax-table) (modify-syntax-entry ?\] ")[" part21-mode-syntax-table) (modify-syntax-entry ?\( "()" part21-mode-syntax-table) (modify-syntax-entry ?\) ")(" part21-mode-syntax-table) (modify-syntax-entry ?\/ ". 14" part21-mode-syntax-table) (modify-syntax-entry ?\* ". 23" part21-mode-syntax-table) (modify-syntax-entry ?\- "." part21-mode-syntax-table) (modify-syntax-entry ?\' "\"" part21-mode-syntax-table) (modify-syntax-entry ?\_ "_" part21-mode-syntax-table) (modify-syntax-entry ?\# "w" part21-mode-syntax-table) (modify-syntax-entry ?\> "." part21-mode-syntax-table) (modify-syntax-entry ?\< "." part21-mode-syntax-table) (modify-syntax-entry ?\: "." part21-mode-syntax-table) (modify-syntax-entry ?\; "." part21-mode-syntax-table) (modify-syntax-entry ?\\ "." part21-mode-syntax-table) (modify-syntax-entry ?\. "w" part21-mode-syntax-table) (modify-syntax-entry ?\! "w" part21-mode-syntax-table) ) ) ;;; Menus stuff ;;(defvar express-mode-popup-menu nil) ;;(defvar express-mode-popup-menu-1 ;; (purecopy '("Express" ;; ["Insert ENTITY" express-insert-entity nil] ;; ["Insert FUNCTION" express-insert-function nil] ;; ["Insert PROCEDURE" express-insert-procedure nil] ;; ["Insert RULE" express-insert-rule nil] ;; ["Insert SCHEMA" express-insert-schema nil] ;; ["Insert TYPE" express-insert-type nil] ;; "---" ;; ["Upcase Keywords in Buffer" express-upcase-buffer-keywords nil] ;; ["Upcase Keywords in Region" express-upcase-region-keywords nil] ;;(region-exists-p)] ;; "---" ;; ["Comment Out Region" express-comment-region nil] ;;(region-exists-p)] ;; "---" ;; ["Indent Buffer" express-indent-buffer nil] ;; ["Indent Region" express-indent-region nil] ;;(region-exists-p)] ;; ))) ;(defun express-mode-variables (express-syntax) ; (cond (express-syntax ; (set-syntax-table express-mode-syntax-table))) ; (setq local-abbrev-table express-mode-abbrev-table) ; ;; not sure what else to put here ; ) (defvar part21-mode-map nil "Keymap for Part21 mode.") (if part21-mode-map () (setq part21-mode-map (make-sparse-keymap)) (set-keymap-name part21-mode-map 'part21-mode-map) ;; define Express specific key bindings ;; (define-key express-mode-map "\M-;" 'express-indent-for-comment) ;; (define-key express-mode-map "\e\C-q" 'express-indent-definition) ) ;;;###autoload (defun part21-mode () "Major mode for editing Part21 schemata in Emacs. (add more detail later)." (interactive) (kill-all-local-variables) (use-local-map part21-mode-map) (setq major-mode 'part21-mode) (setq mode-name "Part21") (setq local-abbrev-table part21-mode-abbrev-table) (set-syntax-table part21-mode-syntax-table) (setq case-fold-search t) ; (unless express-mode-popup-menu ; (easy-menu-define express-mode-popup-menu express-mode-map "" ; express-mode-popup-menu-1)) ; (easy-menu-add express-mode-popup-menu) ; (express-mode-variables nil) ; (font-lock-set-defaults nil) (run-hooks 'part21-mode-hook)) ;;; ;;; Font-Lock/Colorizing stuff ;;; ;; font-lock-comment-face /* ... */ ;; font-lock-string-face 'string' ;; font-lock-doc-string-face ;; font-lock-keyword-face [a-z][a-z0-9_]* ;; font-lock-function-name-face #[n]* in #[n]*[ \t]*= ;; font-lock-variable-name-face #[n]* ;; font-lock-type-face HEADER DATA ENDSEC END-ISO-10303-21 ISO-10303-21 ;; font-lock-reference-face .name. ;; font-lock-preprocessor-face ;; font-lock-warning-face (defvar part21-mode-font-lock-keywords-1 nil "Minimum highlighting for Part21 mode.") (setq part21-mode-font-lock-keywords-1 (purecopy (list '("\\" . font-lock-function-name-face) (cons (concat "\\<\\(HEADER\\|DATA\\|ENDSEC\\|" "\\(\\|END-\\)ISO-10303-21\\|\\)\\>") 'font-lock-keyword-face) ))) (defvar part21-mode-font-lock-keywords-2 nil "Medium highlighting for Part21 mode.") (setq part21-mode-font-lock-keywords-2 (purecopy (append part21-mode-font-lock-keywords-1 (list ; '("\\(#[0-9]+\\)[ \t]*=" 1 font-lock-function-name-face) '("\\" . font-lock-keyword-face) '("\\<\\#[0-9]+\\>" . font-lock-variable-name-face) )))) (defvar part21-mode-font-lock-keywords-3 nil "Maximum highlighting for EXPRESS mode.") (setq part21-mode-font-lock-keywords-3 (purecopy (append part21-mode-font-lock-keywords-2 (list '("\\<\\.[A-Z][A-Z0-9_]*\\.\\>" . font-lock-reference-face) '("\\<[A-Z][A-Z0-9_]*\\>" . font-lock-type-face) )))) (put 'part21-mode 'font-lock-defaults ;; keywords kwords-only? case-fold? syntax-alist syntax-begin '((part21-mode-font-lock-keywords-1 part21-mode-font-lock-keywords-2 part21-mode-font-lock-keywords-3) nil t ;; syntax-alist ((?! . "w") (?_ . "w")) )) ;;; part21.el ends here