diff options
Diffstat (limited to 'contrib/mmm/mmm-vars.el')
-rw-r--r-- | contrib/mmm/mmm-vars.el | 1055 |
1 files changed, 0 insertions, 1055 deletions
diff --git a/contrib/mmm/mmm-vars.el b/contrib/mmm/mmm-vars.el deleted file mode 100644 index cb653dc4..00000000 --- a/contrib/mmm/mmm-vars.el +++ /dev/null @@ -1,1055 +0,0 @@ -;;; mmm-vars.el --- Variables for MMM Mode - -;; Copyright (C) 2000, 2004 by Michael Abraham Shulman - -;; Author: Michael Abraham Shulman <viritrilbia@users.sourceforge.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 provides the definitions for the variables used by MMM -;; Mode, as well as several functions to manipulate them. It also -;; defines the errors that MMM Mode can signal. - -;;; Code: - -(require 'cl) -(require 'mmm-compat) -(require 'mmm-utils) - -;; MISCELLANEOUS -;;{{{ Shut up the Byte Compiler - -;; Otherwise it complains about undefined variables. -(eval-when-compile - (defvar mmm-current-submode) - (defvar mmm-current-overlay) - (defvar mmm-save-local-variables) - (defvar mmm-mode-string) - (defvar mmm-submode-mode-line-format) - (defvar mmm-mode-ext-classes-alist) - (defvar mmm-mode-prefix-key) - (defvar mmm-global-mode) - (defvar mmm-primary-mode) - (defvar mmm-classes-alist) - (defvar mmm-current-submode)) - (declare-function mmm-set-class-parameter "mmm-class") - (declare-function mmm-get-class-parameter "mmm-class") -;;}}} -;;{{{ Error Conditions - -;; Most of these should be caught internally and never seen by the -;; user, except when the user is creating submode regions manually. - -;; Signalled when we try to put a submode region inside one where it -;; isn't meant to go. -(put 'mmm-subregion-invalid-parent - 'error-conditions - '(mmm-subregion-invalid-parent mmm-error error)) -(put 'mmm-subregion-invalid-parent - 'error-message - "Invalid submode region parent") - -;; Signalled when we try to put a submode region overlapping others in -;; an invalid way. -(put 'mmm-subregion-invalid-placement - 'error-conditions - '(mmm-subregion-invalid-placement mmm-error error)) -(put 'mmm-subregion-invalid-placement - 'error-message - "Submode region placement invalid") - -;; Signalled when we try to apply a submode class that doesn't exist. -(put 'mmm-invalid-submode-class - 'error-conditions - '(mmm-invalid-submode-class mmm-error error)) -(put 'mmm-invalid-submode-class - 'error-message - "Invalid or undefined submode class") - -;; Signalled by :match-submode functions when they are unable to -;; resolve a submode. This error should *always* be caught internally -;; and never seen by the user. -(put 'mmm-no-matching-submode - 'error-conditions - '(mmm-no-matching-submode mmm-error error)) -(put 'mmm-no-matching-submode - 'error-message - "Internal error: no matching submode.") - -;;}}} - -;; USER VARIABLES -;;{{{ Customization Group - -(defgroup mmm nil - "Multiple Major Modes in one buffer." - :group 'tools) - -;;}}} -;;{{{ Save Local Variables - -(defvar mmm-c-derived-modes - '(c-mode c++-mode objc-mode pike-mode java-mode jde-mode javascript-mode - php-mode)) - -(defvar mmm-save-local-variables - `(;; Don't use `function' (#') here!! We're already inside `quote'! - major-mode - comment-start - comment-end - (comment-line-start-skip buffer (fortran-mode)) - comment-start-skip - (comment-column buffer) - comment-indent-function - comment-line-break-function - sentence-end - ,@(when mmm-xemacs - '(mode-popup-menu - (((lambda () current-menubar) . set-buffer-menubar)) - )) - font-lock-keywords - font-lock-keywords-only - font-lock-keywords-case-fold-search - font-lock-syntax-table - font-lock-mark-block-function ; Override this? - font-lock-syntactic-keywords - indent-line-function - parse-sexp-ignore-comments ; Fixes indentation in PHP-mode? - ;; Can be different in different buffers - (c-basic-offset - buffer (c-mode c++-mode objc-mode pike-mode java-mode jde-mode)) - ;; These are necessary for C syntax parsing - (c-class-key nil ,mmm-c-derived-modes) - (c-extra-toplevel-key nil ,mmm-c-derived-modes) - (c-inexpr-class-key nil ,mmm-c-derived-modes) - (c-conditional-key nil ,mmm-c-derived-modes) - semantic-bovinate-toplevel-override - semantic-toplevel-bovine-table - ;; Indentation style control variables. - ;; These have to be localized in Emacs: see `mmm-mode-on'. - ,@(mapcar - #'(lambda (var) (list var nil mmm-c-derived-modes)) - '(c++-template-syntax-table - c-<-op-cont-regexp - c->-op-cont-regexp - c-after-suffixed-type-decl-key - c-after-suffixed-type-maybe-decl-key - c-any-class-key - c-any-class-key - c-asm-stmt-kwds - c-assignment-op-regexp - c-backslash-column - c-basic-offset - c-bitfield-kwds - c-block-comment-prefix - c-block-decls-with-vars - c-block-stmt-1-key - c-block-stmt-1-key - c-block-stmt-1-kwds - c-block-stmt-2-key - c-block-stmt-2-key - c-block-stmt-2-kwds - c-brace-list-key - c-cast-parens - c-class-key - c-class-key - c-class-kwds - c-cleanup-list - c-colon-type-list-re - c-comment-only-line-offset - c-comment-prefix-regexp - c-comment-start-regexp - c-comment-start-regexp - c-cpp-defined-fns - c-current-comment-prefix - c-decl-block-key - c-decl-block-key - c-decl-prefix-re - c-decl-spec-kwds - c-doc-comment-start-regexp - c-expr-kwds - c-file-offsets - c-file-style - c-hanging-braces-alist - c-hanging-colons-alist - c-hanging-comment-ender-p - c-hanging-comment-starter-p - c-hanging-semi\&comma-criteria - c-identifier-key - c-identifier-last-sym-match - c-identifier-start - c-identifier-syntax-modifications - c-identifier-syntax-table - c-in-comment-lc-prefix - c-indent-comment-alist - c-indent-comments-syntactically-p - c-indentation-style - c-inexpr-block-kwds - c-inexpr-class-kwds - c-keywords - c-keywords-obarray - c-keywords-regexp - c-keywords-regexp - c-known-type-key - c-label-key - c-label-key - c-label-kwds - c-label-kwds-regexp - c-label-kwds-regexp - c-label-minimum-indentation - c-lambda-kwds - c-literal-start-regexp - c-nonsymbol-chars - c-nonsymbol-token-regexp - c-not-decl-init-keywords - c-offsets-alist - c-opt-<>-arglist-start - c-opt-<>-arglist-start-in-paren - c-opt-<>-sexp-key - c-opt-access-key - c-opt-access-key - c-opt-asm-stmt-key - c-opt-asm-stmt-key - c-opt-bitfield-key - c-opt-bitfield-key - c-opt-block-decls-with-vars-key - c-opt-block-stmt-key - c-opt-block-stmt-key - c-opt-cpp-prefix - c-opt-cpp-start - c-opt-decl-spec-key - c-opt-friend-key - c-opt-friend-key - c-opt-identifier-concat-key - c-opt-inexpr-block-key - c-opt-inexpr-block-key - c-opt-inexpr-brace-list-key - c-opt-inexpr-class-key - c-opt-inexpr-class-key - c-opt-lambda-key - c-opt-lambda-key - c-opt-method-key - c-opt-method-key - c-opt-postfix-decl-spec-key - c-opt-type-component-key - c-opt-type-concat-key - c-opt-type-modifier-key - c-opt-type-suffix-key - c-other-decl-block-key - c-other-decl-block-key - c-other-decl-block-kwds - c-other-decl-kwds - c-overloadable-operators-regexp - c-paragraph-separate - c-paragraph-start - c-paren-stmt-key - c-primary-expr-regexp - c-primitive-type-key - c-primitive-type-kwds - c-protection-kwds - c-recognize-<>-arglists - c-recognize-knr-p - c-recognize-knr-p - c-recognize-paren-inits - c-recognize-typeless-decls - c-regular-keywords-regexp - c-simple-stmt-key - c-simple-stmt-kwds - c-special-brace-lists - c-special-brace-lists - c-specifier-key - c-specifier-kwds - c-stmt-delim-chars - c-stmt-delim-chars-with-comma - c-symbol-key - c-symbol-key - c-symbol-start - c-syntactic-eol - c-syntactic-ws-end - c-syntactic-ws-start - c-type-decl-prefix-key - c-type-decl-suffix-key - c-type-prefix-key - comment-end - comment-start - comment-start-skip)) - ;; Skeleton insertion - skeleton-transformation - ;; Abbrev mode - abbrev-mode - local-abbrev-table - ;; And finally the syntax table and local map. - ((syntax-table . set-syntax-table)) - ((current-local-map . use-local-map) buffer) - paragraph-separate - paragraph-start - ) - "Which local variables to save for major mode regions. -Each element has the form \(VARIABLE [TYPE [MODES]]), causing VARIABLE -to be saved for all major modes in the list MODES. If MODES is t or -absent, the variable is saved for all major modes. MODES can also be -a function of no arguments which returns non-nil whenever the variable -should be saved. - -TYPE should be either the symbol `global', meaning to save the -variable globally, the symbol `buffer', meaning to save it per buffer, -or the symbol `region', meaning to save it for each submode region. -If TYPE has any other value, such as nil, or is absent, the variable -is saved globally. If all optional parameters are omitted, the -element may be simply VARIABLE instead of \(VARIABLE). - -It is possible for VARIABLE to be not a symbol but a cons cell of the -form \(GETTER . SETTER), thus specifying special functions to set and -get the value of the \"variable\". This is used for objects like -local maps, syntax tables, etc. which need to be installed in a -special way. GETTER should be a function of no arguments, and SETTER -a function of one. In this case, even if TYPE and MODES are omitted, -the list cannot be flattened--it must be \((GETTER . SETTER)). -\"Variables\" of this type cannot be seen with `mmm-get-saved-local'. - -A single variable may appear more than once in this list, with -different modes and/or types. If the same mode appears more than once -for the same variable with different types, the behavior is undefined. -Changing the value of this variable after MMM Mode has been activated -in some buffer may produce unpredictable results. - -Globally saved variables are saved in the mmm-local-variables property -of the mode symbol. Buffer saved variables are saved in the alist -`mmm-buffer-saved-locals'. Region saved variables are saved in the -mmm-local-variables property of the overlay.") - -(defvar mmm-buffer-saved-locals () - "Stores saved local variables for this buffer, by mode. -Each element looks like \(MODE \(VAR VALUE) ...).") -(make-variable-buffer-local 'mmm-buffer-saved-locals) - -(defvar mmm-region-saved-locals-defaults () - "Stores saved defaults for region-saved locals, by mode. -Each element looks like \(MODE \(VAR VALUE) ...). Used to initialize -new submode regions.") -(make-variable-buffer-local 'mmm-region-saved-locals-defaults) - -(defvar mmm-region-saved-locals-for-dominant () - "Stores saved region locals for the dominant major mode. -The dominant major mode is considered to be one region for purposes of -saving region variables. Region-saved variables for submode regions -are saved as overlay properties.") -(make-variable-buffer-local 'mmm-region-saved-locals-for-dominant) - -;;}}} -;;{{{ Submode Faces - -(defgroup mmm-faces nil - "Faces and coloring for submode regions. -In general, only background colors should be set, to avoid interfering -with font-lock." - :group 'mmm) - -(defcustom mmm-submode-decoration-level 1 - "*Amount of coloring to use in submode regions. -Should be either 0, 1, or 2, representing None, Low, and High amounts -of coloring respectively. -* None (0) means to use no coloring at all. -* Low (1) means to use `mmm-default-submode-face' for all submode - regions \(except for \"non-submode\" regions, i.e. those that are of - the primary mode) and `mmm-delimiter-face' for region delimiters. -* High (2) means to use different faces for different types of submode - regions and delimiters, such as initialization code, expressions that - are output, declarations, and so on, as specified by the submode - class. The default faces are still used for regions that do not - specify a face." - :group 'mmm-faces - :type '(choice (const :tag "None" 0) - (const :tag "Low" 1) - (const :tag "High" 2))) - -(defface mmm-init-submode-face '((t (:background "Pink"))) - "Face used for submodes containing initialization code." - :group 'mmm-faces) - -(defface mmm-cleanup-submode-face '((t (:background "Wheat"))) - "Face used for submodes containing cleanup code." - :group 'mmm-faces) - -(defface mmm-declaration-submode-face '((t (:background "Aquamarine"))) - "Face used for submodes containing declarations." - :group 'mmm-faces) - -(defface mmm-comment-submode-face '((t (:background "SkyBlue"))) - "Face used for submodes containing comments and documentation." - :group 'mmm-faces) - -(defface mmm-output-submode-face '((t (:background "Plum"))) - "Face used for submodes containing expression that are output." - :group 'mmm-faces) - -(defface mmm-special-submode-face '((t (:background "MediumSpringGreen"))) - "Face used for special submodes not fitting any other category." - :group 'mmm-faces) - -(defface mmm-code-submode-face '((t (:background "LightGray"))) - "Face used for submodes containing ordinary code." - :group 'mmm-faces) - -(defface mmm-default-submode-face '((t (:background "gray85"))) - "Face used for all submodes at decoration level 1. -Also used at decoration level 2 for submodes not specifying a type." - :group 'mmm-faces) - -(defface mmm-delimiter-face nil - "Face used to mark submode delimiters." - :group 'mmm-faces) - -;;}}} -;;{{{ Mode Line Format - -(defcustom mmm-mode-string " MMM" - "*String to display in mode line as MMM minor mode indicator." - :group 'mmm - :type 'string) - -(defcustom mmm-submode-mode-line-format "~M[~m]" - "*Format of the mode-line display when point is in a submode region. - -~M is replaced by the name of the primary major mode \(which may be -replaced by a combined-mode function, see the info documentation). - -~m is replaced by the submode region overlay's `display-name' -property, if it has one. Otherwise it is replaced by the mode name of -the submode region. - -If `mmm-primary-mode-display-name' is non-nil, then this variable is -used even when point is not in a submode region \(i.e. it is in a -primary mode region), with ~m being replaced by the value of that -variable." - :group 'mmm - :type 'string) - -(defvar mmm-primary-mode-display-name nil - "If non-nil, displayed as the primary mode name in the mode line. -See also `mmm-buffer-mode-display-name'.") -(make-variable-buffer-local 'mmm-primary-mode-display-name) - -(defvar mmm-buffer-mode-display-name nil - "If non-nil, displayed in the mode line instead of the primary mode -name, which is then shown next to it as if it were a submode when in a -primary mode region, i.e. outside all submode regions.") -(make-variable-buffer-local 'mmm-buffer-mode-display-name) - -(defun mmm-set-mode-line () - "Set the mode line display correctly for the current submode, -according to `mmm-submode-mode-line-format'." - (let ((primary (or mmm-primary-mode-display-name - (get mmm-primary-mode 'mmm-mode-name))) - (submode (and mmm-current-overlay - (or (overlay-get mmm-current-overlay 'display-name) - (get mmm-current-submode 'mmm-mode-name))))) - (if mmm-buffer-mode-display-name - (setq mode-name - (mmm-format-string mmm-submode-mode-line-format - `(("~M" . ,mmm-buffer-mode-display-name) - ("~m" . ,(or submode primary))))) - (if submode - (setq mode-name - (mmm-format-string mmm-submode-mode-line-format - `(("~M" . ,primary) - ("~m" . ,submode)))) - (setq mode-name primary)))) - (force-mode-line-update)) - -;;}}} -;;{{{ Submode Classes - -(defvar mmm-classes nil - "*List of submode classes that apply to a buffer. -Generally set in a file local variables list. Can either be one -symbol, or a list of symbols. Automatically buffer-local.") -(make-variable-buffer-local 'mmm-classes) - -(defvar mmm-global-classes '(universal) - "*List of submode classes that apply to all buffers. -Can be overridden in a file local variables list.") - -;;}}} -;;{{{ Modes and Extensions - -(defcustom mmm-mode-ext-classes-alist nil - "Alist of submode classes for major modes and/or file extensions. -This variable can now be directly modified. - -Elements look like \(MODE EXT CLASS), where MODE is a major mode, EXT -is a regexp to match a filename such as in `auto-mode-alist', and -CLASS is a submode class. CLASS is activated in all buffers in mode -MODE \(if non-nil) and whose filenames match EXT \(if non-nil). If -both MODE and EXT are nil, CLASS is activated in all buffers. If CLASS -is the symbol t, MMM Mode is turned on in all buffers matching MODE -and EXT, but no classes are activated. - -See `mmm-global-mode'." - :group 'mmm - :type '(repeat (list (symbol :tag "Major Mode") - (string :tag "Filename Regexp") - (symbol :tag "Class"))) - :require 'mmm-mode) - -(defun mmm-add-mode-ext-class (mode ext class) - "Add an element to `mmm-mode-ext-classes-alist', which see. -That variable can now be directly modified, so this function is -unnecessary. It probably won't go away, though." - (add-to-list 'mmm-mode-ext-classes-alist (list mode ext class))) - -;;}}} -;;{{{ Preferred Major Modes - -(defcustom mmm-major-mode-preferences - '((perl cperl-mode perl-mode) - (javascript javascript-mode c++-mode) - (java jde-mode java-mode c++-mode) - (css css-mode c++-mode)) - "User preferences about what major modes to use. -Each element has the form \(LANGUAGE . MODES) where LANGUAGE is the -name of a programming language such as `perl' as a symbol, and MODES -is a list of possible major modes to use, such as `cperl-mode' or -`perl-mode'. The first element of MODES which is `fboundp' is used -for submodes of LANGUAGE. The last element of MODES should be a mode -which will always be available." - :group 'mmm - :type '(repeat (cons symbol - (repeat - (restricted-sexp :match-alternatives - (fboundp)))))) - -(defun mmm-add-to-major-mode-preferences (language mode &optional default) - "Set the preferred major mode for LANGUAGE to MODE. -This sets the value of `mmm-major-mode-preferences'. If DEFAULT is -nil or unsupplied, MODE is added at the front of the list of modes for -LANGUAGE. If DEFAULT is non-nil, then it is added at the end. This -may be used by packages to ensure that some mode is present, but not -override any user-specified mode." - (let ((pair (assq language mmm-major-mode-preferences))) - (if pair - ;; Existing mode preferences - (if default - (setcdr pair (cons mode (cdr pair))) - (setcdr pair (append (cdr pair) (list mode)))) - ;; No existing mode preference - (add-to-list 'mmm-major-mode-preferences (list language mode))))) - -(defun mmm-ensure-modename (symbol) - "Return SYMBOL if it is a valid submode name, else nil. -Valid submode names are either `fboundp' or present as the `car' of an -element in `mmm-major-mode-preferences'." - (if (or (fboundp symbol) - (assq symbol mmm-major-mode-preferences)) - symbol - nil)) - -(defun mmm-modename->function (mode) - "Convert MODE to a mode function, nil if impossible. -Valid submode names are either `fboundp' or present as the `car' of an -element in `mmm-major-mode-preferences'. In the latter case, the -first `fboundp' element of the `cdr' is returned, or nil if none." - (if (fboundp mode) - mode - (car (remove-if-not - #'fboundp - (cdr (assq mode mmm-major-mode-preferences)))))) - -;;}}} -;;{{{ Delimiter Regions - -(defcustom mmm-delimiter-mode 'fundamental-mode - "Major mode used by default for delimiter regions. -Classes are encouraged to override this by providing a delimiter-mode -parameter-- see `mmm-classes-alist'." - :group 'mmm - :type 'function) - -;;}}} -;;{{{ Key Bindings - -(defcustom mmm-mode-prefix-key [(control ?c) ?%] - "Prefix key for the MMM Minor Mode Keymap." - :group 'mmm - :type 'vector) - -(defcustom mmm-command-modifiers '(control) - "List of key modifiers for MMM command keys. -The MMM commands in the MMM Mode map, after `mmm-mode-prefix-key', -are bound to default keys with these modifiers added. This variable -must be set before MMM Mode is loaded to have an effect. - -It is suggested that the value of this variable be either nil or -\(control), as the default keys are either plain keys or have only a -meta modifier. The shift modifier is not particularly portable between -Emacsen. The values of this variable and `mmm-insert-modifiers' should -be disjoint." - :group 'mmm - :type '(repeat (symbol :tag "Modifier"))) - -(defcustom mmm-insert-modifiers '() - "List of key modifiers for MMM submode insertion keys. -When a key pressed after `mmm-mode-prefix-key' has no MMM Mode command -binding, and its modifiers include these, then its basic type, plus any -modifiers in addition to these, is looked up in classes' :insert -specifications. - -It is suggested that the value of this variable be either nil or -\(control), allowing submode classes to specify the presence or -absence of the meta modifier. The shift modifier is not particularly -portable between Emacsen. The values of `mmm-command-modifiers' and -this variable should be disjoint." - :group 'mmm - :type '(repeat (symbol :tag "Modifier"))) - -(defcustom mmm-use-old-command-keys nil - "Non-nil means to Use the old command keys for MMM Mode. -MMM Mode commands then have no modifier while insertion commands have -a control modifier, i.e. `mmm-command-modifiers' is set to nil and -`mmm-insert-modifiers' is set to \(control). If nil, the values of -these variables are as the default, or whatever the user has set them -to. This variable must be set before MMM Mode is loaded." - :group 'mmm - :type 'boolean) - -(defun mmm-use-old-command-keys () - "Use the old command keys \(no control modifer) in MMM Mode." - (setq mmm-command-modifiers '() - mmm-insert-modifiers '(control))) - -;;}}} -;;{{{ MMM Hooks - -(defcustom mmm-mode-hook () - "Hook run when MMM Mode is enabled in a buffer. - -A hook named mmm-<major-mode>-hook is also run, if it exists. For -example, `mmm-html-mode-hook' is run whenever MMM Mode is entered with -HTML mode the dominant mode. - -A hook named mmm-<submode>-submode-hook is run when a submode region -of a given mode is created. For example, `mmm-cperl-mode-submode-hook' -is run whenever a CPerl mode submode region is created, in any buffer. -When this hooks are run, point is guaranteed to be at the start of -the newly created submode region. - -Finally, a hook named mmm-<class>-class-hook is run whenever a buffer -is first mmm-ified with a given submode class. For example, -`mmm-mason-class-hook' is run whenever the `mason' class is first -applied in a buffer." - :group 'mmm - :type 'hook) - -(defun mmm-run-constructed-hook (body &optional suffix) - "Run the hook named `mmm-<BODY>-<SUFFIX>-hook', if it exists. -If SUFFIX is nil or unsupplied, run `mmm-<BODY>-hook' instead." - (let ((hook (intern-soft (if suffix - (format "mmm-%s-%s-hook" body suffix) - (format "mmm-%s-hook" body))))) - (if hook (run-hooks hook)))) - -(defun mmm-run-major-hook () - (mmm-run-constructed-hook mmm-primary-mode)) - -(defun mmm-run-submode-hook (submode) - (mmm-run-constructed-hook submode "submode")) - -(defvar mmm-class-hooks-run () - "List of submode classes for which hooks have already been run in -the current buffer.") -(make-variable-buffer-local 'mmm-class-hooks-run) - -(defun mmm-run-class-hook (class) - (unless (member class mmm-class-hooks-run) - (mmm-run-constructed-hook class "class") - (add-to-list 'mmm-class-hooks-run class))) - -(defvar mmm-primary-mode-entry-hook nil - "Hook run when point moves into a region of the primary mode. -Each submode region can have an `entry-hook' property which is run -when they are entered, but since primary mode regions have no overlay -to store properties, this is a buffer-local variable. - -N.B. This variable is not a standard Emacs hook. Unlike Emacs' -\"local hooks\" it has *no* global value, only a local one. Its value -should always be a list of functions \(possibly empty) and never a -single function. It may be used with `add-hook', however.") -(make-variable-buffer-local 'mmm-primary-mode-entry-hook) - -;;}}} -;;{{{ Major Mode Hook - -(defcustom mmm-major-mode-hook () - "Hook run whenever a new major mode is finished starting up. -MMM Mode implements this with a hack \(see comments in the source) so -that `mmm-global-mode' will function correctly, but makes this hook -available so that others can take advantage of the hack as well. - -Note that file local variables have *not* been processed by the time -this hook is run. If a function needs to inspect them, it should also -be added to `find-file-hooks'. However, `find-file-hooks' is not run -when creating a non-file-based buffer, or when changing major modes in -an existing buffer." - :group 'mmm - :type 'hook) - -(defun mmm-run-major-mode-hook () - (dolist (func mmm-major-mode-hook) - (ignore-errors (funcall func)))) - -;;}}} -;;{{{ MMM Global Mode - -;;; There's a point to be made that this variable should default to -;;; `maybe' (i.e. not nil and not t), because that's what practically -;;; everyone wants. I subscribe, however, to the view that simply -;;; *loading* a lisp extension should not change the (user-visible) -;;; behavior of Emacs, until it is configured or turned on in some -;;; way, which dictates that the default for this must be nil. -(defcustom mmm-global-mode nil - "*Specify in which buffers to turn on MMM Mode automatically. - -- If nil, MMM Mode is never enabled automatically. -- If t, MMM Mode is enabled automatically in all buffers. -- If any other symbol, MMM mode is enabled only in those buffers that - have submode classes associated with them. See `mmm-classes' and - `mmm-mode-ext-classes-alist' for more information." - :group 'mmm - :type '(choice (const :tag "Always" t) - (const :tag "Never" nil) - (other :tag "Maybe" maybe)) - :require 'mmm-mode) - -;; These are not traditional editing modes, so mmm makes no sense, and -;; can mess things up seriously if it doesn't know not to try. -(defcustom mmm-never-modes - '( - help-mode - Info-mode - dired-mode - comint-mode - telnet-mode - shell-mode - eshell-mode - forms-mode - ) - "List of modes in which MMM Mode is never activated." - :group 'mmm - :type '(repeat (symbol :tag "Mode"))) - -;;}}} -;;{{{ Buffer File Name - -(defvar mmm-set-file-name-for-modes '(mew-draft-mode) - "List of modes for which the temporary buffers MMM creates have a -file name. In these modes, this file name is the same as that of the -parent buffer. In general, this has been found to cause more problems -than it solves, but some modes require it.") - -;;}}} - -;; NON-USER VARIABLES -;;{{{ Mode Variable - -(defvar mmm-mode nil - "Non-nil means MMM Mode is turned on in this buffer. -Do not set this variable directly; use the function `mmm-mode'.") -(make-variable-buffer-local 'mmm-mode) - -;;}}} -;;{{{ Primary Mode - -(defvar mmm-primary-mode nil - "The primary major mode in the current buffer.") -(make-variable-buffer-local 'mmm-primary-mode) - -;;}}} -;;{{{ Classes Alist - -;; Notes: -;; 1. :parent could be an all-class argument. Same with :keymap. -;; 2. :match-submode really does have to be distinct from :submode, -;; because 'functionp' isn't enough to distinguish which is meant. -(defvar mmm-classes-alist nil - "Alist containing all defined mmm submode classes. -A submode class is a named recipe for parsing a document into submode -regions, and sometimes for inserting new ones while editing. - -Each element of this alist looks like \(CLASS . ARGS) where CLASS is a -symbol naming the submode class and ARGS is a list of keyword -arguments, called a \"class specifier\". There are a large number of -accepted keyword arguments in the class specifier. - -The argument CLASSES, if supplied, must be a list of other submode -class names, or class specifiers, representing other classes to call -recursively. The FACE arguments of these classes are overridden by -the FACE argument of this class. If the argument CLASSES is supplied, -all other arguments to this class are ignored. That is, \"grouping\" -classes can do nothing but group other classes. - -The argument HANDLER, if supplied, also overrides any other processing. -It must be a function, and all the arguments are passed to it as -keywords, and it must do everything. See `mmm-ify' for what sorts of -things it must do. This back-door interface should be cleaned up. - -The optional argument FACE gives the display face of the submode -regions under high decoration (see `mmm-submode-decoration-level'). -It must be a valid face. The standard faces used for submode regions -are `mmm-*-submode-face' where * is one of `init', `cleanup', -`declaration', `comment', `output', `special', or `code'. A more -flexible alternative is the argument MATCH-FACE. MATCH-FACE can be a -function, which is called with one argument, the form of the front -delimiter \(found from FRONT-FORM, below), and should return the face -to use. It can also be an alist, with each element of the form -\(DELIM . FACE). - -If neither CLASSES nor HANDLER are supplied, either SUBMODE or -MATCH-SUBMODE must be. SUBMODE specifies the submode to use for the -submode regions, a symbol such as `cperl-mode' or `emacs-lisp-mode', -while MATCH-SUBMODE must be a function to be called immediately after -a match is found for FRONT, which is passed one argument, the form of -the front delimiter \(found from FRONT-FORM, below), and return a -symbol such as SUBMODE would be set to. If MATCH-SUBMODE detects an -invalid match--for example a specified mode which is not `fboundp'--it -should \(signal 'mmm-no-matching-submode nil). - -FRONT and BACK are the means to find the submode regions, and can be -either buffer positions \(number-or-markers), regular expressions, or -functions. If they are absolute buffer positions, only one submode -region is created, from FRONT to BACK. This is generally not used in -named classes. \(Unnamed classes are created by interactive commands -in `mmm-interactive-history'). - -If FRONT is a regexp, then that regexp is searched for, and the end of -its FRONT-MATCH'th match \(or the beginning thereof, if INCLUDE-FRONT -is non-nil), plus FRONT-OFFSET, becomes the beginning of the submode -region. If FRONT is a function, that function is called instead, and -must act somewhat like a search, in that it should start at point, -take one argument as a search bound, and set the match data. A -similar pattern is followed for BACK \(the search starts at the -beginning of the submode region), save that the beginning of its -BACK-MATCH'th match \(or the end, if INCLUDE-BACK is non-nil) becomes -the end of the submode region, plus BACK-OFFSET. - -If SAVE-MATCHES is non-nil, then BACK, if it is a regexp, is formatted -by replacing strings of the form \"~N\" by the corresponding value of -\(match-string n) after matching FRONT. - -FRONT-MATCH and BACK-MATCH default to zero. They specify which -sub-match of the FRONT and BACK regexps to treat as the delimiter. -This number will be passed to any calls to `match-beginning' and -company. - -FRONT- and BACK-OFFSET default to 0. In addition to numbers, they can -also be functions to call which should move point to the correct -position for the beginning or end of the submode region. Common -choices include `beginning-of-line' and `end-of-line', and new -functions can of course be written. They can also be lists which will -be applied in sequence, such as \(end-of-line 1) meaning move to end -of line and then forward one character. - -FRONT-VERIFY and BACK-VERIFY, if supplied, must be functions that -inspect the match data to see if a match found by FRONT or BACK -respectively is valid. - -FRONT-DELIM \(resp. BACK-DELIM), if supplied, can take values like -those of FRONT-OFFSET \(resp. BACK-OFFSET), specifying the offset from -the start \(resp. end) of the match for FRONT \(resp. BACK) to use as -the starting \(resp. ending) point for the front \(resp. back) -delimiter. If nil, it means not to make a region for the respective -delimiter at all. - -DELIMITER-MODE, if supplied, specifies what submode to use for the -delimiter regions, if any. If `nil', the primary mode is used. If -not supplied, `mmm-delimiter-mode' is used. - -FRONT-FACE and BACK-FACE specify faces to use for displaying the -delimiter regions, under high decoration. - -FRONT-FORM and BACK-FORM, if given, must supply a regexp used to match -the *actual* delimiter. If they are strings, they are used as-is. If -they are functions, they are called and must inspect the match data. -If they are lists, their `car' is taken as the delimiter. The default -for both is \(regexp-quote \(match-string 0)). - -The last case--them being a list--is usually used to set the delimiter -to a function. Such a function must take 1-2 arguments, the first -being the overlay in question, and the second meaning to insert the -delimiter and adjust the overlay rather than just matching the -delimiter. See `mmm-match-front', `mmm-match-back', and -`mmm-end-current-region'. - -CASE-FOLD-SEARCH, if specified, controls whether the search is -case-insensitive. See `case-fold-search'. It defaults to `t'. - -CREATION-HOOK, if specified, should be a function which is run -whenever a submode region is created, with point at the beginning of -the new region. One use for it is to set region-saved local variables -\(see `mmm-save-local-variables'). - -INSERT specifies the keypress insertion spec for such submode regions. -INSERT's value should be list of elements of the form \(KEY NAME . -SPEC). Each KEY should be either a character, a function key symbol, -or a dotted list \(MOD . KEY) where MOD is a symbol for a modifier -key. The use of any other modifier than meta is discouraged, as -`mmm-insert-modifiers' is sometimes set to \(control), and other -modifiers are not very portable. Each NAME should be a symbol -representing the insertion for that key. Each SPEC can be either a -skeleton, suitable for passing to `skeleton-insert' to create a -submode region, or a dotted pair \(OTHER-KEY . ARG) meaning to use the -skeleton defined for OTHER-KEY but pass it the argument ARG as the -`str' variable, possible replacing a prompt string. Skeletons for -insertion should have the symbol `_' where point \(or wrapped text) -should go, and the symbol `@' in four different places: at the -beginning of the front delimiter, the beginning of the submode region, -the end of the submode region, and the end of the back delimiter. - -If END-NOT-BEGIN is non-nil, it specifies that a BACK delimiter cannot -begin a new submode region. - -MATCH-NAME, if supplied, specifies how to determine the \"name\" for -each submode region. It must be a string or a function. If it is a -function, it is passed the value of FRONT-FORM and must return the -name to use. If it is a string, it is used as-is unless SAVE-NAME has -a non-nil value, in which case, the string is interpreted the same as -BACK when SAVE-MATCHES is non-nil. If MATCH-NAME is not specified, -the regions are unnamed. Regions with the same name are considered -part of the same chunk of code, and formatted as such, while unnamed -regions are not grouped with any others. - -As a special optimization for insertion, if SKEL-NAME is non-nil, the -insertion code will use the user-prompted string value as the region -name, instead of going through the normal matching procedure. - -PRIVATE, if supplied and non-nil, means that this class is a private -or internal class, usually one invoked by another class via :classes, -and is not for the user to see.") - -(defun mmm-add-classes (classes) - "Add the submode classes CLASSES to `mmm-classes-alist'." - (dolist (class classes) - (add-to-list 'mmm-classes-alist class))) - -(defun mmm-add-group (group classes) - "Add CLASSES and a \"grouping class\" named GROUP which calls them all. -The CLASSES are all made private, i.e. non-user-visible." - (mmm-add-classes (mapcar #'(lambda (class) - (append class - '(:private t))) - classes)) - (add-to-list 'mmm-classes-alist - (list group :classes (mapcar #'first classes)))) - -(defun mmm-add-to-group (group classes) - "Add CLASSES to the \"grouping class\" named GROUP. -The CLASSES are all made private, i.e. non-user-visible." - (mmm-add-classes (mapcar #'(lambda (class) - (append class - '(:private t))) - classes)) - (mmm-set-class-parameter group :classes - (append (mmm-get-class-parameter group :classes) - (mapcar #'first classes)))) - -;;}}} -;;{{{ Version Number - -(defconst mmm-version "0.4.8" - "Current version of MMM Mode.") - -(defun mmm-version () - (interactive) - (message "MMM Mode version %s by Michael Abraham Shulman" mmm-version)) - -;;}}} -;;{{{ Temp Buffer Name - -(defvar mmm-temp-buffer-name " *mmm-temp*" - "Name for temporary buffers created by MMM Mode.") - -;;}}} -;;{{{ Interactive History - -(defvar mmm-interactive-history nil - "History of interactive mmm-ification in the current buffer. -Elements are either submode class symbols or class specifications. See -`mmm-classes-alist' for more information.") -(make-variable-buffer-local 'mmm-interactive-history) - -(defun mmm-add-to-history (class) - (add-to-list 'mmm-interactive-history class)) - -(defun mmm-clear-history () - "Clears history of interactive mmm-ification in current buffer." - (interactive) - (setq mmm-interactive-history nil)) - -;;}}} -;;{{{ Mode/Ext Manipulation - -(defvar mmm-mode-ext-classes () - "List of classes associated with current buffer by mode and filename. -Set automatically from `mmm-mode-ext-classes-alist'.") -(make-variable-buffer-local 'mmm-mode-ext-classes) - -(defun mmm-get-mode-ext-classes () - "Return classes for current buffer from major mode and filename. -Uses `mmm-mode-ext-classes-alist' to find submode classes." - (or mmm-mode-ext-classes - (setq mmm-mode-ext-classes - (mapcar #'third - (remove-if-not #'mmm-mode-ext-applies - mmm-mode-ext-classes-alist))))) - -(defun mmm-clear-mode-ext-classes () - "Clear classes added by major mode and filename." - (setq mmm-mode-ext-classes nil)) - -(defun mmm-mode-ext-applies (element) - (destructuring-bind (mode ext class) element - (and (if mode - (eq mode - ;; If MMM is on in this buffer, use the primary mode, - ;; otherwise use the normal indicator. - (or mmm-primary-mode major-mode)) - t) - (if ext - (and (buffer-file-name) - (save-match-data - (string-match ext (buffer-file-name)))) - t)))) - -(defun mmm-get-all-classes (global) - "Return a list of all classes applicable to the current buffer. -These come from mode/ext associations, `mmm-classes', and interactive -history, as well as `mmm-global-classes' if GLOBAL is non-nil." - (append mmm-interactive-history - (if (listp mmm-classes) mmm-classes (list mmm-classes)) - (if global mmm-global-classes ()) - (mmm-get-mode-ext-classes))) - -;;}}} - -(provide 'mmm-vars) - -;;; mmm-vars.el ends here |