diff options
Diffstat (limited to 'contrib/mmm/mmm-cmds.el')
-rw-r--r-- | contrib/mmm/mmm-cmds.el | 449 |
1 files changed, 0 insertions, 449 deletions
diff --git a/contrib/mmm/mmm-cmds.el b/contrib/mmm/mmm-cmds.el deleted file mode 100644 index f39da066..00000000 --- a/contrib/mmm/mmm-cmds.el +++ /dev/null @@ -1,449 +0,0 @@ -;;; mmm-cmds.el --- MMM Mode interactive commands and keymap - -;; Copyright (C) 2000 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 contains the interactive commands for MMM Mode. - -;;; Code: - -(require 'font-lock) -(require 'mmm-compat) -(require 'mmm-vars) -(require 'mmm-class) - -;; APPLYING CLASSES -;;{{{ Applying Predefined Classes - -(defun mmm-ify-by-class (class) - "Add submode regions according to an existing submode class." - (interactive - (list (intern - (completing-read - "Submode Class: " - (remove-duplicates - (mapcar #'(lambda (spec) (list (symbol-name (car spec)))) - (append - (remove-if #'(lambda (spec) (plist-get (cdr spec) :private)) - mmm-classes-alist) - (remove-if #'caddr mmm-autoloaded-classes))) - :test #'equal) - nil t)))) - (unless (eq class (intern "")) - (mmm-apply-class class) - (mmm-add-to-history class) - (mmm-update-font-lock-buffer))) - -;;}}} -;;{{{ Applying by the Region - -(defun mmm-ify-region (submode front back) - "Add a submode region for SUBMODE coinciding with current region." - (interactive "aSubmode: \nr") - (mmm-ify :submode submode :front front :back back) - (setq front (mmm-make-marker front t nil) - back (mmm-make-marker back nil nil)) - (mmm-add-to-history `(:submode ,submode :front ,front :back ,back)) - (mmm-enable-font-lock submode)) - -;;}}} -;;{{{ Applying Simple Regexps - -(defun mmm-ify-by-regexp - (submode front front-offset back back-offset save-matches) - "Add SUBMODE regions to the buffer delimited by FRONT and BACK. -With prefix argument, prompts for all additional keywords arguments. -See `mmm-classes-alist'." - (interactive "aSubmode: -sFront Regexp: -nOffset from Front Regexp: -sBack Regexp: -nOffset from Back Regexp: -nNumber of matched substrings to save: ") - (let ((args (mmm-save-keywords submode front back front-offset - back-offset save-matches))) - (apply #'mmm-ify args) - (mmm-add-to-history args)) - (mmm-enable-font-lock submode)) - -;;}}} - -;; EDITING WITH REGIONS -;;{{{ Re-parsing Areas - -(defun mmm-parse-buffer () - "Re-apply all applicable submode classes to current buffer. -Clears all current submode regions, reapplies all past interactive -mmm-ification, and applies `mmm-classes' and mode-extension classes." - (interactive) - (message "MMM-ifying buffer...") - (mmm-apply-all) - (message "MMM-ifying buffer...done")) - -(defun mmm-parse-region (start stop) - "Re-apply all applicable submode classes between START and STOP. -Clears all current submode regions, reapplies all past interactive -mmm-ification, and applies `mmm-classes' and mode-extension classes." - (interactive "r") - (message "MMM-ifying region...") - (mmm-apply-all :start start :stop stop) - (message "MMM-ifying region...done")) - -(defun mmm-parse-block (&optional lines) - "Re-parse LINES lines before and after point \(default 1). -Clears all current submode regions, reapplies all past interactive -mmm-ification, and applies `mmm-classes' and mode-extension classes. - -This command is intended for use when you have just typed what should -be the delimiters of a submode region and you want to create the -region. However, you may want to look into the various types of -delimiter auto-insertion that MMM Mode provides. See, for example, -`mmm-insert-region'." - (interactive "p") - (message "MMM-ifying block...") - (destructuring-bind (start stop) (mmm-get-block lines) - (when (< start stop) - (mmm-apply-all :start start :stop stop))) - (message "MMM-ifying block...done")) - -(defun mmm-get-block (lines) - (let ((inhibit-point-motion-hooks t)) - (list (save-excursion - (forward-line (- lines)) - (beginning-of-line) - (point)) - (save-excursion - (forward-line lines) - (end-of-line) - (point))))) - -;;}}} -;;{{{ Reparse Current Region - -(defun mmm-reparse-current-region () - "Clear and reparse the area of the current submode region. -Use this command if a submode region's boundaries have become wrong." - (interactive) - (let ((ovl (mmm-overlay-at (point) 'all))) - (when ovl - (let ((beg (save-excursion - (goto-char (mmm-front-start ovl)) - (forward-line -1) - (point))) - (end (save-excursion - (goto-char (mmm-back-end ovl)) - (forward-line 1) - (point)))) - (mmm-parse-region beg end))))) - -;;}}} -;;{{{ Clear Submode Regions - -;; See also `mmm-clear-history' which is interactive. - -(defun mmm-clear-current-region () - "Deletes the submode region point is currently in, if any." - (interactive) - (delete-overlay (mmm-overlay-at (point) 'all))) - -(defun mmm-clear-regions (start stop) - "Deletes all submode regions from START to STOP." - (interactive "r") - (mmm-clear-overlays start stop)) - -(defun mmm-clear-all-regions () - "Deletes all submode regions in the current buffer." - (interactive) - (mmm-clear-overlays)) - -;;}}} -;;{{{ End Current Region - -(defun* mmm-end-current-region (&optional arg) - "End current submode region. -If ARG is nil, end it at the most appropriate place, usually its -current back boundary. If ARG is non-nil, end it at point. If the -current region is correctly bounded, the first does nothing, but the -second deletes that delimiter as well. - -If the region's BACK property is a string, it is inserted as above and -the overlay moved if necessary. If it is a function, it is called with -two arguments--the overlay, and \(if ARG 'middle t)--and must do the -entire job of this function." - (interactive "P") - (let ((ovl (mmm-overlay-at))) - (when ovl - (combine-after-change-calls - (save-match-data - (save-excursion - (when (mmm-match-back ovl) - (if arg - (replace-match "") - (return-from mmm-end-current-region))))) - (let ((back (overlay-get ovl 'back))) - (cond ((stringp back) - (save-excursion - (unless arg (goto-char (overlay-end ovl))) - (save-excursion (insert back)) - (move-overlay ovl (overlay-start ovl) (point)))) - ((functionp back) - (funcall back ovl (if arg 'middle t)))))) - (mmm-refontify-maybe (save-excursion (forward-line -1) (point)) - (save-excursion (forward-line 1) (point)))))) - -;;}}} -;;{{{ Narrow to Region - -(defun mmm-narrow-to-submode-region (&optional pos) - "Narrow to the submode region at point." - (interactive) - ;; Probably don't use mmm-current-overlay here, because this is - ;; sometimes called from inside messy functions. - (let ((ovl (mmm-overlay-at pos))) - (when ovl - (narrow-to-region (overlay-start ovl) (overlay-end ovl))))) - -;; The inverse command is `widen', usually on `C-x n w' - -;;}}} - -;; INSERTING REGIONS -;;{{{ Insert regions by keystroke - -;; This is the "default" binding in the MMM Mode keymap. Keys defined -;; by classes should be control keys, to avoid conflicts with MMM -;; commands. -(defun mmm-insert-region (arg) - "Insert a submode region based on last character in invoking keys. -Keystrokes after `mmm-mode-prefix-key' which are not bound to an MMM -Mode command \(see `mmm-command-modifiers') are passed on to this -function. If they have the modifiers `mmm-insert-modifiers', then they -are looked up, sans those modifiers, in all current submode classes to -find an insert skeleton. For example, in Mason, `p' \(with appropriate -prefix and modifiers) will insert a <%perl>...</%perl> region." - (interactive "P") - (let* ((seq (this-command-keys)) - (event (aref seq (1- (length seq)))) - (mods (event-modifiers event)) - (key (mmm-event-key event))) - (if (subsetp mmm-insert-modifiers mods) - (mmm-insert-by-key - (append (set-difference mods mmm-insert-modifiers) - key) - arg)))) - -(defun mmm-insert-by-key (key &optional arg) - "Insert a submode region based on event KEY. -Inspects all the classes of the current buffer to find a matching -:insert key sequence. See `mmm-classes-alist'. ARG, if present, is -passed on to `skeleton-proxy-new' to control wrapping. - -KEY must be a list \(MODIFIERS... . BASIC-KEY) where MODIFIERS are -symbols such as shift, control, etc. and BASIC-KEY is a character code -or a symbol such as tab, return, etc. Note that if there are no -MODIFIERS, the dotted list becomes simply BASIC-KEY." - (multiple-value-bind (class skel str) (mmm-get-insertion-spec key) - (when skel - (let ((after-change-functions nil) - (old-undo buffer-undo-list) undo - ;; da: Proof General patch for compatibility with holes.el, - ;; bind this variable to prevent inserting holes here. - mmm-inside-insert-by-key) - ;; XEmacs' skeleton doesn't manage positions by itself, so we - ;; have to do it. - (if mmm-xemacs (setq skeleton-positions nil)) - (skeleton-proxy-new skel str arg) - (destructuring-bind (back end beg front) skeleton-positions - ;; TODO: Find a way to trap invalid-parent signals from - ;; make-region and undo the skeleton insertion. - (let ((match-submode (plist-get class :match-submode)) - (match-face (plist-get class :match-face)) - (match-name (plist-get class :match-name)) - (front-form (regexp-quote (buffer-substring front beg))) - (back-form (regexp-quote (buffer-substring end back))) - submode face name) - (setq submode - (mmm-modename->function - (if match-submode - (mmm-save-all (funcall match-submode front-form)) - (plist-get class :submode)))) - (setq face - (cond ((functionp match-face) - (mmm-save-all - (funcall match-face front-form))) - (match-face - (cdr (assoc front-form match-face))) - (t - (plist-get class :face)))) - (setq name - (cond ((plist-get class :skel-name) - ;; Optimize the name to the user-supplied str - ;; if we are so instructed. - str) - ;; Call it if it is a function - ((functionp match-name) - (mmm-save-all (funcall match-name front-form))) - ;; Now we know it's a string, does it need to - ;; be formatted? - ((plist-get class :save-name) - ;; Yes. Haven't done a match before, so - ;; match the front regexp against the given - ;; form to format the string - (string-match (plist-get class :front) - front-form) - (mmm-format-matches match-name front-form)) - (t - ;; No, just use it as-is - match-name))) - (mmm-make-region - submode beg end - :face face - :name name - :front front :back back - :match-front front-form :match-back back-form - :evaporation 'front -;;; :beg-sticky (plist-get class :beg-sticky) -;;; :end-sticky (plist-get class :end-sticky) - :beg-sticky t :end-sticky t - :creation-hook (plist-get class :creation-hook)) - (mmm-enable-font-lock submode))) - ;; Now get rid of intermediate undo boundaries, so that the entire - ;; insertion can be undone as one action. This should really be - ;; skeleton's job, but it doesn't do it. - (setq undo buffer-undo-list) - (while (not (eq (cdr undo) old-undo)) - (when (eq (cadr undo) nil) - (setcdr undo (cddr undo))) - (setq undo (cdr undo))))))) - -(defun mmm-get-insertion-spec (key &optional classlist) - "Get the insertion info for KEY from all classes in CLASSLIST. -Return \(CLASS SKEL STR) where CLASS is the class spec a match was -found in, SKEL is the skeleton to insert, and STR is the argument. -CLASSLIST defaults to the return value of `mmm-get-all-classes', -including global classes." - (loop for classname in (or classlist (mmm-get-all-classes t)) - for class = (mmm-get-class-spec classname) - for inserts = (plist-get class :insert) - for skel = (cddr (assoc key inserts)) - with str - ;; If SKEL is a dotted pair, it means call another key's - ;; insertion spec with an argument. - unless (consp (cdr skel)) - do (setq str (cdr skel) - skel (cddr (assoc (car skel) inserts))) - if skel return (list class skel str) - ;; If we have a group class, recurse. - if (plist-get class :classes) - if (mmm-get-insertion-spec key it) - return it - else - return nil)) - -;;}}} -;;{{{ Help on Insertion - -(defun mmm-insertion-help () - "Display help on currently available MMM insertion commands." - (interactive) - (with-output-to-temp-buffer "*Help*" - (princ "Available MMM Mode Insertion Commands:\n") - (princ "Key Inserts\n") - (princ "--- -------\n\n") - (mapcar #'mmm-display-insertion-key - (mmm-get-all-insertion-keys)))) - -(defun mmm-display-insertion-key (spec) - "Print an insertion binding to standard output. -SPEC should be \(KEY NAME ...) where KEY is an insertion key and NAME -is a symbol naming the insertion." - (let* ((str (make-string 16 ?\ )) - ;; This gets us a dotted list, because of the way insertion - ;; keys are specified. - (key (append mmm-insert-modifiers (car spec))) - (lastkey (nthcdr (max (1- (safe-length key)) 0) key))) - ;; Now we make it a true list - (if (consp key) - (setcdr lastkey (list (cdr lastkey))) - (setq key (list key))) - ;; Get the spacing right - (store-substring str 0 - (key-description - (apply #'vector (append mmm-mode-prefix-key (list key))))) - (princ str) - ;; Now print the binding symbol - (princ (cadr spec)) - (princ "\n"))) - -(defun mmm-get-all-insertion-keys (&optional classlist) - "Return an alist of all currently available insertion keys. -Elements look like \(KEY NAME ...) where KEY is an insertion key and -NAME is a symbol naming the insertion." - (remove-duplicates - (loop for classname in (or classlist (mmm-get-all-classes t)) - for class = (mmm-get-class-spec classname) - append (plist-get class :insert) into keys - ;; If we have a group class, recurse. - if (plist-get class :classes) - do (setq keys (append keys (mmm-get-all-insertion-keys it))) - finally return keys) - :test #'equal - :key #'(lambda (x) (cons (car x) (cadr x))) - :from-end t)) - -;;}}} - -;;{{{ Auto Insertion (copied from interactive session);-COM- -;-COM- -;-COM-;; Don't use `mmm-ify-region' of course. And rather than having -;-COM-;; classes define their own functions, we should have them pass a -;-COM-;; skeleton as an attribute. Then our insert function can turn off -;-COM-;; after-change hooks and add the submode region afterward. -;-COM- -;-COM-(define-skeleton mmm-see-inline -;-COM- "" nil -;-COM- -1 @ " " _ " " @ "%>" -;-COM- '(apply #'mmm-ify-region 'cperl-mode (reverse skeleton-positions))) -;-COM- -;-COM-(define-skeleton mmm-see-other -;-COM- "" nil -;-COM- @ ";\n" _ "\n" @ "<%/" str ">" -;-COM- '(apply #'mmm-ify-region 'cperl-mode (reverse skeleton-positions))) -;-COM- -;-COM-(make-local-hook 'after-change-functions) -;-COM-(add-hook 'after-change-functions 'mmm-detect t) -;-COM- -;-COM-(defun mmm-detect (beg end length) -;-COM- (when (mmm-looking-back-at "<% ") -;-COM- (mmm-see-inline)) -;-COM- (when (mmm-looking-back-at "<%\\(\\w+\\)>") -;-COM- (mmm-see-other (match-string 1)))) -;-COM- -;;}}} - -(provide 'mmm-cmds) - -;;; mmm-cmds.el ends here
\ No newline at end of file |