(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\\|exception\\|typedef\\|cpp_namespace\\|java_package\\|php_namespace\\|ruby_namespace\\|perl_package\\|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 '("\\<\\([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)