;;
;; Euphoria 3.1.1 syntax coloring for GNU Emacs 24.5.1
;;
;; Author:  Shian Lee
;; Credit:  https://www.emacswiki.org/emacs/GenericMode
;; Website: http://www.rapideuphoria.com
;;
;; Install:
;;
;; - Copy this file to:  ~/.emacs
;;   ( example: cp ./emacs ~/.emacs )
;;
;;   notice: this may override an existing ~/.emacs file, so you may want to
;;           append to an existing file ( example: cat ./emacs >> ~/.emacs )
;;
;; - Restart emacs
;;   ( add -nw switch to run emacs in terminal, example: emacs -nw csort.ex )
;;
;; Note:
;;
;; - To access the menu in emacs press F10 (in terminal F10 must be disabled...).
;;
;; - Euphoria 3.1.1 filetypes for DOS, Unix & Windows (not mandatory):
;;   *.e, *.eu, *.ew, *.ex, *.exu, *.exw
;;
;; History:
;;
;; - 2017: Started by Shian Lee


(require 'generic-x)    ;; we need this for defining Generic Modes


(define-generic-mode 'euphoria3-mode	;; name of the mode to create

        ;; comments start with '--' (using font-lock-comment-face)
	'("--")

	;; keywords list (using font-lock-keyword-face - skip it):
	;; 	'("if" "end" "then" ...)
	nil

        ;; anything else
	'(
		;; Keywords/Builtins for Debug - from $EUDIR/bin/keywords.e:
		("\\_<with\\_>" . font-lock-preprocessor-face)
		("\\_<without\\_>" . font-lock-preprocessor-face)
		("\\_<trace\\_>" . font-lock-preprocessor-face)
		("\\_<profile\\_>" . font-lock-preprocessor-face)
		("\\_<profile_time\\_>" . font-lock-preprocessor-face)
		("\\_<warning\\_>" . font-lock-preprocessor-face)
		("\\_<type_check\\_>" . font-lock-preprocessor-face)

		;; Keywords - from $EUDIR/bin/keywords.e:
		("\\_<if\\_>" . font-lock-keyword-face)
		("\\_<end\\_>" . font-lock-keyword-face)
		("\\_<then\\_>" . font-lock-keyword-face)
		("\\_<procedure\\_>" . font-lock-keyword-face)
		("\\_<else\\_>" . font-lock-keyword-face)
		("\\_<for\\_>" . font-lock-keyword-face)
		("\\_<return\\_>" . font-lock-keyword-face)
		("\\_<do\\_>" . font-lock-keyword-face)
		("\\_<elsif\\_>" . font-lock-keyword-face)
		("\\_<while\\_>" . font-lock-keyword-face)
		("\\_<type\\_>" . font-lock-keyword-face)
		("\\_<constant\\_>" . font-lock-keyword-face)
		("\\_<to\\_>" . font-lock-keyword-face)
		("\\_<and\\_>" . font-lock-keyword-face)
		("\\_<or\\_>" . font-lock-keyword-face)
		("\\_<exit\\_>" . font-lock-keyword-face)
		("\\_<function\\_>" . font-lock-keyword-face)
		("\\_<global\\_>" . font-lock-keyword-face)
		("\\_<by\\_>" . font-lock-keyword-face)
		("\\_<not\\_>" . font-lock-keyword-face)
		("\\_<include\\_>" . font-lock-keyword-face)
		("\\_<xor\\_>" . font-lock-keyword-face)

		;; Builtins - from $EUDIR/bin/keywords.e:
		("\\_<length\\_>" . font-lock-builtin-face)
		("\\_<puts\\_>" . font-lock-builtin-face)
		("\\_<integer\\_>" . font-lock-builtin-face)
		("\\_<sequence\\_>" . font-lock-builtin-face)
		("\\_<position\\_>" . font-lock-builtin-face)
		("\\_<object\\_>" . font-lock-builtin-face)
		("\\_<append\\_>" . font-lock-builtin-face)
		("\\_<prepend\\_>" . font-lock-builtin-face)
		("\\_<print\\_>" . font-lock-builtin-face)
		("\\_<printf\\_>" . font-lock-builtin-face)
		("\\_<clear_screen\\_>" . font-lock-builtin-face)
		("\\_<floor\\_>" . font-lock-builtin-face)
		("\\_<getc\\_>" . font-lock-builtin-face)
		("\\_<gets\\_>" . font-lock-builtin-face)
		("\\_<get_key\\_>" . font-lock-builtin-face)
		("\\_<rand\\_>" . font-lock-builtin-face)
		("\\_<repeat\\_>" . font-lock-builtin-face)
		("\\_<atom\\_>" . font-lock-builtin-face)
		("\\_<compare\\_>" . font-lock-builtin-face)
		("\\_<find\\_>" . font-lock-builtin-face)
		("\\_<match\\_>" . font-lock-builtin-face)
		("\\_<time\\_>" . font-lock-builtin-face)
		("\\_<command_line\\_>" . font-lock-builtin-face)
		("\\_<open\\_>" . font-lock-builtin-face)
		("\\_<close\\_>" . font-lock-builtin-face)
		("\\_<getenv\\_>" . font-lock-builtin-face)
		("\\_<sqrt\\_>" . font-lock-builtin-face)
		("\\_<sin\\_>" . font-lock-builtin-face)
		("\\_<cos\\_>" . font-lock-builtin-face)
		("\\_<tan\\_>" . font-lock-builtin-face)
		("\\_<log\\_>" . font-lock-builtin-face)
		("\\_<system\\_>" . font-lock-builtin-face)
		("\\_<date\\_>" . font-lock-builtin-face)
		("\\_<remainder\\_>" . font-lock-builtin-face)
		("\\_<power\\_>" . font-lock-builtin-face)
		("\\_<machine_func\\_>" . font-lock-builtin-face)
		("\\_<machine_proc\\_>" . font-lock-builtin-face)
		("\\_<abort\\_>" . font-lock-builtin-face)
		("\\_<peek\\_>" . font-lock-builtin-face)
		("\\_<poke\\_>" . font-lock-builtin-face)
		("\\_<call\\_>" . font-lock-builtin-face)
		("\\_<sprintf\\_>" . font-lock-builtin-face)
		("\\_<arctan\\_>" . font-lock-builtin-face)
		("\\_<and_bits\\_>" . font-lock-builtin-face)
		("\\_<or_bits\\_>" . font-lock-builtin-face)
		("\\_<xor_bits\\_>" . font-lock-builtin-face)
		("\\_<not_bits\\_>" . font-lock-builtin-face)
		("\\_<pixel\\_>" . font-lock-builtin-face)
		("\\_<get_pixel\\_>" . font-lock-builtin-face)
		("\\_<mem_copy\\_>" . font-lock-builtin-face)
		("\\_<mem_set\\_>" . font-lock-builtin-face)
		("\\_<c_proc\\_>" . font-lock-builtin-face)
		("\\_<c_func\\_>" . font-lock-builtin-face)
		("\\_<routine_id\\_>" . font-lock-builtin-face)
		("\\_<call_proc\\_>" . font-lock-builtin-face)
		("\\_<call_func\\_>" . font-lock-builtin-face)
		("\\_<poke4\\_>" . font-lock-builtin-face)
		("\\_<peek4s\\_>" . font-lock-builtin-face)
		("\\_<peek4u\\_>" . font-lock-builtin-face)
		("\\_<equal\\_>" . font-lock-builtin-face)
		("\\_<system_exec\\_>" . font-lock-builtin-face)
		("\\_<platform\\_>" . font-lock-builtin-face)
		("\\_<task_create\\_>" . font-lock-builtin-face)
		("\\_<task_schedule\\_>" . font-lock-builtin-face)
		("\\_<task_yield\\_>" . font-lock-builtin-face)
		("\\_<task_self\\_>" . font-lock-builtin-face)
		("\\_<task_suspend\\_>" . font-lock-builtin-face)
		("\\_<task_list\\_>" . font-lock-builtin-face)
		("\\_<task_status\\_>" . font-lock-builtin-face)
		("\\_<task_clock_stop\\_>" . font-lock-builtin-face)
		("\\_<task_clock_start\\_>" . font-lock-builtin-face)
		("\\_<find_from\\_>" . font-lock-builtin-face)
		("\\_<match_from\\_>" . font-lock-builtin-face)

		;; Builtins shortcuts for length() and print():
                ("\\$" . font-lock-builtin-face)
                ("?" . font-lock-builtin-face)

		;; Library functions - from $EUDIR/doc/library.doc:
		("\\_<reverse\\_>" . font-lock-function-name-face)
		("\\_<sort\\_>" . font-lock-function-name-face)
		("\\_<custom_sort\\_>" . font-lock-function-name-face)
		("\\_<lower\\_>" . font-lock-function-name-face)
		("\\_<upper\\_>" . font-lock-function-name-face)
		("\\_<wildcard_match\\_>" . font-lock-function-name-face)
		("\\_<wildcard_file\\_>" . font-lock-function-name-face)
		("\\_<arcsin\\_>" . font-lock-function-name-face)
		("\\_<arccos\\_>" . font-lock-function-name-face)
		("\\_<PI\\_>" . font-lock-function-name-face)
		("\\_<flush\\_>" . font-lock-function-name-face)
		("\\_<lock_file\\_>" . font-lock-function-name-face)
		("\\_<unlock_file\\_>" . font-lock-function-name-face)
		("\\_<pretty_print\\_>" . font-lock-function-name-face)
		("\\_<sprint\\_>" . font-lock-function-name-face)
		("\\_<get_bytes\\_>" . font-lock-function-name-face)
		("\\_<prompt_string\\_>" . font-lock-function-name-face)
		("\\_<wait_key\\_>" . font-lock-function-name-face)
		("\\_<get\\_>" . font-lock-function-name-face)
		("\\_<prompt_number\\_>" . font-lock-function-name-face)
		("\\_<value\\_>" . font-lock-function-name-face)
		("\\_<seek\\_>" . font-lock-function-name-face)
		("\\_<where\\_>" . font-lock-function-name-face)
		("\\_<current_dir\\_>" . font-lock-function-name-face)
		("\\_<chdir\\_>" . font-lock-function-name-face)
		("\\_<dir\\_>" . font-lock-function-name-face)
		("\\_<walk_dir\\_>" . font-lock-function-name-face)
		("\\_<allow_break\\_>" . font-lock-function-name-face)
		("\\_<check_break\\_>" . font-lock-function-name-face)
		("\\_<get_mouse\\_>" . font-lock-function-name-face)
		("\\_<mouse_events\\_>" . font-lock-function-name-face)
		("\\_<mouse_pointer\\_>" . font-lock-function-name-face)
		("\\_<tick_rate\\_>" . font-lock-function-name-face)
		("\\_<sleep\\_>" . font-lock-function-name-face)
		("\\_<get_position\\_>" . font-lock-function-name-face)
		("\\_<graphics_mode\\_>" . font-lock-function-name-face)
		("\\_<video_config\\_>" . font-lock-function-name-face)
		("\\_<scroll\\_>" . font-lock-function-name-face)
		("\\_<wrap\\_>" . font-lock-function-name-face)
		("\\_<text_color\\_>" . font-lock-function-name-face)
		("\\_<bk_color\\_>" . font-lock-function-name-face)
		("\\_<palette\\_>" . font-lock-function-name-face)
		("\\_<all_palette\\_>" . font-lock-function-name-face)
		("\\_<get_all_palette\\_>" . font-lock-function-name-face)
		("\\_<read_bitmap\\_>" . font-lock-function-name-face)
		("\\_<save_bitmap\\_>" . font-lock-function-name-face)
		("\\_<get_active_page\\_>" . font-lock-function-name-face)
		("\\_<set_active_page\\_>" . font-lock-function-name-face)
		("\\_<get_display_page\\_>" . font-lock-function-name-face)
		("\\_<set_display_page\\_>" . font-lock-function-name-face)
		("\\_<sound\\_>" . font-lock-function-name-face)
		("\\_<cursor\\_>" . font-lock-function-name-face)
		("\\_<text_rows\\_>" . font-lock-function-name-face)
		("\\_<get_screen_char\\_>" . font-lock-function-name-face)
		("\\_<put_screen_char\\_>" . font-lock-function-name-face)
		("\\_<save_text_image\\_>" . font-lock-function-name-face)
		("\\_<display_text_image\\_>" . font-lock-function-name-face)
		("\\_<draw_line\\_>" . font-lock-function-name-face)
		("\\_<polygon\\_>" . font-lock-function-name-face)
		("\\_<ellipse\\_>" . font-lock-function-name-face)
		("\\_<save_screen\\_>" . font-lock-function-name-face)
		("\\_<save_image\\_>" . font-lock-function-name-face)
		("\\_<display_image\\_>" . font-lock-function-name-face)
		("\\_<dos_interrupt\\_>" . font-lock-function-name-face)
		("\\_<allocate\\_>" . font-lock-function-name-face)
		("\\_<free\\_>" . font-lock-function-name-face)
		("\\_<allocate_low\\_>" . font-lock-function-name-face)
		("\\_<free_low\\_>" . font-lock-function-name-face)
		("\\_<allocate_string\\_>" . font-lock-function-name-face)
		("\\_<register_block\\_>" . font-lock-function-name-face)
		("\\_<unregister_block\\_>" . font-lock-function-name-face)
		("\\_<get_vector\\_>" . font-lock-function-name-face)
		("\\_<set_vector\\_>" . font-lock-function-name-face)
		("\\_<lock_memory\\_>" . font-lock-function-name-face)
		("\\_<int_to_bytes\\_>" . font-lock-function-name-face)
		("\\_<bytes_to_int\\_>" . font-lock-function-name-face)
		("\\_<int_to_bits\\_>" . font-lock-function-name-face)
		("\\_<bits_to_int\\_>" . font-lock-function-name-face)
		("\\_<atom_to_float64\\_>" . font-lock-function-name-face)
		("\\_<atom_to_float32\\_>" . font-lock-function-name-face)
		("\\_<float64_to_atom\\_>" . font-lock-function-name-face)
		("\\_<float32_to_atom\\_>" . font-lock-function-name-face)
		("\\_<set_rand\\_>" . font-lock-function-name-face)
		("\\_<use_vesa\\_>" . font-lock-function-name-face)
		("\\_<crash_file\\_>" . font-lock-function-name-face)
		("\\_<crash_message\\_>" . font-lock-function-name-face)
		("\\_<crash_routine\\_>" . font-lock-function-name-face)
		("\\_<open_dll\\_>" . font-lock-function-name-face)
		("\\_<define_c_proc\\_>" . font-lock-function-name-face)
		("\\_<define_c_func\\_>" . font-lock-function-name-face)
		("\\_<define_c_var\\_>" . font-lock-function-name-face)
		("\\_<call_back\\_>" . font-lock-function-name-face)
		("\\_<message_box\\_>" . font-lock-function-name-face)
		("\\_<free_console\\_>" . font-lock-function-name-face)
		("\\_<instance\\_>" . font-lock-function-name-face)

		;; Library function - from $EUDIR/doc/database.doc:
		("\\_<db_create\\_>" . font-lock-function-name-face)
		("\\_<db_open\\_>" . font-lock-function-name-face)
		("\\_<db_select\\_>" . font-lock-function-name-face)
		("\\_<db_close\\_>" . font-lock-function-name-face)
		("\\_<db_create_table\\_>" . font-lock-function-name-face)
		("\\_<db_select_table\\_>" . font-lock-function-name-face)
		("\\_<db_rename_table\\_>" . font-lock-function-name-face)
		("\\_<db_delete_table\\_>" . font-lock-function-name-face)
		("\\_<db_table_list\\_>" . font-lock-function-name-face)
		("\\_<db_table_size\\_>" . font-lock-function-name-face)
		("\\_<db_find_key\\_>" . font-lock-function-name-face)
		("\\_<db_record_key\\_>" . font-lock-function-name-face)
		("\\_<db_record_data\\_>" . font-lock-function-name-face)
		("\\_<db_insert\\_>" . font-lock-function-name-face)
		("\\_<db_delete_record\\_>" . font-lock-function-name-face)
		("\\_<db_replace_data\\_>" . font-lock-function-name-face)
		("\\_<db_compress\\_>" . font-lock-function-name-face)
		("\\_<db_dump\\_>" . font-lock-function-name-face)
		("\\_<db_fatal_id\\_>" . font-lock-function-name-face)

		;; Global Library variables
    		;; graphics.e - colors
		("\\_<BLACK\\_>" . font-lock-constant-face)
		("\\_<GREEN\\_>" . font-lock-constant-face)
		("\\_<MAGENTA\\_>" . font-lock-constant-face)
		("\\_<WHITE\\_>" . font-lock-constant-face)
		("\\_<GRAY\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_GREEN\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_MAGENTA\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_WHITE\\_>" . font-lock-constant-face)
		("\\_<BLUE\\_>" . font-lock-constant-face)
		("\\_<CYAN\\_>" . font-lock-constant-face)
		("\\_<RED\\_>" . font-lock-constant-face)
		("\\_<BROWN\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_BLUE\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_CYAN\\_>" . font-lock-constant-face)
		("\\_<BRIGHT_RED\\_>" . font-lock-constant-face)
		("\\_<YELLOW\\_>" . font-lock-constant-face)

    		;; graphics.e - video_config()
		("\\_<VC_COLOR\\_>" . font-lock-constant-face)
		("\\_<VC_MODE\\_>" . font-lock-constant-face)
		("\\_<VC_LINES\\_>" . font-lock-constant-face)
		("\\_<VC_COLUMNS\\_>" . font-lock-constant-face)
		("\\_<VC_XPIXELS\\_>" . font-lock-constant-face)
		("\\_<VC_YPIXELS\\_>" . font-lock-constant-face)
		("\\_<VC_NCOLORS\\_>" . font-lock-constant-face)
		("\\_<VC_PAGES\\_>" . font-lock-constant-face)

    		;; file.e - dir()
		("\\_<D_NAME\\_>" . font-lock-constant-face)
		("\\_<D_ATTRIBUTES\\_>" . font-lock-constant-face)
		("\\_<D_SIZE\\_>" . font-lock-constant-face)
		("\\_<D_YEAR\\_>" . font-lock-constant-face)
		("\\_<D_MONTH\\_>" . font-lock-constant-face)
		("\\_<D_DAY\\_>" . font-lock-constant-face)
		("\\_<D_HOUR\\_>" . font-lock-constant-face)
		("\\_<D_MINUTE\\_>" . font-lock-constant-face)
		("\\_<D_SECOND\\_>" . font-lock-constant-face)

                ;; Delimiters
                ("(" . font-lock-preprocessor-face)
                (")" . font-lock-preprocessor-face)
                ("\\[" . font-lock-preprocessor-face)
                ("]" . font-lock-preprocessor-face)
                ("{" . font-lock-preprocessor-face)
                ("}" . font-lock-preprocessor-face)
                ("," . font-lock-preprocessor-face)
                (":" . font-lock-preprocessor-face)
                ("\\.\\." . font-lock-preprocessor-face)

                ;; Others (string "..." is builtin in emacs, I assume)
                ("'\\\\?.'" . font-lock-string-face)    ;; character 'x' '\x'
                ("#!.*" . font-lock-comment-face)       ;; shebang line
		("#[0-9A-F]+" . font-lock-string-face)	;; Hexadecimal integer
        )

	;; files for which to activate this mode:
	'(
                ".e\\'" ".eu\\'" ".ew\\'" ".ex\\'" ".exu\\'" ".exw\\'"
                ".E\\'" ".EU\\'" ".EW\\'" ".EX\\'" ".EXU\\'" ".EXW\\'"
        )

	;; other functions to call:
	nil

	;; doc string for this mode:
	"A mode for Euphoria 3.1.1 files"
)

;;; Euphoria 3.1.1 syntax coloring ends here


