;;; thrift.el --- Major mode for Apache Thrift files ;; Keywords: files ;; Licensed to the Apache Software Foundation (ASF) under one ;; or more contributor license agreements. See the NOTICE file ;; distributed with this work for additional information ;; regarding copyright ownership. The ASF licenses this file ;; to you under the Apache License, Version 2.0 (the ;; "License"); you may not use this file except in compliance ;; with the License. You may obtain a copy of the License at ;; ;; http://www.apache.org/licenses/LICENSE-2.0 ;; ;; Unless required by applicable law or agreed to in writing, ;; software distributed under the License is distributed on an ;; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ;; KIND, either express or implied. See the License for the ;; specific language governing permissions and limitations ;; under the License. ;; ;;; Commentary: ;; ;;; Code: (require 'font-lock) (defvar thrift-mode-hook nil) ;;;###autoload (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 '("\\<\\(include\\|struct\\|exception\\|typedef\\|const\\|enum\\|service\\|extends\\|void\\|oneway\\|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++- and sh-style 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 ?# "<" thrift-mode-syntax-table) ; sh-style comments (modify-syntax-entry ?/ ". 124" thrift-mode-syntax-table) ; c/c++-style comments (modify-syntax-entry ?* ". 23b" thrift-mode-syntax-table) (modify-syntax-entry ?\n ">" thrift-mode-syntax-table) thrift-mode-syntax-table) "Syntax table for thrift-mode") ;;;###autoload (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) ;;; thrift.el ends here