From 0d342f0aee3f2f800e486c0051dabe718a7b2841 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 23 Mar 2011 11:14:27 +0100 Subject: I don't like nxhtml --- emacs.d/nxhtml/util/mumamo-fun.el | 3333 ------------------------------------- 1 file changed, 3333 deletions(-) delete mode 100644 emacs.d/nxhtml/util/mumamo-fun.el (limited to 'emacs.d/nxhtml/util/mumamo-fun.el') diff --git a/emacs.d/nxhtml/util/mumamo-fun.el b/emacs.d/nxhtml/util/mumamo-fun.el deleted file mode 100644 index eb3c5c2..0000000 --- a/emacs.d/nxhtml/util/mumamo-fun.el +++ /dev/null @@ -1,3333 +0,0 @@ -;;; mumamo-fun.el --- Multi major mode functions -;; -;; Author: Lennart Borgman (lennart O borgman A gmail O com) -;; Created: 2008-03-09T01:35:21+0100 Sun -;; Version: 0.51 -;; Last-Updated: 2008-08-04T17:54:29+0200 Mon -;; URL: -;; Keywords: -;; Compatibility: -;; -;; Features that might be required by this library: -;; -;; `backquote', `bytecomp', `cl', `flyspell', `ispell', `mumamo', -;; `sgml-mode'. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. -;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;; Defines some "multi major modes" functions. See mumamo.el for more -;; information. -;; -;;;; Usage: -;; -;; See mumamo.el for how to use the multi major mode functions -;; defined here. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Change log: -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (add-to-list 'load-path default-directory)) -(eval-when-compile (require 'mumamo)) -(eval-when-compile (require 'sgml-mode)) -;;(mumamo-require) - -;;;#autoload -;;(defun mumamo-fun-require ()) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; File wide key bindings - -(defun mumamo-multi-mode-map () - "Return mumamo multi mode keymap." - (symbol-value - (intern-soft (concat (symbol-name mumamo-multi-major-mode) "-map")))) - -;; (defun mumamo-multi-mode-hook-symbol () -;; "Return mumamo multi mode hook symbol." -;; (intern-soft (concat (symbol-name mumamo-multi-major-mode) "-hook"))) - -;;;###autoload -(defun mumamo-define-html-file-wide-keys () - "Define keys in multi major mode keymap for html files." - (let ((map (mumamo-multi-mode-map))) - (define-key map [(control ?c) (control ?h) ?b] 'nxhtml-browse-file) - )) -;; (defun mumamo-add-html-file-wide-keys (hook) -;; (add-hook hook 'mumamo-define-html-file-wide-keys) -;; ) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Chunk search routines for XHTML things - -(defun mumamo-chunk-attr= (pos min max attr= attr=is-regex attr-regex submode) - "This should work similar to `mumamo-find-possible-chunk'. -See `mumamo-chunk-style=' for an example of use. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-chunk-attr=-new pos max attr= attr=is-regex attr-regex submode)) - -(defun mumamo-chunk-attr=-new-fw-exc-fun (pos max) - ;;(msgtrc "(mumamo-chunk-attr=-new-fw-exc-fun %s %s)" pos max) - (save-match-data - (let ((here (point)) - first-dq - next-dq - (this-chunk (mumamo-get-existing-new-chunk-at pos))) - (if this-chunk - (goto-char (overlay-end this-chunk)) - (goto-char (overlay-end mumamo-last-chunk))) - (setq first-dq (search-forward "\"" max t)) - (unless (bobp) - (backward-char) - (condition-case err - (with-syntax-table (standard-syntax-table) - (setq next-dq (scan-sexps (point) 1))) - (error nil))) - (prog1 - next-dq - (goto-char here))))) - -(defun mumamo-chunk-attr=-new-find-borders-fun (start-border end-border dummy) - ;;(setq borders (funcall find-borders-fun start-border end-border exc-mode)) - (save-match-data - (let ((here (point)) - (end2 (when end-border (1- end-border))) - start2) - (goto-char start-border) - (save-match-data - (setq start2 (search-forward "\"" (+ start-border 200) t))) - (goto-char here) - (list start2 end2)))) - -(defun mumamo-chunk-attr=-new (pos - ;;min - max - attr= - attr=is-regex - attr-regex - submode) - ;;(message "\n(mumamo-chunk-attr=-new %s %s %s %s %s %s)" pos max attr= attr=is-regex attr-regex submode) - ;;(mumamo-condition-case err - (condition-case err - (save-match-data - (let ((here (point)) - (next-attr= (progn - ;; fix-me: - (if (not attr=is-regex) - (goto-char (+ pos (length attr=))) - (goto-char pos) - (skip-chars-forward "a-zA-Z=")) - (goto-char pos) - (if attr=is-regex - (re-search-forward attr= max t) - (search-forward attr= max t)))) - next-attr-sure - ;;next-attr= - start start-border - end end-border - exc-mode - borders - exc-start-next - exc-end-next - exc-start-next - exc-end-next - (tries 0) - (min (1- pos)) - look-max - ) - ;; make sure if we have find prev-attr= or not - (unless (eq (char-after) ?\") - (setq next-attr= nil)) - (when next-attr= - (forward-char) - (skip-chars-forward "^\"") - (setq look-max (+ (point) 2))) - (while (and next-attr= - (< min (point)) - (not next-attr-sure) - (< tries 5)) - ;;(msgtrc "attr=-new: min=%s, point=%s" min (point)) - (setq tries (1+ tries)) - ;;(if (not (re-search-backward "<[^?]" (- min 300) t)) - (if (not (re-search-backward "<[^?]\\|\?>" (- min 300) t)) - (setq next-attr= nil) - ;;(if (looking-at attr-regex) - (if (let ((here (point))) - (prog1 - (re-search-forward attr-regex look-max t) - (goto-char here))) - ;;(if (mumamo-end-in-code (point) next-attr= 'php-mode) - (setq next-attr-sure 'found) - (unless (bobp) - (backward-char) - ;;(msgtrc "attr=-new 1: min=%s, point=%s" min (point)) - (setq next-attr= (if attr=is-regex - (re-search-backward attr= (- min 300) t) - (search-backward attr= (- min 300) t))))))) - (unless next-attr-sure (setq next-attr= nil)) - - - ;; find prev change and if inside style= the next change - (when next-attr= - (setq exc-start-next (match-beginning 1)) - (setq exc-end-next (match-end 2)) - (when (>= exc-start-next pos) - (if (> pos exc-end-next) - (progn - (setq start (+ (match-end 2) 1)) - ;;(setq start-border (+ (match-end 2) 2)) - ) - (setq exc-mode submode) - (setq start (match-beginning 1)) - (setq start-border (match-beginning 2)) - (setq end (1+ (match-end 2))) - (setq end-border (1- end))) - )) - ;; find next change - (unless end - (if start - (goto-char start) - (goto-char pos) - (search-backward "<" min t)) - ;;(msgtrc "attr=-new 2: min=%s, point=%s" min (point)) - (setq next-attr= (if attr=is-regex - (re-search-forward attr= max t) - (search-forward attr= max t))) - (when (and next-attr= - (search-backward "<" min t)) - (when (looking-at attr-regex) - (setq end (match-beginning 1))))) - (when start (assert (>= start pos) t)) - (when end (assert (<= pos end) t)) - ;;(message "start-border=%s end-border=%s" start-border end-border) - (when (or start-border end-border) - (setq borders (list start-border end-border nil))) - ;; (message "mumamo-chunk-attr=-new: %s" - ;; (list start - ;; end - ;; exc-mode - ;; borders - ;; nil ;; parseable-by - ;; 'mumamo-chunk-attr=-new-fw-exc-fun ;; fw-exc-fun - ;; 'mumamo-chunk-attr=-new-find-borders-fun ;; find-borders-fun - ;; )) - (goto-char here) - (setq end nil) - (when (or start end) - (list start - end - exc-mode - borders - nil ;; parseable-by - 'mumamo-chunk-attr=-new-fw-exc-fun ;; fw-exc-fun - 'mumamo-chunk-attr=-new-find-borders-fun ;; find-borders-fun - )))) - (error (mumamo-display-error 'mumamo-chunk-attr=-new "%s" (error-message-string err))) - )) - -;;;; xml pi - -(defvar mumamo-xml-pi-mode-alist - '(("php" . php-mode) - ("python" . python-mode)) - "Alist used by `mumamo-chunk-xml-pi' to get exception mode." ) - -;; Fix-me: make it possible to make the borders part of the php chunk -;; so that parsing of them by nxml may be skipped. Or, rather if the -;; borders are not part of the chunk then assume nxml can not parse -;; the chunk and the borders. -;; (defun mumamo-search-bw-exc-start-xml-pi-1 (pos min lt-chars) -;; "Helper for `mumamo-chunk-xml-pi'. -;; POS is where to start search and MIN is where to stop. -;; LT-CHARS is just at pos is end of 1000 pos) -;;; (assert (and (= (char-after pos) ??) -;;; (= (char-after (1+ pos)) ?>))) - (save-excursion - (save-restriction - (widen) - (save-match-data - (when (search-backward "<" (- pos 150) t) - (when (looking-at (rx line-start "<\?xml" (1+ space))) - (mumamo-msgfntfy "mumamo-xml-pi-end-is-xml-end %s => t" pos) - t))))))) - -;; (defun mumamo-search-bw-exc-end-xml-pi (pos min) -;; "Helper for `mumamo-chunk-xml-pi'. -;; POS is where to start search and MIN is where to stop." -;; ;; Fix me: merge xml header -;; (mumamo-msgfntfy "mumamo-search-bw-exc-end-xml-pi %s %s" pos min) -;; ;;(let ((end-pos (mumamo-chunk-end-bw-str pos min "?>"))) -;; (let ((end-pos (mumamo-chunk-end-bw-str-inc pos min "?>"))) -;; (mumamo-msgfntfy " end-pos=%s" end-pos) -;; (when end-pos -;; (unless (or (mumamo-xml-pi-end-is-xml-end end-pos) -;; (= (save-restriction -;; (widen) -;; (char-after (- end-pos 1))) -;; ?<)) -;; (mumamo-msgfntfy " returning end-pos") -;; end-pos)))) - -(defun mumamo-search-fw-exc-end-xml-pi (pos max) - "Helper for `mumamo-chunk-xml-pi'. -POS is where to start search and MAX is where to stop." - ;; Fix me: merge xml header - ;;(let ((end-pos (mumamo-chunk-end-fw-str pos max "?>"))) - (save-match-data - (let ((end-pos (mumamo-chunk-end-fw-str-inc pos max "?>"))) - (when end-pos - (unless (mumamo-xml-pi-end-is-xml-end end-pos) - end-pos))))) - -(defun mumamo-search-fw-exc-start-xml-pi-1 (pos max lt-chars) - "Helper for `mumamo-chunk-xml-pi'. -POS is where to start search and MAX is where to stop. - -Used in `mumamo-search-fw-exc-start-xml-pi'. For an explanation -of LT-CHARS see `mumamo-search-bw-exc-start-xml-pi-1'." - (goto-char pos) - (skip-chars-backward "a-zA-Z") - ;;(let ((end-out (mumamo-chunk-start-fw-str (point) max lt-chars))) - (let ((end-out (mumamo-chunk-start-fw-str-inc (point) max lt-chars)) - spec - exc-mode - hit) - (when (looking-at "xml") - (if t ;(= 1 pos) - (setq end-out (mumamo-chunk-start-fw-str-inc (1+ (point)) max lt-chars)) - (setq end-out nil))) - (when end-out - ;; Get end-out: - (if (looking-at (rx (0+ (any "a-z")))) - (progn - ;;(setq end-out (match-end 0)) - (setq end-out (- (match-beginning 0) 2)) - (setq spec (match-string-no-properties 0)) - (setq exc-mode (assoc spec mumamo-xml-pi-mode-alist)) - (if exc-mode - (setq exc-mode (cdr exc-mode)) - (setq exc-mode 'php-mode)) - (setq end-out (list end-out exc-mode nil)) - ) - (setq end-out nil)) - end-out))) - -(defun mumamo-search-fw-exc-start-xml-pi-old (pos max) - "Helper for `mumamo-chunk-xml-pi'. -POS is where to start search and MAX is where to stop." - (mumamo-search-fw-exc-start-xml-pi-1 pos max "" can be handled. -;; -;; Fix-me: Maybe generalize for other values than ") - (here (point))) - (if (and inc) ;; exc-mode) - (progn - (when start - ;;(setq start-border (+ start (length begin-mark))) - (goto-char (+ start (length begin-mark))) - (skip-chars-forward "=a-zA-Z") - (setq start-border (point)) - ) - (when end - (setq end-border - (- end (length end-mark))))) - (if (and (not inc) (not exc-mode)) - (progn - (when start - (setq start-border - (+ start (length end-mark)))) - (when end - (setq end-border (- end (length begin-mark))) - ;;(goto-char end) - ;;(skip-chars-forward "=a-zA-Z") - ;;(setq end-border (point)) - )))) - (goto-char here) - (when (or start-border end-border) - (list start-border end-border)))) - -(defun mumamo-chunk-xml-pi (pos min max) - "Find process instruction, . Return range and wanted mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-xml-pi - ;; 'mumamo-search-bw-exc-end-xml-pi - ;; 'mumamo-search-fw-exc-start-xml-pi-old - ;; 'mumamo-search-fw-exc-end-xml-pi - ;; 'mumamo-find-borders-xml-pi) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-xml-pi-new - 'mumamo-search-fw-exc-end-xml-pi - 'mumamo-find-borders-xml-pi)) - - -;;;; ")) - -;; (defun mumamo-search-fw-exc-start-inlined-style-old (pos max) -;; "Helper for `mumamo-chunk-inlined-style'. -;; POS is where to start search and MAX is where to stop." -;; (goto-char (1+ pos)) -;; (skip-chars-backward "^<") -;; ;; Handle "))) - -;; (defun mumamo-chunk-inlined-style-old (pos min max) -;; "Find . Return range and 'css-mode. -;; See `mumamo-find-possible-chunk' for POS, MIN and MAX." -;; (mumamo-find-possible-chunk pos min max -;; 'mumamo-search-bw-exc-start-inlined-style -;; 'mumamo-search-bw-exc-end-inlined-style -;; 'mumamo-search-fw-exc-start-inlined-style-old -;; 'mumamo-search-fw-exc-end-inlined-style)) - -(defun mumamo-search-fw-exc-start-inlined-style (pos max) - "Helper for `mumamo-chunk-inlined-style'. -POS is where to start search and MAX is where to stop." - (goto-char (1+ pos)) - (skip-chars-backward "^<") - ;; Handle .... Return range and 'css-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-inlined-style - 'mumamo-search-fw-exc-end-inlined-style)) - -;;;; ")) - -;; (defun mumamo-search-fw-exc-start-inlined-script-old (pos max) -;; "Helper for `mumamo-chunk-inlined-script'. -;; POS is where to start search and MAX is where to stop." -;; (goto-char (1+ pos)) -;; (skip-chars-backward "^<") -;; ;; Handle "))) - -;; (defun mumamo-chunk-inlined-script-old (pos min max) -;; "Find . Return range and 'javascript-mode. -;; See `mumamo-find-possible-chunk' for POS, MIN and MAX." -;; (mumamo-find-possible-chunk pos min max -;; 'mumamo-search-bw-exc-start-inlined-script -;; 'mumamo-search-bw-exc-end-inlined-script -;; 'mumamo-search-fw-exc-start-inlined-script-old -;; 'mumamo-search-fw-exc-end-inlined-script)) - -(defun mumamo-search-fw-exc-start-inlined-script (pos max) - "Helper for `mumamo-chunk-inlined-script'. -POS is where to start search and MAX is where to stop." - (goto-char (1+ pos)) - (skip-chars-backward "^<") - ;; Handle .... Return range and 'javascript-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-inlined-script - 'mumamo-search-fw-exc-end-inlined-script)) - -;;;; on[a-z]+=\"javascript:" - -(defconst mumamo-onjs=-attr= - (rx - ;;"on[a-z]+=" - (or "onclick" "ondblclick" "onmousedown" "onmousemove" "onmouseout" "onmouseover" "onmouseup" "onkeydown" "onkeypress" "onkeyup") - "=")) - -(defconst mumamo-onjs=-attr-regex - (rx point - (or "<" "?>") - (* (not (any ">"))) - space - (submatch - ;;"on" (1+ (any "a-za-z")) - (or "onclick" "ondblclick" "onmousedown" "onmousemove" "onmouseout" "onmouseover" "onmouseup" "onkeydown" "onkeypress" "onkeyup") - "=") - (0+ space) - ?\" - (submatch - (opt "javascript:") - (0+ - (not (any "\"")))) - )) - -(defun mumamo-chunk-onjs=(pos min max) - "Find javascript on...=\"...\". Return range and 'javascript-mode." - (mumamo-chunk-attr= pos min max mumamo-onjs=-attr= t mumamo-onjs=-attr-regex - 'javascript-mode)) - -;;;; py:somthing=\"python\" - -(defconst mumamo-py:=-attr= "py:[a-z]+=") - -(defconst mumamo-py:=-attr-regex - (rx point - (or "<" "?>") - (* (not (any ">"))) - space - (submatch - "py:" (1+ (any "a-za-z")) - "=") - (0+ space) - ?\" - (submatch - (0+ - (not (any "\"")))) - )) - -(defun mumamo-chunk-py:=(pos min max) - "Find python py:...=\"...\". Return range and 'python-mode." - (mumamo-chunk-attr= pos min max mumamo-py:=-attr= t mumamo-py:=-attr-regex - 'python-mode)) - -(defun mumamo-chunk-py:match (pos min max) - (save-match-data - (let ((here (point)) - (py:match (progn - (goto-char pos) - (re-search-forward (rx "py:match" - (1+ space) - (0+ (not (any ">"))) - word-start - (submatch "path=") - (0+ space) - ?\" - (submatch - (0+ - (not (any "\""))))) - max t))) - start end borders - ) - (when py:match - (setq start (match-beginning 1)) - (setq end (match-end 2)) - (setq borders (list (match-end 1) (1- end))) - ) - (goto-char here) - (when start - (list start - end - 'python-mode - borders - nil ;; parseable-by - 'mumamo-chunk-attr=-new-fw-exc-fun ;; fw-exc-fun - 'mumamo-chunk-attr=-new-find-borders-fun ;; find-borders-fun - ))))) - -;;;; style= - -(defconst mumamo-style=start-regex - (rx "<" - (0+ (not (any ">"))) - space - (submatch "style=") - (0+ space) - ?\" - (submatch - (0+ - (not (any "\"")))) - )) - -(defun mumamo-chunk-style=(pos min max) - "Find style=\"...\". Return range and 'css-mode." - (mumamo-chunk-attr= pos min max "style=" nil mumamo-style=start-regex - 'css-mode)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; HTML w html-mode - -(put 'mumamo-alt-php-tags-mode 'permanent-local t) -(define-minor-mode mumamo-alt-php-tags-mode - "Minor mode for using '(?php' instead of ' in strings. - -There is no reason to use this minor mode unless you want XML -validation and/or completion in your php file. If you do not -want that then you can simply use a multi major mode based on -`html-mode' instead of `nxml-mode'/`nxhtml-mode'. Or, of course, -just `php-mode' if there is no html code in the file." - :lighter "" nil t) - (replace-match "?)")) - (goto-char here)))) - (save-restriction - (let ((here (point))) - (widen) - (goto-char (point-min)) - (while (search-forward "(?php" nil t) - (replace-match "")) - (goto-char here))) - (remove-hook 'write-contents-functions 'mumamo-alt-php-write-contents t))) - -(defun mumamo-chunk-alt-php (pos min max) - "Find (?php ... ?), return range and `php-mode'. -Workaround for the problem that I can not tame `nxml-mode' to recognize ")) - (basic-save-buffer-1) - (signal 'mumamo-error-ind-0 nil))) - (mumamo-error-ind-0))) - (set-buffer-modified-p nil)) - (goto-char here)) - ;; saved, return t - t) - -;;;###autoload -(define-mumamo-multi-major-mode nxml-mumamo-mode - "Turn on multiple major modes for (X)HTML with main mode `nxml-mode'. -This covers inlined style and javascript and PHP. - -See also `mumamo-alt-php-tags-mode'." - ("nXml Family" nxml-mode - (mumamo-chunk-xml-pi - mumamo-chunk-alt-php - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) -(add-hook 'nxml-mumamo-mode-hook 'mumamo-define-html-file-wide-keys) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Mason (not ready) -;; http://www.masonhq.com/docs/manual/Devel.html#examples_and_recommended_usage - -(defun mumamo-chunk-mason-perl-line (pos min max) - (mumamo-whole-line-chunk pos min max "%" 'perl-mode)) - -(defun mumamo-chunk-mason-perl-single (pos min max) - (mumamo-quick-static-chunk pos min max "<% " " %>" t 'perl-mode t)) - -(defun mumamo-chunk-mason-perl-block (pos min max) - (mumamo-quick-static-chunk pos min max "<%perl>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-perl-init (pos min max) - (mumamo-quick-static-chunk pos min max "<%init>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-perl-once (pos min max) - (mumamo-quick-static-chunk pos min max "<%once>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-perl-cleanup (pos min max) - (mumamo-quick-static-chunk pos min max "<%cleanup>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-perl-shared (pos min max) - (mumamo-quick-static-chunk pos min max "<%shared>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-simple-comp (pos min max) - (mumamo-quick-static-chunk pos min max "<& " " &>" t 'text-mode t)) - -(defun mumamo-chunk-mason-args (pos min max) - ;; Fix-me: perl-mode is maybe not the best here? - (mumamo-quick-static-chunk pos min max "<%args>" "" t 'perl-mode t)) - -(defun mumamo-chunk-mason-doc (pos min max) - (mumamo-quick-static-chunk pos min max "<%doc>" "" t 'mumamo-comment-mode t)) - -(defun mumamo-chunk-mason-text (pos min max) - (mumamo-quick-static-chunk pos min max "<%text>" "" t 'text-mode t)) - -;; component calls with content - -;; (defun mumamo-chunk-mason-compcont-bw-exc-start-fun (pos min) -;; (let ((exc-start (mumamo-chunk-start-bw-str-inc pos min "<&| "))) -;; (and exc-start -;; (<= exc-start pos) -;; (cons exc-start 'html-mode)))) - -;; (defun mumamo-chunk-mason-compcont-fw-exc-start-fun-old (pos max) -;; (mumamo-chunk-start-fw-str-inc pos max "<&| ")) - -(defun mumamo-chunk-mason-compcont-fw-exc-end-fun (pos max) - (mumamo-chunk-end-fw-str-inc pos max "")) - -(defun mumamo-chunk-mason-compcont-find-borders-fun (start end dummy) - (when dummy - (list - (when start - (save-match-data - (let ((here (point)) - ret) - (goto-char start) - (when (re-search-forward "[^>]* &>" end t) - (setq ret (point)) - (goto-char here) - ret)) - )) - (when end (- end 4)) - dummy))) - -;; (defun mumamo-chunk-mason-compcont-old (pos min max) -;; (mumamo-find-possible-chunk-new pos -;; max -;; 'mumamo-chunk-mason-compcont-bw-exc-start-fun -;; 'mumamo-chunk-mason-compcont-fw-exc-start-fun-old -;; 'mumamo-chunk-mason-compcont-fw-exc-end-fun -;; 'mumamo-chunk-mason-compcont-find-borders-fun)) - -(defun mumamo-chunk-mason-compcont-fw-exc-start-fun (pos max) - (let ((where (mumamo-chunk-start-fw-str-inc pos max "<&| "))) - (when where - (list where 'html-mode nil)))) - -(defun mumamo-chunk-mason-compcont (pos min max) - (mumamo-possible-chunk-forward pos max - 'mumamo-chunk-mason-compcont-fw-exc-start-fun - 'mumamo-chunk-mason-compcont-fw-exc-end-fun - 'mumamo-chunk-mason-compcont-find-borders-fun)) - -;;;###autoload -(define-mumamo-multi-major-mode mason-html-mumamo-mode - "Turn on multiple major modes for Mason using main mode `html-mode'. -This covers inlined style and javascript." - ("Mason html Family" html-mode - ( - mumamo-chunk-mason-perl-line - mumamo-chunk-mason-perl-single - mumamo-chunk-mason-perl-block - mumamo-chunk-mason-perl-init - mumamo-chunk-mason-perl-once - mumamo-chunk-mason-perl-cleanup - mumamo-chunk-mason-perl-shared - mumamo-chunk-mason-simple-comp - mumamo-chunk-mason-compcont - mumamo-chunk-mason-args - mumamo-chunk-mason-doc - mumamo-chunk-mason-text - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) -(add-hook 'mason-html-mumamo-mode-hook 'mumamo-define-html-file-wide-keys) -(mumamo-inherit-sub-chunk-family-locally 'mason-html-mumamo-mode 'mason-html-mumamo-mode) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Embperl - -(defun mumamo-chunk-embperl-<- (pos min max) - "Find [- ... -], return range and `perl-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "[-" "-]" t 'perl-mode t)) - -(defun mumamo-chunk-embperl-<+ (pos min max) - "Find [+ ... +], return range and `perl-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "[+" "+]" t 'perl-mode nil)) - -(defun mumamo-chunk-embperl-... and <% ... %>. - -(defun mumamo-chunk-ssjs-% (pos min max) - "Find <% ... %>. Return range and 'javascript-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "<%" "%>" t 'javascript-mode t)) - -(defconst mumamo-ssjs-tag-start-regex - (rx ""))) - "runat" - (0+ space) - "=" - (0+ space) - ?\" - ;;(or "text" "application") - ;;"/" - ;;(or "javascript" "ecmascript") - (or "server" "both" "server-proxy") - ?\" - (0+ (not (any ">"))) - ">" - ;; FIX-ME: Commented out because of bug in Emacs - ;; - ;;(optional (0+ space) ".... Return range and 'javascript-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-inlined-ssjs - ;; 'mumamo-search-bw-exc-end-inlined-script - ;; 'mumamo-search-fw-exc-start-inlined-ssjs-old - ;; 'mumamo-search-fw-exc-end-inlined-script) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-inlined-ssjs - 'mumamo-search-fw-exc-end-inlined-script)) - -;;;###autoload -(define-mumamo-multi-major-mode ssjs-html-mumamo-mode - "Turn on multiple major modes for SSJS with main mode `html-mode'. -This covers inlined style and javascript." - ("HTML Family" html-mode - (mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-inlined-ssjs - mumamo-chunk-ssjs-% - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) -(add-hook 'html-mumamo-mode-hook 'mumamo-define-html-file-wide-keys) -(mumamo-inherit-sub-chunk-family 'ssjs-html-mumamo-mode) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; gsp - -(defun mumamo-chunk-gsp (pos min max) - "Find <% ... %>. Return range and 'groovy-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "<%" "%>" t 'groovy-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode gsp-html-mumamo-mode - "Turn on multiple major modes for GSP with main mode `html-mode'. -This also covers inlined style and javascript." - ("GSP HTML Family" html-mode - (mumamo-chunk-gsp - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; jsp - Java Server Pages - -(defun mumamo-chunk-jsp (pos min max) - "Find <% ... %>. Return range and 'java-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "<%" "%>" t 'java-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode jsp-html-mumamo-mode - "Turn on multiple major modes for JSP with main mode `html-mode'. -This also covers inlined style and javascript." - ("JSP HTML Family" html-mode - (mumamo-chunk-jsp - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; eruby - -;; Fix-me: Maybe take care of <%= and <%- and -%>, but first ask the -;; ruby people if this is worth doing. -;; -;; See also http://wiki.rubyonrails.org/rails/pages/UnderstandingViews -(defun mumamo-chunk-eruby (pos min max) - "Find <% ... %>. Return range and 'ruby-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (let ((chunk (mumamo-quick-static-chunk pos min max "<%" "%>" t 'ruby-mode t))) - (when chunk - ;; Put indentation type on 'mumamo-next-indent on the chunk: - ;; Fix-me: use this! - (setcdr (last chunk) '(mumamo-template-indentor)) - chunk))) - -(defun mumamo-chunk-eruby-quoted (pos min max) - "Find \"<%= ... %>\". Return range and 'ruby-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX. - -This is a workaround for problems with strings." - (let ((chunk (mumamo-quick-static-chunk pos min max "\"<%=" "%>\"" t 'ruby-mode t))) - (when chunk - ;; Put indentation type on 'mumamo-next-indent on the chunk: - ;; Fix-me: use this! - (setcdr (last chunk) '(mumamo-template-indentor)) - chunk))) - -(defun mumamo-chunk-eruby-comment (pos min max) - "Find <%# ... %>. Return range and 'ruby-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX. - -This is needed since otherwise the end marker is thought to be -part of a comment." - (mumamo-quick-static-chunk pos min max "<%#" "%>" t 'mumamo-comment-mode t)) - -;; (defun mumamo-search-bw-exc-start-ruby (pos min) -;; "Helper for `mumamo-chunk-ruby'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min "<%"))) -;; (when (and exc-start -;; (<= exc-start pos)) -;; (cons exc-start 'ruby-mode)))) - -;;;###autoload -(define-mumamo-multi-major-mode eruby-mumamo-mode - "Turn on multiple major mode for eRuby with unspecified main mode. -Current major-mode will be used as the main major mode." - ("eRuby Family" nil - (mumamo-chunk-eruby-comment - mumamo-chunk-eruby - ))) - -;;;###autoload -(define-mumamo-multi-major-mode eruby-html-mumamo-mode - "Turn on multiple major modes for eRuby with main mode `html-mode'. -This also covers inlined style and javascript." - ("eRuby Html Family" html-mode - ( - mumamo-chunk-eruby-comment - mumamo-chunk-eruby - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) - -;;;###autoload -(define-mumamo-multi-major-mode eruby-javascript-mumamo-mode - "Turn on multiple major modes for eRuby with main mode `javascript-mode'." - ("eRuby Html Family" javascript-mode - ( - mumamo-chunk-eruby-comment - mumamo-chunk-eruby-quoted - mumamo-chunk-eruby - ;;mumamo-chunk-inlined-style - ;;mumamo-chunk-inlined-script - ;;mumamo-chunk-style= - ;;mumamo-chunk-onjs= - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; heredoc - -(defcustom mumamo-heredoc-modes - '( - ("HTML" html-mode) - ("CSS" css-mode) - ("JAVASCRIPT" javascript-mode) - ("JAVA" java-mode) - ("GROOVY" groovy-mode) - ("SQL" sql-mode) - ) - "Matches for heredoc modes. -The entries in this list have the form - - (REGEXP MAJOR-MODE-SPEC) - -where REGEXP is a regular expression that should match the -heredoc marker line and MAJOR-MODE-SPEC is the major mode spec to -use in the heredoc part. - -The major mode spec is translated to a major mode using -`mumamo-major-mode-from-modespec'." - :type '(repeat - (list - regexp - (function :tag "Major mode"))) - :group 'mumamo-modes) - -(defun mumamo-mode-for-heredoc (marker) - "Return major mode associated with MARKER. -Use first match in `mumamo-heredoc-modes'. -If no match use `text-mode'." - (let ((mode (catch 'mode - (save-match-data - (dolist (rec mumamo-heredoc-modes) - (let ((regexp (nth 0 rec)) - (mode (nth 1 rec))) - (when (string-match regexp marker) - (throw 'mode mode)))))))) - (if mode - (mumamo-major-mode-from-modespec mode) - 'text-mode))) - -(defun mumamo-chunk-heredoc (pos min max lang) - "This should work similar to `mumamo-find-possible-chunk'. -POS, MIN and MAX have the same meaning as there. - -LANG is the programming language. -Supported values are 'perl." - ;; Fix-me: LANG - ;; Fix-me: use mumamo-end-in-code - (mumamo-condition-case err - (let ((old-point (point))) - (goto-char pos) - (beginning-of-line) - (let (next-<< - (want-<< t) - heredoc-mark - end-mark-len - heredoc-line - delimiter - skipped - (skip-b "") - start-inner - end - exc-mode - fw-exc-fun - border-fun - allow-code-after - start-outer - ps - ) - (goto-char pos) - (beginning-of-line) - (case lang - ('sh - (setq allow-code-after t) - (while want-<< - (setq next-<< (search-forward "<<" max t)) - (if (not next-<<) - (setq want-<< nil) ;; give up - ;; Check inside string or comment. - (setq ps (parse-partial-sexp (line-beginning-position) (point))) - (unless (or (nth 3 ps) (nth 4 ps)) - (setq want-<< nil)))) - (when next-<< - (setq start-outer (- (point) 2)) - (when (= (char-after) ?-) - (setq skip-b "\t*") - (unless (eolp) (forward-char))) - ;; fix-me: space - (setq skipped (skip-chars-forward " \t")) - (when (memq (char-after) '(?\" ?\')) - (setq delimiter (list (char-after)))) - (if (and (> skipped 0) (not delimiter)) - (setq heredoc-mark "") - (when (looking-at (rx-to-string - `(and (regexp ,(if delimiter - (concat delimiter "\\([^\n<>;]+\\)" delimiter) - "\\([^ \t\n<>;]+\\)")) - (or blank line-end)))) - (setq heredoc-mark (buffer-substring-no-properties - (match-beginning 1) - (match-end 1))))) - (when heredoc-mark - (setq heredoc-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - (setq start-inner (1+ (point-at-eol))) - (setq end-mark-len (length heredoc-mark)) - ))) - ('w32-ps (error "No support for windows power shell yet")) - ('php - (while want-<< - (setq next-<< (search-forward "<<<" max t)) - ;; Check inside string or comment. - (if (not next-<<) - (setq want-<< nil) ;; give up - (setq ps (parse-partial-sexp (line-beginning-position) (- (point) 0))) - (unless (or (nth 3 ps) (nth 4 ps)) - (setq want-<< nil)))) - (when next-<< - (setq start-outer (- (point) 3)) - (skip-chars-forward " \t") - (when (looking-at (concat "\\([^\n;]*\\)[[:blank:]]*\n")) - (setq heredoc-mark (buffer-substring-no-properties - (match-beginning 1) - (match-end 1))) - (setq heredoc-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - ;; fix-me: nowdoc - (when (and (= ?\' (string-to-char heredoc-mark)) - (= ?\' (string-to-char (substring heredoc-mark (1- (length heredoc-mark)))))) - (setq heredoc-mark (substring heredoc-mark 1 (- (length heredoc-mark) 1)))) - (setq end-mark-len (1+ (length heredoc-mark))) - (setq start-inner (match-end 0))))) - ('perl - (setq allow-code-after t) - (while want-<< - (setq next-<< (search-forward "<<" max t)) - (if (not next-<<) - (setq want-<< nil) ;; give up - ;; Check inside string or comment. - (setq ps (parse-partial-sexp (line-beginning-position) (point))) - (unless (or (nth 3 ps) (nth 4 ps)) - (setq want-<< nil)))) - (when next-<< - (setq start-outer (- (point) 2)) - ;; fix-me: space - (setq skipped (skip-chars-forward " \t")) - (when (memq (char-after) '(?\" ?\')) - (setq delimiter (list (char-after)))) - (if (and (> skipped 0) (not delimiter)) - (setq heredoc-mark "") ;; blank line - (when (looking-at (rx-to-string - `(and (regexp ,(if delimiter - (concat delimiter "\\([^\n;]*\\)" delimiter) - "\\([^ \t\n<>;]+\\)")) - (or blank ";")))) - (setq heredoc-mark (buffer-substring-no-properties - (match-beginning 1) - (match-end 1))))) - (when heredoc-mark - (setq heredoc-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - ;;(setq start-inner (1+ (match-end 0))) - (setq start-inner (1+ (point-at-eol))) - (setq end-mark-len (length heredoc-mark)) - ))) - ('python - (unless (eobp) (forward-char)) - (while want-<< - (setq next-<< (re-search-forward "\"\"\"\\|'''" max t)) - (setq start-outer (- (point) 3)) - (if (not next-<<) - (setq want-<< nil) ;; give up - ;; Check inside string or comment. - (setq ps (parse-partial-sexp (line-beginning-position) (- (point) 3))) - (unless (or (nth 3 ps) (nth 4 ps)) - (setq want-<< nil))))) - ('ruby - (while want-<< - (setq next-<< (search-forward "<<" max t)) - (if (not next-<<) - (setq want-<< nil) ;; give up - ;; Check inside string or comment. - (setq ps (parse-partial-sexp (line-beginning-position) (point))) - (unless (or (nth 3 ps) (nth 4 ps)) - (setq want-<< nil)))) - (when next-<< - (setq start-outer (- (point) 2)) - (when (= (char-after) ?-) - (setq skip-b "[ \t]*") - (forward-char)) - (when (looking-at (concat "[^\n[:blank:]]*")) - (setq heredoc-mark (buffer-substring-no-properties - (match-beginning 0) - (match-end 0))) - (setq end-mark-len (length heredoc-mark)) - (setq heredoc-line (buffer-substring-no-properties (point-at-bol) (point-at-eol))) - (setq start-inner (match-end 0))))) - (t (error "next-<< not implemented for lang %s" lang))) - (when start-inner (assert (<= pos start-inner) t)) - (goto-char old-point) - (when (or start-inner end) - (let ((endmark-regexp - (case lang - ('sh (concat "^" skip-b heredoc-mark "$")) - ('php (concat "^" heredoc-mark ";?$")) - ('perl (concat "^" heredoc-mark "$")) - ('python (concat "^" heredoc-mark "[[:space:]]*")) - ('ruby (concat "^" skip-b heredoc-mark "$")) - (t (error "mark-regexp not implemented for %s" lang))))) - ;; Fix-me: rename start-inner <=> start-outer... - (setq border-fun `(lambda (start end exc-mode) - ;; Fix-me: use lengths... - (list - (if ,allow-code-after nil (+ start (- ,start-inner ,start-outer 1))) - (when end (- end ,end-mark-len))))) - (setq fw-exc-fun `(lambda (pos max) - (save-match-data - (let ((here (point))) - (goto-char pos) - (prog1 - (when (re-search-forward ,endmark-regexp max t) - (- (point) 1 ,(length heredoc-mark)) - (- (point) 0) - ) - (goto-char here))))))) - (setq exc-mode (mumamo-mode-for-heredoc heredoc-line)) - (list start-inner end exc-mode nil nil fw-exc-fun nil) - ;; Fix me: Add overriding for inner chunks (see - ;; http://www.emacswiki.org/emacs/NxhtmlMode#toc13). Maybe - ;; make fw-exc-fun a list (or a cons, since overriding is - ;; probably all that I want to add)? And make the - ;; corresponding chunk property a list too? - ;;(list start-outer end exc-mode (list start-inner end) nil fw-exc-fun border-fun 'heredoc) - (list (if allow-code-after start-inner start-outer) - end exc-mode (list start-inner end) nil fw-exc-fun border-fun 'heredoc) - ))) - (error (mumamo-display-error 'mumamo-chunk-heredoc - "%s" (error-message-string err))))) - - -;;;; Unix style sh heredoc - -(defun mumamo-chunk-sh-heredoc (pos min max) - "Find sh here docs. -See `mumamo-find-possible-chunk' for POS, MIN -and MAX." - (let ((r (mumamo-chunk-heredoc pos min max 'sh))) - r)) - -;;;###autoload -(define-mumamo-multi-major-mode sh-heredoc-mumamo-mode - "Turn on multiple major modes for sh heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("SH HereDoc" sh-mode - (mumamo-chunk-sh-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'sh-heredoc-mumamo-mode) - - -;;;; PHP heredoc - -(defun mumamo-chunk-php-heredoc (pos min max) - "Find PHP here docs. -See `mumamo-find-possible-chunk' for POS, MIN -and MAX." - (let ((r (mumamo-chunk-heredoc pos min max 'php))) - r)) - -;;;###autoload -(define-mumamo-multi-major-mode php-heredoc-mumamo-mode - "Turn on multiple major modes for PHP heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("PHP HereDoc" php-mode - (mumamo-chunk-php-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'php-heredoc-mumamo-mode) -(mumamo-inherit-sub-chunk-family-locally 'php-heredoc-mumamo-mode 'html-mumamo-mode) - - -;;;; Perl heredoc - -(defun mumamo-chunk-perl-heredoc (pos min max) - "Find perl here docs. -See `mumamo-find-possible-chunk' for POS, MIN -and MAX." - (let ((r (mumamo-chunk-heredoc pos min max 'perl))) - r)) - -;;;###autoload -(define-mumamo-multi-major-mode perl-heredoc-mumamo-mode - "Turn on multiple major modes for Perl heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("Perl HereDoc" perl-mode - (mumamo-chunk-perl-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'perl-heredoc-mumamo-mode) - -;;;###autoload -(define-mumamo-multi-major-mode cperl-heredoc-mumamo-mode - "Turn on multiple major modes for Perl heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("Perl HereDoc" cperl-mode - (mumamo-chunk-perl-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'cperl-heredoc-mumamo-mode) - - -;;;; Python heredoc - -(defun mumamo-chunk-python-heredoc (pos min max) - "Find python here docs. -See `mumamo-find-possible-chunk' for POS, MIN -and MAX." - (let ((r (mumamo-chunk-heredoc pos min max 'python))) - r)) - -;;;###autoload -(define-mumamo-multi-major-mode python-heredoc-mumamo-mode - "Turn on multiple major modes for Perl heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("Python HereDoc" python-mode - (mumamo-chunk-python-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'python-heredoc-mumamo-mode) - - -;;;; Ruby heredoc - -(defun mumamo-chunk-ruby-heredoc (pos min max) - "Find Ruby here docs. -See `mumamo-find-possible-chunk' for POS, MIN -and MAX." - (let ((r (mumamo-chunk-heredoc pos min max 'ruby))) - r)) - -;;;###autoload -(define-mumamo-multi-major-mode ruby-heredoc-mumamo-mode - "Turn on multiple major modes for Ruby heredoc document. -See `mumamo-heredoc-modes' for how to specify heredoc major modes." - ("Ruby HereDoc" ruby-mode - (mumamo-chunk-ruby-heredoc - ))) -(mumamo-inherit-sub-chunk-family 'ruby-heredoc-mumamo-mode) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Tex meta - -;; (defun mumamo-search-bw-textext-start (pos min) -;; "Helper for `mumamo-chunk-textext'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min "textext(\"")) -;; (exc-mode 'plain-tex-mode)) -;; (when exc-start -;; (when (<= exc-start pos) -;; (cons exc-start exc-mode))))) - -(defconst mumamo-textext-end-regex - (rx "textext(" - (0+ - (0+ (not (any "\"()"))) - ?\" - (0+ (not (any "\""))) - ?\" - ) - (0+ (not (any "\"()"))) - ")")) - -(defun mumamo-textext-test-is-end (pos) - "Helper for `mumamo-chunk-textext'. -Return POS if POS is at the end of textext chunk." - (when pos - (let ((here (point)) - hit) - (goto-char (+ 2 pos)) - (when (looking-back mumamo-textext-end-regex) - (setq hit t)) - (goto-char here) - (when hit pos)))) - -;; (defun mumamo-search-bw-textext-end (pos min) -;; "Helper for `mumamo-chunk-textext'. -;; POS is where to start search and MIN is where to stop." -;; (let ((end (mumamo-chunk-end-bw-str pos min "\")")) -;; res) -;; (while (and end -;; (not (setq res (mumamo-textext-test-is-end end)))) -;; (setq end (mumamo-chunk-end-bw-str (1- end) min "\")"))) -;; res)) - -;; (defun mumamo-search-fw-textext-start-old (pos max) -;; "Helper for `mumamo-chunk-textext'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "textext(\"")) - -(defun mumamo-search-fw-textext-start (pos max) - "Helper for `mumamo-chunk-textext'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max "textext(\""))) - (when where - (list where 'plain-tex-mode)))) - -(defun mumamo-search-fw-textext-end (pos max) - "Helper for `mumamo-chunk-textext'. -POS is where to start search and MAX is where to stop." - (save-match-data - (let ((end (mumamo-chunk-end-fw-str pos max "\")"))) - (mumamo-textext-test-is-end end)))) - -(defun mumamo-chunk-textext (pos min max) - "Find textext or TEX chunks. Return range and 'plain-tex-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-textext-start - ;; 'mumamo-search-bw-textext-end - ;; 'mumamo-search-fw-textext-start-old - ;; 'mumamo-search-fw-textext-end) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-textext-start - 'mumamo-search-fw-textext-end)) - -;; (defun mumamo-search-bw-verbatimtex-start (pos min) -;; "Helper for `mumamo-chunk-verbatimtextext'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min "\nverbatimtex")) -;; (exc-mode 'plain-tex-mode)) -;; (when exc-start -;; (when (<= exc-start pos) -;; (cons exc-start exc-mode))))) - -;; (defun mumamo-search-bw-verbatimtex-end (pos min) -;; "Helper for `mumamo-chunk-verbatimtextext'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-str pos min "\netex")) - -;; (defun mumamo-search-fw-verbatimtex-start-old (pos max) -;; "Helper for `mumamo-chunk-verbatimtextext'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "\nverbatimtex")) - -(defun mumamo-search-fw-verbatimtex-start (pos max) - "Helper for `mumamo-chunk-verbatimtextext'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max "\nverbatimtex"))) - (when where - (list where 'plain-tex-mode)))) - -(defun mumamo-search-fw-verbatimtex-end (pos max) - "Helper for `mumamo-chunk-verbatimtextext'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-str pos max "\netex"))) - -(defun mumamo-chunk-verbatimtex (pos min max) - "Find verbatimtex - etex chunks. Return range and 'plain-tex-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-verbatimtex-start - ;; 'mumamo-search-bw-verbatimtex-end - ;; 'mumamo-search-fw-verbatimtex-start-old - ;; 'mumamo-search-fw-verbatimtex-end) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-verbatimtex-start - 'mumamo-search-fw-verbatimtex-end)) - -;; (defun mumamo-search-bw-btex-start (pos min) -;; "Helper for `mumamo-chunk-btex'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min "\nverbatimtex")) -;; (exc-mode 'plain-tex-mode)) -;; (when exc-start -;; (when (<= exc-start pos) -;; (cons exc-start exc-mode))))) - -;; (defun mumamo-search-bw-btex-end (pos min) -;; "Helper for `mumamo-chunk-btex'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-str pos min "\netex")) - -;; (defun mumamo-search-fw-btex-start-old (pos max) -;; "Helper for `mumamo-chunk-btex'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "\nverbatimtex")) - -(defun mumamo-search-fw-btex-start (pos max) - "Helper for `mumamo-chunk-btex'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max "\nverbatimtex"))) - (when where - (list where 'plain-tex-mode)))) - -(defun mumamo-search-fw-btex-end (pos max) - "Helper for `mumamo-chunk-btex'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-str pos max "\netex"))) - -(defun mumamo-chunk-btex (pos min max) - "Find btex - etex chunks. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-btex-start - ;; 'mumamo-search-bw-btex-end - ;; 'mumamo-search-fw-btex-start-old - ;; 'mumamo-search-fw-btex-end) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-btex-start - 'mumamo-search-fw-btex-end)) - -;;;###autoload -(define-mumamo-multi-major-mode metapost-mumamo-mode - "Turn on multiple major modes for MetaPost." - ("MetaPost TeX Family" metapost-mode - (mumamo-chunk-textext - mumamo-chunk-verbatimtex - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; OpenLaszlo - -(defconst mumamo-lzx-method-tag-start-regex - (rx "")))) - ">" - ;; FIX-ME: Commented out because of bug in Emacs - ;; - ;;(optional (0+ space) "")) - -;; (defun mumamo-search-fw-exc-start-inlined-lzx-method-old (pos max) -;; "Helper for `mumamo-chunk-inlined-lzx-method'. -;; POS is where to start search and MAX is where to stop." -;; (goto-char (1+ pos)) -;; (skip-chars-backward "^<") -;; ;; Handle "))) - -(defun mumamo-chunk-inlined-lzx-method (pos min max) - "Find .... Return range and 'javascript-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-inlined-lzx-method - ;; 'mumamo-search-bw-exc-end-inlined-lzx-method - ;; 'mumamo-search-fw-exc-start-inlined-lzx-method-old - ;; 'mumamo-search-fw-exc-end-inlined-lzx-method) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-inlined-lzx-method - 'mumamo-search-fw-exc-end-inlined-lzx-method)) - -(defconst mumamo-lzx-handler-tag-start-regex - (rx "")))) - ">" - ;; FIX-ME: Commented out because of bug in Emacs - ;; - ;;(optional (0+ space) "")) - -;; (defun mumamo-search-fw-exc-start-inlined-lzx-handler-old (pos max) -;; "Helper for `mumamo-chunk-inlined-lzx-handler'. -;; POS is where to start search and MAX is where to stop." -;; (goto-char (1+ pos)) -;; (skip-chars-backward "^<") -;; ;; Handle "))) - -(defun mumamo-chunk-inlined-lzx-handler (pos min max) - "Find .... Return range and 'javascript-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-inlined-lzx-handler - ;; 'mumamo-search-bw-exc-end-inlined-lzx-handler - ;; 'mumamo-search-fw-exc-start-inlined-lzx-handler-old - ;; 'mumamo-search-fw-exc-end-inlined-lzx-handler) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-inlined-lzx-handler - 'mumamo-search-fw-exc-end-inlined-lzx-handler)) - - -;;;###autoload -(define-mumamo-multi-major-mode laszlo-nxml-mumamo-mode - "Turn on multiple major modes for OpenLaszlo." - ("OpenLaszlo Family" nxml-mode - (mumamo-chunk-inlined-script - mumamo-chunk-inlined-lzx-method - mumamo-chunk-inlined-lzx-handler - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; csound - -;; (defun mumamo-search-bw-exc-start-csound-orc (pos min) -;; "Helper for `mumamo-chunk-csound-orc'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min ""))) -;; (and exc-start -;; (<= exc-start pos) -;; (cons exc-start 'csound-orc-mode)))) - -;; (defun mumamo-search-bw-exc-end-csound-orc (pos min) -;; "Helper for `mumamo-chunk-csound-orc'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-str pos min "")) - -;; (defun mumamo-search-fw-exc-start-csound-orc-old (pos max) -;; "Helper for `mumamo-chunk-csound-orc'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "")) - -(defun mumamo-search-fw-exc-start-csound-orc (pos max) - "Helper for `mumamo-chunk-csound-orc'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max ""))) - (when where - (list where 'csound-orc-mode)))) - -(defun mumamo-search-fw-exc-end-csound-orc (pos max) - "Helper for `mumamo-chunk-csound-orc'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-str pos max ""))) - -(defun mumamo-chunk-csound-orc (pos min max) - "Find .... Return range and 'csound-orc-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-csound-orc - ;; 'mumamo-search-bw-exc-end-csound-orc - ;; 'mumamo-search-fw-exc-start-csound-orc-old - ;; 'mumamo-search-fw-exc-end-csound-orc) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-csound-orc - 'mumamo-search-fw-exc-end-csound-orc)) - -;; (defun mumamo-search-bw-exc-start-csound-sco (pos min) -;; "Helper for `mumamo-chunk-csound-sco'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-str pos min ""))) -;; (and exc-start -;; (<= exc-start pos) -;; (cons exc-start 'csound-sco-mode)))) - -;; (defun mumamo-search-bw-exc-end-csound-sco (pos min) -;; "Helper for `mumamo-chunk-csound-sco'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-str pos min "")) - -;; (defun mumamo-search-fw-exc-start-csound-sco-old (pos max) -;; "Helper for `mumamo-chunk-csound-sco'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "")) - -(defun mumamo-search-fw-exc-start-csound-sco (pos max) - "Helper for `mumamo-chunk-csound-sco'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max ""))) - (when where - (list where 'csound-sco-mode)))) - -(defun mumamo-search-fw-exc-end-csound-sco (pos max) - "Helper for `mumamo-chunk-csound-sco'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-str pos max ""))) - -(defun mumamo-chunk-csound-sco (pos min max) - "Found .... Return range and 'csound-sco-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-csound-sco - ;; 'mumamo-search-bw-exc-end-csound-sco - ;; 'mumamo-search-fw-exc-start-csound-sco-old - ;; 'mumamo-search-fw-exc-end-csound-sco) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-csound-sco - 'mumamo-search-fw-exc-end-csound-sco)) - -;;;###autoload -(define-mumamo-multi-major-mode csound-sgml-mumamo-mode - "Turn on mutiple major modes for CSound orc/sco Modes." - ("CSound orc/sco Modes" sgml-mode - (mumamo-chunk-csound-sco - mumamo-chunk-csound-orc - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; noweb - -;;;###autoload -(defgroup mumamo-noweb2 nil - "Customization group for `noweb2-mumamo-mode'." - :group 'mumamo-modes) - -(defcustom mumamo-noweb2-mode-from-ext - '( - ("php" . php-mode) - ("c" . c-mode) - ) - "File extension regexp to major mode mapping. -Used by `noweb2-mumamo-mode'." - :type '(repeat - (cons regexp major-mode-function)) - :group 'mumamo-noweb2) - -(defvar mumamo-noweb2-found-mode-from-ext nil - "Major modes determined from file names. Internal use.") - -(defun mumamo-noweb2-chunk-start-fw (pos max) - "Helper for `mumamo-noweb2-chunk'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-re pos max "^<<\\(.*?\\)>>=")) - (exc-mode 'text-mode)) - (when where - (let* ((file-name (match-string-no-properties 1)) - (file-ext (when file-name (file-name-extension file-name)))) - (when file-ext - (setq exc-mode (catch 'major - (dolist (rec mumamo-noweb2-mode-from-ext) - (when (string-match (car rec) file-ext) - (throw 'major (cdr rec)))) - nil)))) - (list where exc-mode)))) - -;; (defun mumamo-noweb2-chunk-start-bw (pos min) -;; "Helper for `mumamo-noweb2-chunk'. -;; POS is where to start search and MIN is where to stop." -;; (let ((exc-start (mumamo-chunk-start-bw-re pos min "^<<\\(.*?\\)>>=")) -;; (exc-mode 'text-mode)) -;; (when exc-start -;; (let* ((file-name (match-string 1)) -;; (file-ext (when file-name (file-name-extension file-name)))) -;; (when file-ext -;; (setq exc-mode (catch 'major -;; (dolist (rec mumamo-noweb2-mode-from-ext) -;; (when (string-match (car rec) file-ext) -;; (throw 'major (cdr rec)))) -;; nil)) -;; (unless exc-mode -;; (setq exc-mode -;; (cdr (assoc file-ext mumamo-noweb2-found-mode-from-ext))) -;; (unless exc-mode -;; ;; Get the major mode from file name -;; (with-temp-buffer -;; (setq buffer-file-name file-name) -;; (condition-case err -;; (normal-mode) -;; (error (message "error (normal-mode): %s" -;; (error-message-string err)))) -;; (setq exc-mode (or major-mode -;; 'text-mode)) -;; (add-to-list 'mumamo-noweb2-found-mode-from-ext -;; (cons file-ext exc-mode))) -;; )))) -;; (cons exc-start exc-mode)))) - -(defun mumamo-noweb2-chunk-end-fw (pos max) - "Helper for `mumamo-noweb2-chunk'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-re pos max "^@"))) - -;; (defun mumamo-noweb2-chunk-end-bw (pos min) -;; "Helper for `mumamo-noweb2-chunk'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-re pos min "^@")) - -(defun mumamo-noweb2-code-chunk (pos min max) - "Find noweb chunks. Return range and found mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (save-match-data - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-noweb2-chunk-start-bw - ;; 'mumamo-noweb2-chunk-end-bw - ;; 'mumamo-noweb2-chunk-start-fw-old - ;; 'mumamo-noweb2-chunk-end-fw) - (mumamo-possible-chunk-forward pos max - 'mumamo-noweb2-chunk-start-fw - 'mumamo-noweb2-chunk-end-fw))) - - -;;;###autoload -(define-mumamo-multi-major-mode noweb2-mumamo-mode - "Multi major mode for noweb files." - ("noweb Family" latex-mode - (mumamo-noweb2-code-chunk))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Template-Toolkit - - - -;; (setq auto-mode-alist -;; (append '(("\\.tt2?$" . tt-mode)) auto-mode-alist )) - -;;(require 'tt-mode) -(defun mumamo-chunk-tt (pos min max) - "Find [% ... %], return range and `tt-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX. - -This is for Template Toolkit. -See URL `http://dave.org.uk/emacs/' for `tt-mode'." - (mumamo-quick-static-chunk pos min max "[%" "%]" t 'tt-mode nil)) - -(define-mumamo-multi-major-mode tt-html-mumamo-mode - "Turn on multiple major modes for TT files with main mode `nxhtml-mode'. -TT = Template-Toolkit. - -This also covers inlined style and javascript." - ("TT HTML Family" html-mode - (mumamo-chunk-tt - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Asp - -;;;; asp <%@language="javscript"%> - -(defvar mumamo-asp-default-major 'asp-js-mode) -(make-variable-buffer-local 'mumamo-asp-default-major) -(put 'mumamo-asp-default-major 'permanent-local t) - -(defconst mumamo-asp-lang-marker - (rx "<%@" - (0+ space) - "language" - (0+ space) - "=" - (0+ space) - "\"" - (submatch (1+ (not (any "\"")))) - "\"" - (0+ space))) - -(defun mumamo-search-fw-exc-start-jsp (pos min max) - ;; fix-me - ) -(defun mumamo-chunk-asp (pos min max) - "Find <% ... %>. Return range and 'asp-js-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; Fix-me: this is broken! - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-exc-start-asp - ;; 'mumamo-search-bw-exc-end-jsp - ;; 'mumamo-search-fw-exc-start-jsp-old - ;; 'mumamo-search-fw-exc-end-jsp) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-exc-start-asp - 'mumamo-search-fw-exc-end-jsp)) - - -;;;; asp <% ...> - -(defun mumamo-chunk-asp% (pos min max) - "Find <% ... %>. Return range and 'asp-js-mode or 'asp-vb-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (let* ((chunk (mumamo-quick-static-chunk pos min max "<%" "%>" t 'java-mode t)) - (beg (nth 0 chunk)) - (here (point)) - glang) - (when chunk - (goto-char beg) - (if (looking-at mumamo-asp-lang-marker) - (progn - (setq glang (downcase (match-string 1))) - (cond - ((string= glang "javascript") - (setq mumamo-asp-default-major 'asp-js-mode)) - ((string= glang "vbscript") - (setq mumamo-asp-default-major 'asp-vb-mode)) - ) - (setcar (nthcdr 2 chunk) 'mumamo-comment-mode)) - (setcar (nthcdr 2 chunk) mumamo-asp-default-major)) - chunk))) - -;;;; asp . Return 'asp-js-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-asp-search-bw-exc-start-inlined-script - ;; 'mumamo-search-bw-exc-end-inlined-script - ;; 'mumamo-asp-search-fw-exc-start-inlined-script-old - ;; 'mumamo-search-fw-exc-end-inlined-script) - (mumamo-possible-chunk-forward pos max - 'mumamo-asp-search-fw-exc-start-inlined-script - 'mumamo-search-fw-exc-end-inlined-script)) - -;;;###autoload -(define-mumamo-multi-major-mode asp-html-mumamo-mode - "Turn on multiple major modes for ASP with main mode `html-mode'. -This also covers inlined style and javascript." - ("ASP Html Family" html-mode - (mumamo-chunk-asp% - mumamo-asp-chunk-inlined-script - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Org-mode - -(defcustom mumamo-org-submodes - '( - (emacs-lisp emacs-lisp-mode) - (ruby ruby-mode) - (python python-mode) - (sh sh-mode) - (R R-mode) - (ditaa picture-mode) - ) - "Alist for conversion of org #+BEGIN_SRC specifier to major mode. -Works kind of like `mumamo-major-modes'. - -This may be used for example for org-babel \(see URL -`http://orgmode.org/worg/org-contrib/babel/')." - :type '(alist - :key-type (symbol :tag "Symbol in #BEGIN_SRC specifier") - :value-type (repeat (choice - (command :tag "Major mode") - (symbol :tag "Major mode (not yet loaded)"))) - ) - :group 'mumamo-modes) - -(defun mumamo-org-mode-from-spec (major-spec) - "Translate MAJOR-SPEC to a major mode. -Translate MAJOR-SPEC used in #BEGIN_SRC to a major mode. - -See `mumamo-org-submodes' for an explanation." - (mumamo-major-mode-from-spec major-spec mumamo-org-submodes)) - -(defun mumamo-chunk-org-html (pos min max) - "Find #+BEGIN_HTML ... #+END_HTML, return range and `html-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "#+BEGIN_HTML" "#+END_HTML" nil 'html-mode nil)) - -;; (defun mumamo-search-bw-org-src-start (pos min) -;; "Helper for `mumamo-chunk-org-src'. -;; POS is where to start search and MIN is where to stop." -;; (let* ((exc-start (mumamo-chunk-start-bw-str pos min "#+BEGIN_SRC")) -;; (exc-mode (when exc-start -;; (let ((here (point))) -;; (goto-char exc-start) -;; (prog1 -;; (read (current-buffer)) -;; (goto-char here)))))) -;; (setq exc-mode (mumamo-org-mode-from-spec exc-mode)) -;; ;;(setq exc-mode (eval exc-mode)) -;; ;;(setq exc-mode 'text-mode) -;; ;;(when exc-mode (setq exc-mode (quote exc-mode))) -;; ;;(assert (eq exc-mode 'emacs-lisp-mode) t) -;; (when exc-start -;; (when (<= exc-start pos) -;; (cons exc-start exc-mode))))) - -;; (defun mumamo-search-bw-org-src-end (pos min) -;; "Helper for `mumamo-chunk-org-src'. -;; POS is where to start search and MIN is where to stop." -;; (mumamo-chunk-end-bw-str pos min "#+END_SRC")) - -;; (defun mumamo-search-fw-org-src-start-old (pos max) -;; "Helper for `mumamo-chunk-org-src'. -;; POS is where to start search and MAX is where to stop." -;; (mumamo-chunk-start-fw-str pos max "#+BEGIN_SRC")) - -(defun mumamo-search-fw-org-src-start (pos max) - "Helper for `mumamo-chunk-org-src'. -POS is where to start search and MAX is where to stop." - (let ((where (mumamo-chunk-start-fw-str pos max "#+BEGIN_SRC"))) - (when where - (let ((exc-mode (let ((here (point))) - (goto-char where) - (prog1 - (read (current-buffer)) - (goto-char here))))) - (setq exc-mode (mumamo-org-mode-from-spec exc-mode)) - (list where exc-mode))))) - -(defun mumamo-search-fw-org-src-end (pos max) - "Helper for `mumamo-chunk-org-src'. -POS is where to start search and MAX is where to stop." - (save-match-data - (mumamo-chunk-end-fw-str pos max "#+END_SRC"))) - -(defun mumamo-chunk-org-src (pos min max) - "Find #+BEGIN_SRC ... #+END_SRC, return range and choosen major mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX. - -See Info node `(org) Literal Examples' for how to specify major -mode." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-search-bw-org-src-start - ;; 'mumamo-search-bw-org-src-end - ;; 'mumamo-search-fw-org-src-start-old - ;; 'mumamo-search-fw-org-src-end) - (mumamo-possible-chunk-forward pos max - 'mumamo-search-fw-org-src-start - 'mumamo-search-fw-org-src-end)) - -;;;###autoload -(define-mumamo-multi-major-mode org-mumamo-mode - "Turn on multiple major modes for `org-mode' files with main mode `org-mode'. -** Note about HTML subchunks: -Unfortunately this only allows `html-mode' (not `nxhtml-mode') in -sub chunks." - ("Org Mode + Html" org-mode - (mumamo-chunk-org-html - mumamo-chunk-org-src - ))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Mako - -;; See http://www.makotemplates.org/docs/syntax.html - -;;; Comments mode -;; Fix-me: move to mumamo.el -(defconst mumamo-comment-font-lock-keywords - (list - (cons "\\(.*\\)" (list 1 font-lock-comment-face)) - )) -(defvar mumamo-comment-font-lock-defaults - '(mumamo-comment-font-lock-keywords t t)) - -(define-derived-mode mumamo-comment-mode nil "Comment chunk" - "For comment blocks." - (set (make-local-variable 'font-lock-defaults) mumamo-comment-font-lock-defaults)) - - - -(defun mumamo-chunk-mako-<% (pos min max) - "Find <% ... %> and <%! ... %>. Return range and `python-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;; (mumamo-find-possible-chunk pos min max - ;; 'mumamo-mako-<%-bw-start - ;; 'mumamo-mako-<%-bw-end - ;; 'mumamo-mako-<%-fw-start-old - ;; 'mumamo-mako-<%-fw-end - ;; 'mumamo-mako-<%-find-borders) - (let ((chunk (mumamo-possible-chunk-forward pos max - 'mumamo-mako-<%-fw-start - 'mumamo-mako-<%-fw-end - 'mumamo-mako-<%-find-borders - ))) - (when chunk - (setcdr (last chunk) '(mumamo-template-indentor)) - chunk))) - -(defun mumamo-mako-<%-find-borders (start end exc-mode) - (when exc-mode - (list - (when start - (+ start - (if (eq ?! (char-after (+ start 2))) - 3 - 2))) - (when end (- end 2)) - exc-mode))) - -;; (defun mumamo-mako-<%-bw-start (pos min) -;; (let ((here (point)) -;; start -;; ret -;; ) -;; (goto-char (+ pos 3)) -;; (setq start (re-search-backward "<%!?\\(?:[ \t]\\|$\\)" min t)) -;; (when (and start (<= start pos)) -;; (setq ret (list start 'python-mode))) -;; (goto-char here) -;; ret)) - -;; (defun mumamo-mako-<%-bw-end (pos min) -;; (mumamo-chunk-end-bw-str-inc pos min "%>")) ;; ok - -;; (defun mumamo-mako-<%-fw-start-old (pos max) -;; (let ((here (point)) -;; start -;; ret) -;; (goto-char pos) -;; (setq start -;; (re-search-forward "<%!?\\(?:[ \t]\\|$\\)" max t)) -;; (when start -;; (setq ret (match-beginning 0))) -;; (goto-char here) -;; ret)) - -(defun mumamo-mako-<%-fw-start (pos max) - (let ((here (point)) - start - ret) - (goto-char pos) - (setq start - (re-search-forward "<%!?\\(?:[ \t]\\|$\\)" max t)) - (when start - (setq ret (match-beginning 0))) - (goto-char here) - (when ret - (list ret 'python-mode)))) - -(defun mumamo-mako-<%-fw-end (pos max) - (save-match-data - (mumamo-chunk-end-fw-str-inc pos max "%>"))) ;; ok - - - -(defun mumamo-chunk-mako-% (pos min max) - "Find % python EOL. Return range and `python-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (let ((chunk (mumamo-whole-line-chunk pos min max "%" 'python-mode))) - (when chunk - (setcdr (last chunk) '(mumamo-template-indentor)) - chunk))) - -(defun mumamo-chunk-mako-one-line-comment (pos min max) - "Find ## comment EOL. Return range and `python-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-whole-line-chunk pos min max "##" 'mumamo-comment-mode)) - -;; Fix-me: Move this to mumamo.el -;; Fix-me: does not work with new chunk div -(defun mumamo-whole-line-chunk-fw-exc-end-fun (pos max) - (let ((here (point))) - (goto-char pos) - (prog1 - (line-end-position) - (goto-char here)))) - -(defun mumamo-whole-line-chunk (pos min max marker mode) - (let* ((here (point)) - (len-marker (length marker)) - (pattern (rx-to-string `(and bol (0+ blank) ,marker blank) t)) - (whole-line-chunk-borders-fun - `(lambda (start end dummy) - (let ((start-border (+ start ,len-marker))) - (list start-border nil)))) - beg - end - ret) - (goto-char pos) - (setq beg (re-search-forward pattern max t)) - (when beg - (setq beg (- beg len-marker 1)) - (setq end (line-end-position)) - (setq ret (list beg - end - mode - (let ((start-border (+ beg len-marker))) - (list start-border nil)) - nil - 'mumamo-whole-line-chunk-fw-exc-end-fun - whole-line-chunk-borders-fun - ))) - (goto-char here) - ret)) - -;; (defun mumamo-single-regexp-chunk (pos min max begin-mark end-mark mode) -;; "Not ready yet. `mumamo-quick-static-chunk'" -;; (let ((here (point)) -;; (len-marker (length marker)) -;; beg -;; end -;; ret) -;; (goto-char pos) -;; (setq beg (line-beginning-position)) -;; (setq end (line-end-position)) -;; (unless (or (when min (< beg min)) -;; (when max (> end max)) -;; (= pos end)) -;; (goto-char beg) -;; (skip-chars-forward " \t") -;; (when (and -;; (string= marker (buffer-substring-no-properties (point) (+ (point) len-marker))) -;; (memq (char-after (+ (point) len-marker)) -;; '(?\ ?\t ?\n)) -;; (>= pos (point))) -;; (setq ret -;; (list (point) -;; end -;; mode -;; (let ((start-border (+ (point) len-marker))) -;; (list start-border nil)))))) -;; (unless ret -;; (let ((range-regexp -;; (concat "^[ \t]*" -;; "\\(" -;; (regexp-quote marker) -;; "[ \t\n].*\\)$"))) -;; ;; Backward -;; (goto-char pos) -;; (unless (= pos (line-end-position)) -;; (goto-char (line-beginning-position))) -;; (setq beg (re-search-backward range-regexp min t)) -;; (when beg (setq beg (match-end 1))) -;; ;; Forward, take care of indentation part -;; (goto-char pos) -;; (unless (= pos (line-end-position)) -;; (goto-char (line-beginning-position))) -;; (setq end (re-search-forward range-regexp max t)) -;; (when end (setq end (match-beginning 1)))) -;; (setq ret (list beg end))) -;; (goto-char here) -;; ;;(setq ret nil) -;; ret)) - - -(defun mumamo-chunk-mako-<%doc (pos min max) - (mumamo-quick-static-chunk pos min max "<%doc>" "" t 'mumamo-comment-mode t)) - -(defun mumamo-chunk-mako-<%include (pos min max) - (mumamo-quick-static-chunk pos min max "<%include" "/>" t 'html-mode t)) - -(defun mumamo-chunk-mako-<%inherit (pos min max) - (mumamo-quick-static-chunk pos min max "<%inherit" "/>" t 'html-mode t)) - -(defun mumamo-chunk-mako-<%namespace (pos min max) - (mumamo-quick-static-chunk pos min max "<%namespace" "/>" t 'html-mode t)) - -(defun mumamo-chunk-mako-<%page (pos min max) - (mumamo-quick-static-chunk pos min max "<%page" "/>" t 'html-mode t)) - -;; Fix-me: this is not correct -(defun mumamo-chunk-mako-<%def (pos min max) - (mumamo-quick-static-chunk pos min max "<%def" "" t 'html-mode t)) - -(defun mumamo-chunk-mako$(pos min max) - "Find ${ ... }, return range and `python-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (mumamo-quick-static-chunk pos min max "${" "}" t 'python-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode mako-html-mumamo-mode - "Turn on multiple major modes for Mako with main mode `html-mode'. -This also covers inlined style and javascript." -;; Fix-me: test case -;; -;; Fix-me: Add chunks for the tags, but make sure these are made -;; invisible to nxml-mode parser. -;; -;; Fix-me: Maybe finally add that indentation support for one-line chunks? - ("Mako HTML Family" html-mode - ( - mumamo-chunk-mako-one-line-comment - mumamo-chunk-mako-<%doc - mumamo-chunk-mako-<%include - mumamo-chunk-mako-<%inherit - mumamo-chunk-mako-<%namespace - mumamo-chunk-mako-<%page - - mumamo-chunk-mako-<%def - ;;mumamo-chunk-mako-<%namesp:name - ;;mumamo-chunk-mako-<%call - ;;mumamo-chunk-mako-<%text - - mumamo-chunk-mako-<% - mumamo-chunk-mako-% - mumamo-chunk-mako$ - - mumamo-chunk-xml-pi - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - mumamo-chunk-style= - mumamo-chunk-onjs= - ))) -(mumamo-inherit-sub-chunk-family-locally 'mako-html-mumamo-mode 'mako-html-mumamo-mode) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; XSL - -;;;###autoload -(define-mumamo-multi-major-mode xsl-nxml-mumamo-mode - "Turn on multi major mode for XSL with main mode `nxml-mode'. -This covers inlined style and javascript." - ("XSL nXtml Family" nxml-mode - ( - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - ))) - -;;;###autoload -(define-mumamo-multi-major-mode xsl-sgml-mumamo-mode - "Turn on multi major mode for XSL with main mode `sgml-mode'. -This covers inlined style and javascript." - ("XSL SGML Family" sgml-mode - ( - mumamo-chunk-inlined-style - mumamo-chunk-inlined-script - ))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Markdown - -(defun mumamo-chunk-markdown-html-1 (pos min max) - (save-restriction - (goto-char pos) - (narrow-to-region (or min (point)) (or max (point-max))) - (save-match-data - (let ((here (point))) - (when (re-search-forward (rx (* space) - (submatch "<") - (* (any "a-z")) - (or ">" (any " \t\n"))) - nil t) - (let ((beg (match-beginning 1)) - (end)) - (goto-char beg) - (condition-case err - (progn - (while (not (sgml-skip-tag-forward 1))) - (setq end (point))) - (error (message "mumamo-chunk-markdown-html-1: %s" err))) - (goto-char here) - (when (and beg end) - (cons beg end)))))))) - -(defun mumamo-chunk-markdown-html-fw-exc-fun (pos max) - (let ((beg-end (mumamo-chunk-markdown-html-1 pos nil max))) - (cdr beg-end))) - -(defun mumamo-chunk-markdown-html (pos min max) - "Find a chunk of html code in `markdown-mode'. -Return range and `html-mode'. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - (let ((beg-end (mumamo-chunk-markdown-html-1 pos nil max))) - (when beg-end - (let ((beg (car beg-end)) - (end (cdr beg-end))) - (list beg end 'html-mode - nil ;; borders - nil ;; parseable y - 'mumamo-chunk-markdown-html-fw-exc-fun - nil ;; find-borders fun - ))))) - -;;;###autoload -(define-mumamo-multi-major-mode markdown-html-mumamo-mode - "Turn on multi major markdown mode in buffer. -Main major mode will be `markdown-mode'. -Inlined html will be in `html-mode'. - -You need `markdown-mode' which you can download from URL -`http://jblevins.org/projects/markdown-mode/'." - ("Markdown HTML Family" markdown-mode - ( - mumamo-chunk-markdown-html - ))) - - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Latex related - -(defun mumamo-latex-closure-chunk (pos min max) - (mumamo-quick-static-chunk pos min max "\\begin{clojure}" "\\end{clojure}" t 'clojure-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode latex-clojure-mumamo-mode - "Turn on multi major mode latex+clojure. -Main major mode will be `latex-mode'. -Subchunks will be in `clojure-mode'. - -You will need `clojure-mode' which you can download from URL -`http://github.com/jochu/clojure-mode/tree'." - ("Latex+clojur Family" latex-mode - ( - mumamo-latex-closure-chunk - ))) - -(add-to-list 'auto-mode-alist '("\\.lclj\\'" . latex-clojure-mumamo-mode)) - - -(defun mumamo-latex-haskell-chunk (pos min max) - (mumamo-quick-static-chunk pos min max "\\begin{code}" "\\end{code}" t 'haskell-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode latex-haskell-mumamo-mode - "Turn on multi major mode latex+haskell. -Main major mode will be `latex-mode'. -Subchunks will be in `haskell-mode'. - -You will need `haskell-mode' which you can download from URL -`http://projects.haskell.org/haskellmode-emacs/'." - ("Latex+haskell Family" latex-mode - ( - mumamo-latex-haskell-chunk - ))) - - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Python + ReST - -;; From Martin Soto - -(defun python-rst-long-string-chunk (pos min max) - "Find Python long strings. Return range and 'mumamo-comment-mode. -See `mumamo-find-possible-chunk' for POS, MIN and MAX." - ;;(mumamo-quick-static-chunk pos min max "\"\"\"((" "))\"\"\"" nil 'rst-mode nil)) - (mumamo-quick-static-chunk pos min max "\"\"\"" "\"\"\"" t 'rst-mode t)) - -;;;###autoload -(define-mumamo-multi-major-mode python-rst-mumamo-mode - "Turn on multiple major modes for Python with RestructuredText docstrings." - ("Python ReST Family" python-mode - ( - python-rst-long-string-chunk - ))) - - -(provide 'mumamo-fun) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; mumamo-fun.el ends here -- cgit v1.2.3-54-g00ecf