Heptagon mode for GNU/Emacs.
This commit is contained in:
parent
5ac3a7f028
commit
6afb0a4f52
1 changed files with 153 additions and 0 deletions
153
tools/hept-mode.el
Normal file
153
tools/hept-mode.el
Normal file
|
@ -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
|
Loading…
Reference in a new issue