diff --git a/tools/hept-mode.el b/tools/hept-mode.el new file mode 100644 index 0000000..ec25399 --- /dev/null +++ b/tools/hept-mode.el @@ -0,0 +1,153 @@ +;;; hept-mode.el --- major mode for Heptagon files + +;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +;; +;; Author: adrien.guatto@ens.fr +;; Keywords: languages +;; Version: 1.0 +;; X-URL: http://heptagon.gforge.inria.fr + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Major mode for editing Heptagon files, usually files ending +;; with `.ept' and `.epi'. + +;; This package provides the following features: +;; * Syntax coloring (via font-lock) for grammar symbols and +;; builtin functions and variables +;; * Indentation for the current line (TAB) and selected region (C-M-\). +;; * Switching between file.vert and file.frag +;; with S-lefttab (via ff-find-other-file) + +;;; Installation: + +;; If hept-mode is not part of your distribution, put this file into your +;; load-path and the following into your ~/.emacs: +;; (autoload 'hept-mode "hept-mode" nil t) +;; (add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode)) +;; (add-to-list 'auto-mode-alist '("\\.epi\\'" . hept-mode)) + +;; To customize, use `M-x customize-group RET antlr RET' or the custom browser +;; (Emacs->Programming->Languages->Antlr). + +;;; Code: + +(provide 'hept-mode) + +(eval-when-compile + (require 'find-file)) + +(defconst hept-version "1.0" + "Heptagon major mode version number.") + +(defvar hept-mode-hook nil) + +(defvar hept-mode-map + (let ((hept-mode-map (make-sparse-keymap))) + (define-key hept-mode-map [S-iso-lefttab] 'ff-find-other-file) + hept-mode-map) + "Keymap for Heptagon major mode") + +(add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode)) +(add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode)) + +;; (regexp-opt '( +;; "fun" "node" "returns" "open" "inlined" "let" "tel" "var" "const" +;; ) +;; t) + +;; (regexp-opt '( +;; "bool" "int" "float" +;; ) +;; t) + +;; (regexp-opt '( +;; "with" "merge" "when" "whenot" +;; "fby" "pre" "on" "end" "automaton" "state" +;; "switch" "every" "reset" "until" "unless" +;; "last" "if" "then" "else" "default" "do" "done" "in" "continue" +;; "contract" "assume" "enforce" "with" +;; "map" "fold" "mapfold" "mapi" "foldi" "mapfoldi" +;; ) +;; t) + +(defconst hept-font-lock-keywords-1 + (list + '( + "\\<\\(const\\|fun\\|inlined\\|let\\|node\\|open\\|returns\\|tel\\|var\\)\\>" + . + font-lock-variable-name-face) + '("\\<\\(bool\\|\\(?:floa\\|in\\)t\\)\\>" + . + font-lock-builtin-face) + '( + "\\<\\(a\\(?:ssume\\|utomaton\\)\\|cont\\(?:inue\\|ract\\)\\|d\\(?:efault\\|o\\(?:ne\\)?\\)\\|e\\(?:lse\\|n\\(?:d\\|force\\)\\|very\\)\\|f\\(?:by\\|oldi?\\)\\|i[fn]\\|last\\|m\\(?:ap\\(?:foldi?\\|i\\)?\\|erge\\)\\|on\\|pre\\|reset\\|s\\(?:tate\\|witch\\)\\|then\\|un\\(?:less\\|til\\)\\|w\\(?:hen\\(?:ot\\)?\\|ith\\)\\)\\>" + . + font-lock-keyword-face) + ) + "Minimal highlighting expressions for Heptagon mode") + +(defvar hept-font-lock-keywords hept-font-lock-keywords-1 + "Default highlighting expressions for Heptagon mode") + +(defvar hept-mode-syntax-table + (let ((hept-mode-syntax-table (make-syntax-table))) + (modify-syntax-entry ?( "()1n" hept-mode-syntax-table) + (modify-syntax-entry ?) ")(4n" hept-mode-syntax-table) + (modify-syntax-entry ?* ". 23" hept-mode-syntax-table) + (modify-syntax-entry ?< "(>" hept-mode-syntax-table) + (modify-syntax-entry ?> ")<" hept-mode-syntax-table) + (modify-syntax-entry ?\ "\\" hept-mode-syntax-table) + (modify-syntax-entry ?_ "_" hept-mode-syntax-table) + (modify-syntax-entry ?: "." hept-mode-syntax-table) +; (modify-syntax-entry ?\n "> b" hept-mode-syntax-table) + hept-mode-syntax-table) + "Syntax table for hept-mode") + +(defun hept-indent-line () + "Indent current line as Heptagon code" + (interactive) + (if (bobp) + (indent-line-to 0) + (let ((not-indented t) cur-indent) + (save-excursion + (while not-indented + (forward-line -1) + (if (looking-at "^[ \t]*\\(tel\\|end\\|done\\)") + (progn + (setq cur-indent (current-indentation)) + (setq not-indented nil)) + ; Check for rule 4 + (if (looking-at + "^[ \t]*\\(let\\|automaton\\)") + (progn + (setq cur-indent (+ (current-indentation) default-tab-width)) + (setq not-indented nil)) + (if (looking-at "^[ \t]*\\(do\\)") + (progn + (setq cur-indent (+ (current-indentation) 3)) + (setq not-indented nil)) + (if (bobp) ; Check for rule 5 + (setq not-indented nil))))))) + (if cur-indent + (indent-line-to cur-indent) + (indent-line-to 0))))) + +(defvar hept-other-file-alist + '(("\\.ept$" (".epi")) + ("\\.epi$" (".ept"))) + "Alist of extensions to find given the current file's extension") + +(define-derived-mode hept-mode fundamental-mode "Heptagon" + "Major mode for editing Heptagon files." + :syntax-table hept-mode-syntax-table + (set (make-local-variable 'comment-start) "(*") + (set (make-local-variable 'comment-end) "*)") + (set (make-local-variable 'indent-line-function) 'hept-indent-line) + (set (make-local-variable 'font-lock-defaults) '(hept-font-lock-keywords)) + (set (make-local-variable 'ff-other-file-alist) 'hept-other-file-alist) + ) + +;;; hept-mode.el ends here \ No newline at end of file