Skip to content

Instantly share code, notes, and snippets.

@non
Created January 22, 2015 06:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save non/77f107f1989f189c9df5 to your computer and use it in GitHub Desktop.
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.
;; 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