summaryrefslogtreecommitdiff
path: root/ACE/bin/mpc-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/bin/mpc-mode.el')
-rw-r--r--ACE/bin/mpc-mode.el185
1 files changed, 185 insertions, 0 deletions
diff --git a/ACE/bin/mpc-mode.el b/ACE/bin/mpc-mode.el
new file mode 100644
index 00000000000..3301f0daa37
--- /dev/null
+++ b/ACE/bin/mpc-mode.el
@@ -0,0 +1,185 @@
+;;; mpc-mode.el --- Makefile Project Creator mode for Emacs
+
+;; Author: Jules Colding <colding@42tools.com>
+;; Maintainer: Jules Colding
+;; Keywords: languages, faces, mpc
+
+;; Copyright (C) 2008 Jules Colding <colding@42tools.com>
+;;
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;; A major mode for editing MPC input. Please see:
+;;
+;; http://downloads.ociweb.com/MPC/MakeProjectCreator.pdf
+;;
+;; Derived from autoconf-mode.el by Martin Buchholz (martin@xemacs.org)
+
+
+;; Many thanks to the follwing kind people for extensions, bugfixes and
+;; other contributions:
+;;
+;; * William R. Otte <wotte@dre.vanderbilt.edu>
+;; Indentation and syntax table.
+;;
+
+;; Put this file somewhere in your emacs load path and add the following
+;; to your Emacs configuration file:
+;;
+;; (require 'mpc-mode)
+;;
+;;
+;; You may also add something like this to the top of your MPC files
+;; to force a specific indentation mode:
+;;
+;; // -*- Mode: MPC; tab-width: 2; indent-tabs-mode: t; -*-
+
+;;; Code:
+
+(require 'font-lock)
+
+(defvar mpc-mode-hook nil)
+
+(defvar mpc-mode-map
+ (let ((mpc-mode-map (make-sparse-keymap)))
+ (define-key mpc-mode-map '[(control c) (control c)] 'comment-region)
+ (define-key mpc-mode-map '[(control j)] 'newline-and-indent)
+ mpc-mode-map)
+ "Keymap for MPC major mode")
+
+(defvar mpc-font-lock-keywords
+ `(
+ ("\\(project\\)" 1 font-lock-warning-face t)
+ ("\\(workspace\\)" 1 font-lock-warning-face t)
+ ("(\\([^()]*\\))" 1 font-lock-constant-face t)
+ ("\\(IDL_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Source_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Header_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Inline_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Template_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Resource_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(Pkgconfig_Files\\)" 1 font-lock-keyword-face t)
+ ("\\(exclude\\)" 1 font-lock-type-face t)
+ ("\\(custom_only\\)" 1 font-lock-type-face t)
+ ("\\(cmdline\\)" 1 font-lock-type-face t)
+ ("\\(avoids\\)" 1 font-lock-type-face t)
+ ("\\(exename\\)" 1 font-lock-type-face t)
+ ("\\(install =\\)" 1 font-lock-type-face t)
+ ("\\(install +=\\)" 1 font-lock-type-face t)
+ ("\\(install -=\\)" 1 font-lock-type-face t)
+ ("\\(libs\\)" 1 font-lock-type-face t)
+ ("\\(lit_libs\\)" 1 font-lock-type-face t)
+ ("\\(linkflags\\)" 1 font-lock-type-face t)
+ ("\\(specific\\)" 1 font-lock-type-face t)
+ ("\\(macros\\)" 1 font-lock-type-face t)
+ ("\\(after\\)" 1 font-lock-type-face t)
+ ("\\(libout\\)" 1 font-lock-type-face t)
+ ("\\(libpaths\\)" 1 font-lock-type-face t)
+ ("\\(includes\\)" 1 font-lock-type-face t)
+ ("\\(automatic\\)" 1 font-lock-type-face t)
+ ("\\(command\\)" 1 font-lock-type-face t)
+ ("\\(output_option\\)" 1 font-lock-type-face t)
+ ("\\(header_pre_extension\\)" 1 font-lock-type-face t)
+ ("\\(header_outputext\\)" 1 font-lock-type-face t)
+ ("\\(sharedname\\)" 1 font-lock-type-face t)
+ ("\\(dynamicflags\\)" 1 font-lock-type-face t)
+ ("\\(idlflags\\)" 1 font-lock-type-face t)
+ ("\\(:\\)" 1 font-lock-builtin-face t)
+ ("\\( = \\)" 1 font-lock-builtin-face t)
+ ("\\(+=\\)" 1 font-lock-builtin-face t)
+ ("\\(-=\\)" 1 font-lock-builtin-face t)
+ ("\\(//\\)" 1 font-lock-comment-face t)
+ ("\\//\\(.*\\)" 1 font-lock-comment-face t)
+ "default font-lock-keywords")
+ )
+
+;; Indenting logic
+(defun mpc-indent-line ()
+ "Indent current line as MPC directives"
+ (interactive)
+ (beginning-of-line)
+
+ (if (bobp)
+ (indent-line-to 0) ; if we are at start of file, zero indent
+ (let ((not-found-hint t) cur-indent (close-brace nil))
+ (save-excursion ; otherwise, we are not looking at a }, so we need to go back to find the
+ (if (looking-at ".*}")
+ (setq close-brace t))
+ (while not-found-hint ; nearest indentation hint
+ (forward-line -1)
+ (if (looking-at ".*{")
+ (progn
+ (setq cur-indent (+ (current-indentation) tab-width))
+ (setq not-found-hint nil))
+ (if (looking-at ".*}")
+ (progn
+ (setq cur-indent (current-indentation))
+ (if (< cur-indent 0)
+ (setq cur-indent 0))
+ (setq not-found-hint nil))
+ (if (bobp)
+ (setq not-found-hint nil))))))
+ (if close-brace
+ (setq cur-indent (- cur-indent tab-width)))
+ (if cur-indent
+ (indent-line-to cur-indent)
+ (indent-line-to 0))))
+ )
+
+;; Create a syntax table. Derived from fundamental mode, it will automatically
+;; highlight strings, and behave correctly on most words.
+(defvar mpc-mode-syntax-table nil
+ "syntax table used in mpc mode")
+(setq mpc-mode-syntax-table (make-syntax-table))
+(modify-syntax-entry ?_ "w" mpc-mode-syntax-table) ; underscore is a valid part of a word
+(modify-syntax-entry ?- "w" mpc-mode-syntax-table) ; hyphen is a valid part of a word
+(modify-syntax-entry ?/ ". 12b" mpc-mode-syntax-table) ; c++-style comments
+(modify-syntax-entry ?\n "> b" mpc-mode-syntax-table) ; c++-style comments
+
+;;;###autoload
+(defun mpc-mode ()
+ "A major-mode to edit MPC files.
+\\{mpc-mode-map}
+"
+ (interactive)
+ (kill-all-local-variables)
+ (use-local-map mpc-mode-map)
+
+ (make-local-variable 'comment-start)
+ (setq comment-start "//")
+ (make-local-variable 'parse-sexp-ignore-comments)
+ (setq parse-sexp-ignore-comments t)
+
+ (make-local-variable 'tab-width)
+ (make-local-variable 'font-lock-defaults)
+ (make-local-variable 'indent-line-function)
+
+ (setq major-mode 'mpc-mode)
+ (setq mode-name "MPC")
+
+ (setq font-lock-defaults `(mpc-font-lock-keywords nil t))
+ (setq indent-line-function 'mpc-indent-line)
+
+ (set-syntax-table mpc-mode-syntax-table)
+ (run-hooks 'mpc-mode-hook)
+ )
+
+(add-to-list 'auto-mode-alist '("\\.mwb\\'" . mpc-mode))
+(add-to-list 'auto-mode-alist '("\\.mwc\\'" . mpc-mode))
+(add-to-list 'auto-mode-alist '("\\.mpb\\'" . mpc-mode))
+(add-to-list 'auto-mode-alist '("\\.mpc\\'" . mpc-mode))
+
+
+(provide 'mpc-mode)
+
+;;; mpc-mode.el ends here