aboutsummaryrefslogtreecommitdiffhomepage
path: root/contrib
diff options
context:
space:
mode:
authorGravatar David Aspinall <da@inf.ed.ac.uk>2010-08-27 11:24:24 +0000
committerGravatar David Aspinall <da@inf.ed.ac.uk>2010-08-27 11:24:24 +0000
commitf5643d4510fdfc24750d1f509d6a6be7fe8d5db8 (patch)
tree4e058aae1cb07c3ea4356a42fc8b1409e25e1ffd /contrib
parentf68f478cd7b697f0b3fc46e429e71a7b089cd4cb (diff)
Renamed file contrib/mmm/mmm-auto.el, formerly mmm/mmm-auto.el
Diffstat (limited to 'contrib')
-rw-r--r--contrib/mmm/mmm-auto.el177
1 files changed, 177 insertions, 0 deletions
diff --git a/contrib/mmm/mmm-auto.el b/contrib/mmm/mmm-auto.el
new file mode 100644
index 00000000..69e95a26
--- /dev/null
+++ b/contrib/mmm/mmm-auto.el
@@ -0,0 +1,177 @@
+;;; mmm-auto.el --- loading and enabling MMM Mode automatically
+
+;; Copyright (C) 2000 by Michael Abraham Shulman
+
+;; Author: Michael Abraham Shulman <mas@kurukshetra.cjb.net>
+;; Version: $Id$
+
+;;{{{ GPL
+
+;; This file 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 2, or (at your option)
+;; any later version.
+
+;; This file 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 GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;}}}
+
+;;; Commentary:
+
+;; This file contains functions and hooks to load and enable MMM Mode
+;; automatically. It sets up autoloads for the main MMM Mode functions
+;; and interactive commands, and also sets up MMM Global Mode.
+
+;;{{{ Comments on MMM Global Mode
+
+;; This is a kludge borrowed from `global-font-lock-mode'. The idea
+;; is the same: we have a function (here `mmm-mode-on-maybe') that we
+;; want to be run whenever a major mode starts. Unfortunately, there
+;; is no hook (like, say `major-mode-hook') that all major modes run
+;; when they are finished. `post-command-hook', however, is run after
+;; *every* command, so we do our work in there. (Actually, using
+;; `post-command-hook' is even better than being run by major mode
+;; functions, since it is run after all local variables and text are
+;; loaded, which may not be true in certain cases for the other.)
+
+;; In order to do this magic, we rely on the fact that there *is* a
+;; hook that all major modes run when *beginning* their work. They
+;; call `kill-all-local-variables' (unless they are broken), which in
+;; turn runs `change-major-mode-hook'. So we add a function to *that*
+;; hook which saves the current buffer and temporarily adds a function
+;; to `post-command-hook' which processes that buffer.
+
+;; Actually, in the interests of generality, what that function does
+;; is run the hook `mmm-major-mode-hook'. Our desired function
+;; `mmm-mode-on-maybe' is then added to that hook. This way, if the
+;; user wants to run something else on every major mode, they can just
+;; add it to `mmm-major-mode-hook' and take advantage of this hack.
+
+;;}}}
+
+;;; Code:
+
+(require 'cl)
+(require 'mmm-vars)
+
+;;{{{ Autoload Submode Classes
+
+(defvar mmm-autoloaded-classes
+ '((mason "mmm-mason" nil)
+ (embedded-css "mmm-sample" nil)
+ (html-js "mmm-sample" nil)
+ (here-doc "mmm-sample" nil)
+ (embperl "mmm-sample" nil)
+ (eperl "mmm-sample" nil)
+ (jsp "mmm-sample" nil)
+ (file-variables "mmm-sample" nil)
+ (rpm-sh "mmm-rpm" t)
+ (rpm "mmm-rpm" nil)
+ (cweb "mmm-cweb" nil)
+ (sgml-dtd "mmm-sample" nil)
+ (noweb "mmm-noweb" nil)
+ (html-php "mmm-sample" nil)
+ )
+ "Alist of submode classes autoloaded from files.
+Elements look like \(CLASS FILE PRIVATE) where CLASS is a submode
+class symbol, FILE is a string suitable for passing to `load', and
+PRIVATE is non-nil if the class is invisible to the user. Classes can
+be added to this list with `mmm-autoload-class'.")
+
+(defun mmm-autoload-class (class file &optional private)
+ "Autoload submode class CLASS from file FILE.
+PRIVATE, if non-nil, means the class is user-invisible. In general,
+private classes need not be autoloaded, since they will usually be
+invoked by a public class in the same file."
+ ;; Don't autoload already defined classes
+ (unless (assq class mmm-classes-alist)
+ (add-to-list 'mmm-autoloaded-classes
+ (list class file private))))
+
+;;}}}
+;;{{{ Autoload Functions
+
+;; To shut up the byte compiler.
+(eval-and-compile
+ (autoload 'mmm-mode-on "mmm-mode" "Turn on MMM Mode. See `mmm-mode'.")
+ (autoload 'mmm-mode-off "mmm-mode" "Turn off MMM Mode. See `mmm-mode'.")
+ (autoload 'mmm-update-font-lock-buffer "mmm-region")
+ (autoload 'mmm-ensure-fboundp "mmm-utils")
+ (autoload 'mmm-mode "mmm-mode"
+ "Minor mode to allow multiple major modes in one buffer.
+Without ARG, toggle MMM Mode. With ARG, turn MMM Mode on iff ARG is
+positive and off otherwise." t))
+
+;; These may actually be used.
+(autoload 'mmm-ify-by-class "mmm-cmds" "" t)
+(autoload 'mmm-ify-by-regexp "mmm-cmds" "" t)
+(autoload 'mmm-ify-region "mmm-cmds" "" t)
+(autoload 'mmm-parse-buffer "mmm-cmds" "" t)
+(autoload 'mmm-parse-region "mmm-cmds" "" t)
+(autoload 'mmm-parse-block "mmm-cmds" "" t)
+(autoload 'mmm-clear-current-region "mmm-cmds" "" t)
+(autoload 'mmm-reparse-current-region "mmm-cmds" "" t)
+(autoload 'mmm-end-current-region "mmm-cmds" "" t)
+(autoload 'mmm-insertion-help "mmm-cmds" "" t)
+(autoload 'mmm-insert-region "mmm-cmds" "" t)
+
+;;}}}
+;;{{{ MMM Global Mode
+
+(defvar mmm-changed-buffers-list ()
+ "Buffers that need to be checked for running the major mode hook.")
+
+(defun mmm-major-mode-change ()
+ "Add this buffer to `mmm-changed-buffers-list' for checking.
+When the current command is over, MMM Mode will be turned on in this
+buffer depending on the value of `mmm-global-mode'. Actually,
+everything in `mmm-major-mode-hook' will be run."
+ (and (boundp 'mmm-mode)
+ mmm-mode
+ (mmm-mode-off))
+ (add-to-list 'mmm-changed-buffers-list (current-buffer))
+ (add-hook 'post-command-hook 'mmm-check-changed-buffers))
+
+(add-hook 'change-major-mode-hook 'mmm-major-mode-change)
+
+(defun mmm-check-changed-buffers ()
+ "Run major mode hook for the buffers in `mmm-changed-buffers-list'."
+ (remove-hook 'post-command-hook 'mmm-check-changed-buffers)
+ (dolist (buffer mmm-changed-buffers-list)
+ (when (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (mmm-run-major-mode-hook))))
+ (setq mmm-changed-buffers-list '()))
+
+(defun mmm-mode-on-maybe ()
+ "Conditionally turn on MMM Mode.
+Turn on MMM Mode if `global-mmm-mode' is non-nil and there are classes
+to apply, or always if `global-mmm-mode' is t."
+ (cond ((eq mmm-global-mode t) (mmm-mode-on))
+ ((not mmm-global-mode))
+ ((mmm-get-all-classes nil) (mmm-mode-on)))
+ (when mmm-mode
+ (mmm-update-font-lock-buffer)))
+
+(add-hook 'mmm-major-mode-hook 'mmm-mode-on-maybe)
+
+(defalias 'mmm-add-find-file-hooks 'mmm-add-find-file-hook)
+(defun mmm-add-find-file-hook ()
+ "Equivalent to \(setq mmm-global-mode 'maybe).
+This function is deprecated and may be removed in future."
+ (message "Warning: `mmm-add-find-file-hook' is deprecated.")
+ (setq mmm-global-mode 'maybe))
+
+;;}}}
+
+(provide 'mmm-auto)
+
+;;; mmm-auto.el ends here \ No newline at end of file