Index: utils/emacs/llvm-mode.el =================================================================== --- utils/emacs/llvm-mode.el +++ utils/emacs/llvm-mode.el @@ -8,22 +8,25 @@ ;;; Code: -(defvar llvm-mode-syntax-table nil +(defvar llvm-mode-syntax-table + (let ((table (make-syntax-table))) + (modify-syntax-entry ?% "w" table) + (modify-syntax-entry ?. "w" table) + (modify-syntax-entry ?\; "< " table) + (modify-syntax-entry ?\n "> " table) + table) "Syntax table used while in LLVM mode.") + (defvar llvm-font-lock-keywords (list - ;; Comments - '(";.*" . font-lock-comment-face) ;; Variables '("%[-a-zA-Z$\._][-a-zA-Z$\._0-9]*" . font-lock-variable-name-face) ;; Labels '("[-a-zA-Z$\._0-9]+:" . font-lock-variable-name-face) - ;; Strings - '("\"[^\"]+\"" . font-lock-string-face) ;; Unnamed variable slots '("%[-]?[0-9]+" . font-lock-variable-name-face) ;; Types - `(,(regexp-opt '("void" "i1" "i8" "i16" "i32" "i64" "i128" "float" "double" "type" "label" "opaque") 'symbol) . font-lock-type-face) + `(,(regexp-opt '("void" "i1" "i8" "i16" "i32" "i64" "i128" "float" "double" "type" "label" "opaque") 'symbols) . font-lock-type-face) ;; Integer literals '("\\b[-]?[0-9]+\\b" . font-lock-preprocessor-face) ;; Floating point constants @@ -56,84 +59,22 @@ ;; Metadata types `(,(regexp-opt '("distinct") 'symbols) . font-lock-keyword-face) ;; Use-list order directives - `(,(regexp-opt '("uselistorder" "uselistorder_bb") 'symbols) . font-lock-keyword-face) - - ) - "Syntax highlighting for LLVM." - ) - -;; ---------------------- Syntax table --------------------------- -;; Shamelessly ripped from jasmin.el -;; URL: http://www.neilvandyke.org/jasmin-emacs/jasmin.el.html - -(if (not llvm-mode-syntax-table) - (progn - (setq llvm-mode-syntax-table (make-syntax-table)) - (mapc (function (lambda (n) - (modify-syntax-entry (aref n 0) - (aref n 1) - llvm-mode-syntax-table))) - '( - ;; whitespace (` ') - [?\^m " "] - [?\f " "] - [?\n " "] - [?\t " "] - [?\ " "] - ;; word constituents (`w') - ;;[?< "w"] - ;;[?> "w"] - [?% "w"] - ;;[?_ "w "] - ;; comments - [?\; "< "] - [?\n "> "] - ;;[?\r "> "] - ;;[?\^m "> "] - ;; symbol constituents (`_') - ;; punctuation (`.') - ;; open paren (`(') - ;; close paren (`)') - ;; string quote ('"') - [?\" "\""])))) - -;; --------------------- Abbrev table ----------------------------- + `(,(regexp-opt '("uselistorder" "uselistorder_bb") 'symbols) . font-lock-keyword-face)) + "Syntax highlighting for LLVM.") -(defvar llvm-mode-abbrev-table nil - "Abbrev table used while in LLVM mode.") -(define-abbrev-table 'llvm-mode-abbrev-table ()) - -(defvar llvm-mode-hook nil) -(defvar llvm-mode-map nil) ; Create a mode-specific keymap. - -(if (not llvm-mode-map) - () ; Do not change the keymap if it is already set up. - (setq llvm-mode-map (make-sparse-keymap)) - (define-key llvm-mode-map "\t" 'tab-to-tab-stop) - (define-key llvm-mode-map "\es" 'center-line) - (define-key llvm-mode-map "\eS" 'center-paragraph)) +;; Emacs 23 compatibility. +(defalias 'llvm-mode-prog-mode + (if (fboundp 'prog-mode) + 'prog-mode + 'fundamental-mode)) ;;;###autoload -(defun llvm-mode () +(define-derived-mode llvm-mode llvm-mode-prog-mode "LLVM" "Major mode for editing LLVM source files. \\{llvm-mode-map} Runs `llvm-mode-hook' on startup." - (interactive) - (kill-all-local-variables) - (use-local-map llvm-mode-map) ; Provides the local keymap. - (setq major-mode 'llvm-mode) - - (make-local-variable 'font-lock-defaults) - (setq major-mode 'llvm-mode ; This is how describe-mode - ; finds the doc string to print. - mode-name "LLVM" ; This name goes into the modeline. - font-lock-defaults `(llvm-font-lock-keywords)) - - (setq local-abbrev-table llvm-mode-abbrev-table) - (set-syntax-table llvm-mode-syntax-table) - (setq comment-start ";") - (run-hooks 'llvm-mode-hook)) ; Finally, this permits the user to - ; customize the mode with a hook. + (setq font-lock-defaults `(llvm-font-lock-keywords)) + (setq comment-start ";")) ;; Associate .ll files with llvm-mode ;;;###autoload