Created
January 8, 2011 02:56
-
-
Save bakkdoor/770490 to your computer and use it in GitHub Desktop.
Simple thrift mode (taken from https://github.com/kragen/stevej-emacs/blob/master/thrift-mode/thrift.el) and adjusted to highlight self-defined types, unions & namespaces nicely.
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
(require 'font-lock) | |
(defvar thrift-mode-hook nil) | |
(add-to-list 'auto-mode-alist '("\\.thrift\\'" . thrift-mode)) | |
(defvar thrift-indent-level 2 | |
"Defines 2 spaces for thrift indentation.") | |
;; syntax coloring | |
(defconst thrift-font-lock-keywords | |
(list | |
'("#.*$" . font-lock-comment-face) ;; perl style comments | |
'("\\<\\(include\\|struct\\|union\\|namespace\\|exception\\|typedef\\|php_namespace\\|const\\|enum\\|service\\|extends\\|void\\|async\\|throws\\|optional\\|required\\)\\>" . font-lock-keyword-face) ;; keywords | |
'("\\<\\(bool\\|byte\\|i16\\|i32\\|i64\\|double\\|string\\|binary\\|map\\|list\\|set\\)\\>" . font-lock-type-face) ;; built-in types | |
'("\\<\\([A-Z]\\w*\\)\\>" . font-lock-type-face) ;; typenames (unions & structs) | |
'("\\<\\([0-9]+\\)\\>" . font-lock-variable-name-face) ;; ordinals | |
'("\\<\\(\\w+\\)\\s-*(" (1 font-lock-function-name-face)) ;; functions | |
) | |
"Thrift Keywords") | |
;; indentation | |
(defun thrift-indent-line () | |
"Indent current line as Thrift code." | |
(interactive) | |
(beginning-of-line) | |
(if (bobp) | |
(indent-line-to 0) | |
(let ((not-indented t) cur-indent) | |
(if (looking-at "^[ \t]*\\(}\\|throws\\)") | |
(if (looking-at "^[ \t]*}") | |
(progn | |
(save-excursion | |
(forward-line -1) | |
(setq cur-indent (- (current-indentation) thrift-indent-level))) | |
(if (< cur-indent 0) | |
(setq cur-indent 0))) | |
(progn | |
(save-excursion | |
(forward-line -1) | |
(if (looking-at "^[ \t]*[\\.<>[:word:]]+[ \t]+[\\.<>[:word:]]+[ \t]*(") | |
(setq cur-indent (+ (current-indentation) thrift-indent-level)) | |
(setq cur-indent (current-indentation)))))) | |
(save-excursion | |
(while not-indented | |
(forward-line -1) | |
(if (looking-at "^[ \t]*}") | |
(progn | |
(setq cur-indent (current-indentation)) | |
(setq not-indented nil)) | |
(if (looking-at "^.*{[^}]*$") | |
(progn | |
(setq cur-indent (+ (current-indentation) thrift-indent-level)) | |
(setq not-indented nil)) | |
(if (bobp) | |
(setq not-indented nil))) | |
(if (looking-at "^[ \t]*throws") | |
(progn | |
(setq cur-indent (- (current-indentation) thrift-indent-level)) | |
(if (< cur-indent 0) | |
(setq cur-indent 0)) | |
(setq not-indented nil)) | |
(if (bobp) | |
(setq not-indented nil))) | |
(if (looking-at "^[ \t]*[\\.<>[:word:]]+[ \t]+[\\.<>[:word:]]+[ \t]*([^)]*$") | |
(progn | |
(setq cur-indent (+ (current-indentation) thrift-indent-level)) | |
(setq not-indented nil)) | |
(if (bobp) | |
(setq not-indented nil))) | |
(if (looking-at "^[ \t]*\\/\\*") | |
(progn | |
(setq cur-indent (+ (current-indentation) 1)) | |
(setq not-indented nil)) | |
(if (bobp) | |
(setq not-indented nil))) | |
(if (looking-at "^[ \t]*\\*\\/") | |
(progn | |
(setq cur-indent (- (current-indentation) 1)) | |
(setq not-indented nil)) | |
(if (bobp) | |
(setq not-indented nil))) | |
)))) | |
(if cur-indent | |
(indent-line-to cur-indent) | |
(indent-line-to 0))))) | |
;; C/C++ comments; also allowing underscore in words | |
(defvar thrift-mode-syntax-table | |
(let ((thrift-mode-syntax-table (make-syntax-table))) | |
(modify-syntax-entry ?_ "w" thrift-mode-syntax-table) | |
(modify-syntax-entry ?/ ". 124b" thrift-mode-syntax-table) | |
(modify-syntax-entry ?* ". 23" thrift-mode-syntax-table) | |
(modify-syntax-entry ?\n "> b" thrift-mode-syntax-table) | |
thrift-mode-syntax-table) | |
"Syntax table for thrift-mode") | |
(defun thrift-mode () | |
"Mode for editing Thrift files" | |
(interactive) | |
(kill-all-local-variables) | |
(set-syntax-table thrift-mode-syntax-table) | |
(set (make-local-variable 'font-lock-defaults) '(thrift-font-lock-keywords)) | |
(setq major-mode 'thrift-mode) | |
(setq mode-name "Thrift") | |
(run-hooks 'thrift-mode-hook) | |
(set (make-local-variable 'indent-line-function) 'thrift-indent-line) | |
) | |
(provide 'thrift-mode) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
beside I find https://raw.githubusercontent.com/ndimiduk/.emacs.d/master/ndimiduk/thrift-mode.el