Created
January 22, 2015 06:23
-
-
Save non/77f107f1989f189c9df5 to your computer and use it in GitHub Desktop.
This is something I whipped together to make editing Emily files in Emacs a bit nicer.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; major mode for the emily programming language | |
;; | |
;; by erik osheim | |
;; | |
;; project at: https://bitbucket.org/runhello/emily | |
;; see emily/doc/manual.md for more information. | |
;; TODO: | |
;; 1. indentation support | |
;; 2. special support for definitions (e.g. f ^x = x + 1) | |
;; 3. beef up symbol table support | |
;; 3. consider highlighting delimiters/symbolic operators | |
;; 4. repl integration? | |
;; 5. ?????? | |
(defvar emily-mode-hook nil) | |
(defvar emily-mode-map | |
(let ((map (make-sparse-keymap))) | |
(define-key map "\C-j" 'newline-and-indent) | |
map) | |
"Keymap for Emily major mode") | |
(add-to-list 'auto-mode-alist '("\\.em\\'" . emily-mode)) | |
(defconst emily-font-lock-keywords-1 | |
(list | |
`(,(regexp-opt '("while" "tern" "return" "loop" "let" "if" "each" "do") t) . font-lock-builtin-face)) | |
"Minimal highlighting expressions for Emily mode") | |
(defconst emily-font-lock-keywords-2 | |
(append | |
emily-font-lock-keywords-1 | |
(list | |
`(,(regexp-opt '("true" "null") t) . font-lock-constant-face) | |
`(,(regexp-opt '("this" "current") t) . font-lock-keyword-face))) | |
"Additional Keywords to highlight in Emily mode") | |
(defconst emily-font-lock-keywords-3 | |
(append | |
emily-font-lock-keywords-2 | |
(list | |
`(,(regexp-opt '("xor" "times" "thisUpdate" "thisTransplant" "thisInit" "thisFreeze" "set" "println" "print" "or" "nullfn" "not" "negate" "minus" "lte" "lt" "ln" "has" "gte" "gt" "eq" "divide" "append" "and" "add") t) . font-lock-keyword-face))) | |
"Full highlighting in Emily mode") | |
(defvar emily-font-lock-keywords emily-font-lock-keywords-3 | |
"Default highlighting expressions for Emily mode") | |
(defvar emily-mode-syntax-table | |
(let ((st (make-syntax-table))) | |
(modify-syntax-entry ?( "(" st) | |
(modify-syntax-entry ?) ")" st) | |
(modify-syntax-entry ?{ "(" st) | |
(modify-syntax-entry ?} ")" st) | |
(modify-syntax-entry ?[ "(" st) | |
(modify-syntax-entry ?] ")" st) | |
(modify-syntax-entry ?# "<" st) | |
(modify-syntax-entry ?\n ">" st) | |
(modify-syntax-entry ?\r ">" st) | |
st) | |
"Syntax table for emily-mode") | |
(defun emily-mode () | |
"Major mode for editing Workflow Process Description Language files" | |
(interactive) | |
(kill-all-local-variables) | |
(set-syntax-table emily-mode-syntax-table) | |
;;(use-local-map emily-mode-map) | |
(set (make-local-variable 'font-lock-defaults) '(emily-font-lock-keywords)) | |
;;(set (make-local-variable 'indent-line-function) 'emily-indent-line) | |
(setq major-mode 'emily-mode) | |
(setq mode-name "Emily") | |
(run-hooks 'emily-mode-hook)) | |
(provide 'emily) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment