legacy-dotfiles/emacs.d/nxhtml/util/mumamo-fun.el
Tom Willemsen 94d2fc1815 Django, org
* Added nxhtml, mostly for django support.

  * Changed some org settings.
2011-03-07 09:04:49 +01:00

3333 lines
120 KiB
EmacsLisp

;;; 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 <?.
;; Actual use is in `mumamo-search-bw-exc-start-xml-pi'."
;; (let ((exc-start (mumamo-chunk-start-bw-str (+ pos 2) min lt-chars))
;; spec
;; exc-mode
;; hit)
;; (when exc-start
;; (goto-char exc-start)
;; (when (and (not (looking-at "xml"))
;; (looking-at (rx (0+ (any "a-z")))))
;; ;; (setq exc-start (match-end 0)) include it in sub chunk instead
;; (setq exc-start (- exc-start 2))
;; (setq spec (match-string-no-properties 0))
;; (setq exc-mode (assoc spec mumamo-xml-pi-mode-alist))
;; (when exc-mode (setq exc-mode (cdr exc-mode)))
;; (setq hit t)
;; )
;; (when hit
;; (unless exc-mode
;; ;;(setq exc-mode 'fundamental-mode)
;; ;; Fix-me: Better assume php-mode
;; (setq exc-mode 'php-mode))
;; (when (<= exc-start pos)
;; ;;(cons exc-start exc-mode)
;; (list exc-start exc-mode nil)
;; )))))
;; (defun mumamo-search-bw-exc-start-xml-pi (pos min)
;; "Helper for `mumamo-chunk-xml-pi'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-search-bw-exc-start-xml-pi-1 pos min "<?"))
(defun mumamo-search-fw-exc-start-xml-pi-new (pos max)
(let ((here (point))
start
spec
exc-mode
ret)
(setq start (search-forward "<?" max t))
(when (and start
(looking-at (rx (0+ (any "a-z")))))
(setq spec (match-string-no-properties 0))
(unless (string= spec "xml")
(when (= 0 (length spec))
(setq spec "php"))
(setq exc-mode (assoc spec mumamo-xml-pi-mode-alist))
(if exc-mode
(setq exc-mode (cdr exc-mode))
(setq exc-mode 'mumamo-bad-mode))
(setq ret (list (- start 2) exc-mode nil))))
(goto-char here)
ret))
(defun mumamo-xml-pi-end-is-xml-end (pos)
"Return t if the ?> at pos is end of <?xml."
(when (> 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 "<?"))
;; Add a find-borders-fun here so that for example src="<?php some
;; code ?>" can be handled.
;;
;; Fix-me: Maybe generalize for other values than <?php
(defun mumamo-find-borders-xml-pi (start end exc-mode)
(let (start-border
end-border
(inc t)
;;(begin-mark "<?php")
(begin-mark "<?")
(end-mark "?>")
(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))
;;;; <style ...>
(defconst mumamo-style-tag-start-regex
(rx "<style"
space
(0+ (not (any ">")))
"type"
(0+ space)
"="
(0+ space)
?\"
"text/css"
?\"
(0+ (not (any ">")))
">"
;; FIX-ME: Commented out because of bug in Emacs
;;
;;(optional (0+ space) "<![CDATA[")
))
;; (defun mumamo-search-bw-exc-start-inlined-style (pos min)
;; "Helper for `mumamo-chunk-inlined-style'.
;; POS is where to start search and MIN is where to stop."
;; (goto-char (+ pos 6))
;; (let ((marker-start (search-backward "<style" min t))
;; exc-mode
;; exc-start)
;; (when marker-start
;; (when (looking-at mumamo-style-tag-start-regex)
;; (setq exc-start (match-end 0))
;; (goto-char exc-start)
;; (when (<= exc-start pos)
;; ;;(cons (point) 'css-mode)
;; ;;(list (point) 'css-mode '(nxml-mode))
;; ;; Fix-me: Kubica looping problem
;; (list (point) 'css-mode)
;; )
;; ))))
;; (defun mumamo-search-bw-exc-end-inlined-style (pos min)
;; "Helper for `mumamo-chunk-inlined-style'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str pos min "</style>"))
;; (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 <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<style" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 6))
;; (when (looking-at mumamo-style-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-search-fw-exc-end-inlined-style (pos max)
"Helper for `mumamo-chunk-inlined-style'.
POS is where to start search and MAX is where to stop."
(save-match-data
(mumamo-chunk-end-fw-str pos max "</style>")))
;; (defun mumamo-chunk-inlined-style-old (pos min max)
;; "Find <style>...</style>. 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 <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<style" max t))
exc-mode)
(when exc-start
(goto-char (- exc-start 6))
(when (looking-at mumamo-style-tag-start-regex)
(goto-char (match-end 0))
(list (point) 'css-mode nil)
))))
(defun mumamo-chunk-inlined-style (pos min max)
"Find <style>...</style>. 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))
;;;; <script ...>
(defconst mumamo-script-tag-start-regex
(rx "<script"
space
(0+ (not (any ">")))
"type"
(0+ space)
"="
(0+ space)
?\"
;;(or "text" "application")
;;"/"
;;(or "javascript" "ecmascript")
"text/javascript"
?\"
(0+ (not (any ">")))
">"
;; FIX-ME: Commented out because of bug in Emacs
;;
;;(optional (0+ space) "<![CDATA[" )
))
;; (defun mumamo-search-bw-exc-start-inlined-script (pos min)
;; "Helper for `mumamo-chunk-inlined-script'.
;; POS is where to start search and MIN is where to stop."
;; (goto-char (+ pos 7))
;; (let ((marker-start (when (< min (point)) (search-backward "<script" min t)))
;; exc-mode
;; exc-start)
;; (when marker-start
;; (when (looking-at mumamo-script-tag-start-regex)
;; (setq exc-start (match-end 0))
;; (goto-char exc-start)
;; (when (<= exc-start pos)
;; ;;(cons (point) 'javascript-mode)
;; (list (point) 'javascript-mode '(nxml-mode))
;; )
;; ))))
;; (defun mumamo-search-bw-exc-end-inlined-script (pos min)
;; "Helper for `mumamo-chunk-inlined-script'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str pos min "</script>"))
;; (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 <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<script" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 7))
;; (when (looking-at mumamo-script-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-search-fw-exc-end-inlined-script (pos max)
"Helper for `mumamo-chunk-inlined-script'.
POS is where to start search and MAX is where to stop."
(save-match-data
(mumamo-chunk-end-fw-str pos max "</script>")))
;; (defun mumamo-chunk-inlined-script-old (pos min max)
;; "Find <script>...</script>. 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 <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<script" max t))
exc-mode)
(when exc-start
(goto-char (- exc-start 7))
(when (looking-at mumamo-script-tag-start-regex)
(goto-char (match-end 0))
(list (point) 'javascript-mode '(nxml-mode))
))))
(defun mumamo-chunk-inlined-script (pos min max)
"Find <script>...</script>. 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 '<?php' in buffer.
When turning on this mode <?php is replace with (?php in the buffer.
If you write the buffer to file (?php is however written as <?php.
When turning off this mode (?php is replace with <?php in the buffer.
The purpose of this minor mode is to work around problems with
using the `nxml-mode' parser in php files. `nxml-mode' knows
damned well that you can not have the character < in strings and
I can't make it forget that. For PHP programmers it is however
very convient to use <?php ... ?> 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 "<?php "
(if mumamo-alt-php-tags-mode
(progn
;;(unless mumamo-multi-major-mode (error "Only for mumamo multi major modes"))
(unless (let ((major-mode (mumamo-main-major-mode)))
(derived-mode-p 'nxml-mode))
;;(error "Mumamo multi major mode must be based on nxml-mode")
)
(unless (memq 'mumamo-chunk-alt-php (caddr mumamo-current-chunk-family))
(error "Mumamo multi major must have chunk function mumamo-chunk-alt-php"))
;; Be paranoid about the file/content write hooks
(when (<= emacs-major-version 22)
(with-no-warnings
(when local-write-file-hooks ;; obsolete, but check!
(error "Will not do this because local-write-file-hooks is non-nil"))))
(remove-hook 'write-contents-functions 'mumamo-alt-php-write-contents t)
(when write-contents-functions
(error "Will not do this because write-contents-functions is non-nil"))
(when (delq 'recentf-track-opened-file (copy-sequence write-file-functions))
(error "Will not do this because write-file-functions is non-nil"))
(add-hook 'write-contents-functions 'mumamo-alt-php-write-contents t t)
(put 'write-contents-functions 'permanent-local t)
(save-restriction
(let ((here (point)))
(widen)
(goto-char (point-min))
(while (search-forward "<?php" nil t)
(replace-match "(?php"))
(goto-char (point-min))
(while (search-forward "<?=" nil t)
(replace-match "(?="))
(goto-char (point-min))
(while (search-forward "?>" 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 "<?php"))
(goto-char (point-min))
(while (search-forward "(?=" nil t)
(replace-match "<?="))
(goto-char (point-min))
(while (search-forward "?)" 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 <?php.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(when mumamo-alt-php-tags-mode
(mumamo-quick-static-chunk pos min max "(?php" "?)" t 'php-mode t)))
(defun mumamo-chunk-alt-php= (pos min max)
"Find (?= ... ?), return range and `php-mode'.
Workaround for the problem that I can not tame `nxml-mode' to recognize <?php.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(when mumamo-alt-php-tags-mode
(mumamo-quick-static-chunk pos min max "(?=" "?)" t 'php-mode t)))
;;;###autoload
(define-mumamo-multi-major-mode html-mumamo-mode
"Turn on multiple major modes for (X)HTML with main mode `html-mode'.
This covers inlined style and javascript and PHP."
("HTML Family" html-mode
(mumamo-chunk-xml-pi
mumamo-chunk-alt-php
mumamo-chunk-alt-php=
mumamo-chunk-inlined-style
mumamo-chunk-inlined-script
mumamo-chunk-style=
mumamo-chunk-onjs=
)))
(add-hook 'html-mumamo-mode-hook 'mumamo-define-html-file-wide-keys)
(mumamo-inherit-sub-chunk-family 'html-mumamo-mode)
;; (define-mumamo-multi-major-mode xml-pi-only-mumamo-mode
;; "Test"
;; ("HTML Family" html-mode
;; (mumamo-chunk-xml-pi
;; )))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; XHTML w nxml-mode
(defun mumamo-alt-php-write-contents ()
"For `write-contents-functions' when `mumamo-chunk-alt-php' is used."
(let ((here (point)))
(save-match-data
(save-restriction
(widen)
(condition-case nil
(atomic-change-group
(progn
(goto-char (point-min))
(while (search-forward "(?php" nil t)
(replace-match "<?php"))
(goto-char (point-min))
(while (search-forward "(?=" nil t)
(replace-match "<?="))
(goto-char (point-min))
(while (search-forward "?)" nil t)
(replace-match "?>"))
(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>" "</%perl>" t 'perl-mode t))
(defun mumamo-chunk-mason-perl-init (pos min max)
(mumamo-quick-static-chunk pos min max "<%init>" "</%init>" t 'perl-mode t))
(defun mumamo-chunk-mason-perl-once (pos min max)
(mumamo-quick-static-chunk pos min max "<%once>" "</%once>" t 'perl-mode t))
(defun mumamo-chunk-mason-perl-cleanup (pos min max)
(mumamo-quick-static-chunk pos min max "<%cleanup>" "</%cleanup>" t 'perl-mode t))
(defun mumamo-chunk-mason-perl-shared (pos min max)
(mumamo-quick-static-chunk pos min max "<%shared>" "</%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>" "</%args>" t 'perl-mode t))
(defun mumamo-chunk-mason-doc (pos min max)
(mumamo-quick-static-chunk pos min max "<%doc>" "</%doc>" t 'mumamo-comment-mode t))
(defun mumamo-chunk-mason-text (pos min max)
(mumamo-quick-static-chunk pos min max "<%text>" "</%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-<! (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."
;; This is a bit tricky since [$var] etc must be avoided.
(let* ((begin-mark "[$")
(end-mark "$]")
(good-chars '(32 ;space
10 ;line feed
9 ;tab
))
;; (search-bw-exc-start (lambda (pos min)
;; (let ((not-found t)
;; (next-char nil)
;; (exc-start (mumamo-chunk-start-bw-str
;; pos min begin-mark))
;; (here (point)))
;; (while (and not-found
;; exc-start)
;; (setq next-char (char-after (+ (point) 2)))
;; (if (memq next-char good-chars)
;; (setq not-found nil)
;; (setq exc-start
;; (search-backward begin-mark
;; min t))))
;; (when (and exc-start
;; (<= exc-start pos))
;; (cons exc-start 'perl-mode)))))
;; (search-bw-exc-end (lambda (pos min)
;; (mumamo-chunk-end-bw-str pos min end-mark)))
;; (search-fw-exc-start-old (lambda (pos max)
;; (let ((not-found t)
;; (next-char nil)
;; (exc-start (mumamo-chunk-start-fw-str
;; pos max begin-mark))
;; (here (point)))
;; (while (and not-found
;; exc-start)
;; (setq next-char (char-after))
;; (if (memq next-char good-chars)
;; (setq not-found nil)
;; (setq exc-start
;; (search-forward begin-mark
;; max t))))
;; exc-start)))
(search-fw-exc-start (lambda (pos max)
(let ((not-found t)
(next-char nil)
(exc-start (mumamo-chunk-start-fw-str
pos max begin-mark))
(here (point)))
(while (and not-found
exc-start)
(setq next-char (char-after))
(if (memq next-char good-chars)
(setq not-found nil)
(setq exc-start
(search-forward begin-mark
max t))))
(list exc-start 'perl-mode))))
(search-fw-exc-end (lambda (pos max)
(save-match-data
(mumamo-chunk-end-fw-str pos max end-mark))))
)
;; (mumamo-find-possible-chunk pos min max
;; search-bw-exc-start
;; search-bw-exc-end
;; search-fw-exc-start-old
;; search-fw-exc-end)
(mumamo-possible-chunk-forward pos max
search-fw-exc-start
search-fw-exc-end)
))
;;;###autoload
(define-mumamo-multi-major-mode embperl-html-mumamo-mode
"Turn on multiple major modes for Embperl files with main mode `html-mode'.
This also covers inlined style and javascript."
("Embperl HTML Family" html-mode
(mumamo-chunk-embperl-<-
mumamo-chunk-embperl-<+
mumamo-chunk-embperl-<!
mumamo-chunk-embperl-<$
mumamo-chunk-inlined-style
mumamo-chunk-inlined-script
mumamo-chunk-style=
mumamo-chunk-onjs=
)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; django
(defun mumamo-chunk-django4(pos min max)
"Find {% comment %}. Return range and `django-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{% comment %}" "{% endcomment %}" t 'mumamo-comment-mode t))
(defun mumamo-chunk-django3(pos min max)
"Find {# ... #}. Return range and `django-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{#" "#}" t 'mumamo-comment-mode t))
(defun mumamo-chunk-django2(pos min max)
"Find {{ ... }}. Return range and `django-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{{" "}}" t 'django-variable-mode t))
(defun mumamo-chunk-django (pos min max)
"Find {% ... %}. Return range and `django-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(let ((chunk (mumamo-quick-static-chunk pos min max "{%" "%}" t 'django-mode t)))
(when chunk
(setcdr (last chunk) '(mumamo-template-indentor))
chunk)))
;; (defun mumamo-search-bw-exc-start-django (pos min)
;; "Helper for `mumamo-chunk-django'.
;; POS is where to start search and MIN is where to stop."
;; (let ((exc-start (mumamo-chunk-start-bw-str-inc pos min "{%")))
;; (and exc-start
;; (<= exc-start pos)
;; (cons exc-start 'django-mode))))
;; (defun mumamo-search-bw-exc-start-django2(pos min)
;; "Helper for `mumamo-chunk-django2'.
;; POS is where to start search and MIN is where to stop."
;; (let ((exc-start (mumamo-chunk-start-bw-str-inc pos min "{{")))
;; (and exc-start
;; (<= exc-start pos)
;; (cons exc-start 'django-mode))))
;; (defun mumamo-search-bw-exc-start-django3(pos min)
;; "Helper for `mumamo-chunk-django3'.
;; POS is where to start search and MIN is where to stop."
;; (let ((exc-start (mumamo-chunk-start-bw-str-inc pos min "{#")))
;; (and exc-start
;; (<= exc-start pos)
;; (cons exc-start 'mumamo-comment-mode))))
;; (defun mumamo-search-bw-exc-start-django4(pos min)
;; "Helper for `mumamo-chunk-django4'.
;; POS is where to start search and MIN is where to stop."
;; (let ((exc-start (mumamo-chunk-start-bw-str-inc pos min
;; "{% comment %}")))
;; (and exc-start
;; (<= exc-start pos)
;; (cons exc-start 'mumamo-comment-mode))))
;; (defun mumamo-search-bw-exc-end-django (pos min)
;; "Helper for `mumamo-chunk-django'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str-inc pos min "%}"))
;; (defun mumamo-search-bw-exc-end-django2(pos min)
;; "Helper for `mumamo-chunk-django2'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str-inc pos min "}}"))
;; (defun mumamo-search-bw-exc-end-django3(pos min)
;; "Helper for `mumamo-chunk-django3'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str-inc pos min "#}"))
;; (defun mumamo-search-bw-exc-end-django4(pos min)
;; "Helper for `mumamo-chunk-django4'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str-inc pos min "{% endcomment %}"))
(defun mumamo-search-fw-exc-start-django (pos max)
"Helper for `mumamo-chunk-django'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-start-fw-str-inc pos max "{%"))
(defun mumamo-search-fw-exc-start-django2(pos max)
"Helper for `mumamo-chunk-django2'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-start-fw-str-inc pos max "{{"))
(defun mumamo-search-fw-exc-start-django3(pos max)
"Helper for `mumamo-chunk-django3'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-start-fw-str-inc pos max "{#"))
(defun mumamo-search-fw-exc-start-django4(pos max)
"Helper for `mumamo-chunk-django4'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-start-fw-str-inc pos max "{% comment %}"))
(defun mumamo-search-fw-exc-end-django (pos max)
"Helper for `mumamo-chunk-django'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-end-fw-str-inc pos max "%}"))
(defun mumamo-search-fw-exc-end-django2(pos max)
"Helper for `mumamo-chunk-django2'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-end-fw-str-inc pos max "}}"))
(defun mumamo-search-fw-exc-end-django3(pos max)
"Helper for `mumamo-chunk-django3'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-end-fw-str-inc pos max "#}"))
(defun mumamo-search-fw-exc-end-django4(pos max)
"Helper for `mumamo-chunk-django4'.
POS is where to start search and MAX is where to stop."
(mumamo-chunk-end-fw-str-inc pos max "{% endcomment %}"))
;;;###autoload
(define-mumamo-multi-major-mode django-html-mumamo-mode
"Turn on multiple major modes for Django with main mode `html-mode'.
This also covers inlined style and javascript."
("Django HTML Family" html-mode
(mumamo-chunk-django4
mumamo-chunk-django
mumamo-chunk-django2
mumamo-chunk-django3
mumamo-chunk-inlined-style
mumamo-chunk-inlined-script
mumamo-chunk-style=
mumamo-chunk-onjs=
)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Genshi / kid
;; {% python ... %}
(defun mumamo-chunk-genshi%(pos min max)
"Find {% python ... %}. Return range and `genshi-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{% python" "%}" t 'python-mode t))
;; ${expr}
(defun mumamo-chunk-genshi$(pos min max)
"Find ${ ... }, return range and `python-mode'.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(let ((chunk
(mumamo-quick-static-chunk pos min max "${" "}" t 'python-mode t)))
(when chunk
;; Test for clash with %}
(let ((sub-mode (nth 2 chunk))
(start (nth 0 chunk)))
(if sub-mode
chunk
;;(message "point.1=%s" (point))
(when (and start
(eq ?% (char-before start)))
;;(message "point.2=%s" (point))
;;(message "clash with %%}, chunk=%s" chunk)
;;(setq chunk nil)
(setcar chunk (1- start))
)
;;(message "chunk.return=%s" chunk)
chunk)))))
;; Fix-me: Because of the way chunks currently are searched for there
;; is an error when a python chunk is used. This is because mumamo
;; gets confused by the %} ending and the } ending. This can be
;; solved by running a separate phase to get the chunks first and
;; during that phase match start and end of the chunk.
;; Note: You will currently get fontification errors if you use
;; python chunks
;; {% python ... %}
;; The reason is that the chunk routines currently do not know when
;; to just look for the } or %} endings. However this should not
;; affect your editing normally.
;;;###autoload
(define-mumamo-multi-major-mode genshi-html-mumamo-mode
"Turn on multiple major modes for Genshi with main mode `html-mode'.
This also covers inlined style and javascript."
("Genshi HTML Family" html-mode
(
;;mumamo-chunk-genshi%
mumamo-chunk-genshi$
mumamo-chunk-py:=
mumamo-chunk-py:match
mumamo-chunk-xml-pi
mumamo-chunk-inlined-style
mumamo-chunk-inlined-script
mumamo-chunk-style=
mumamo-chunk-onjs=
)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; MJT
;; ${expr}
(defun mumamo-chunk-mjt$(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))
;;;###autoload
(define-mumamo-multi-major-mode mjt-html-mumamo-mode
"Turn on multiple major modes for MJT with main mode `html-mode'.
This also covers inlined style and javascript."
("MJT HTML Family" html-mode
(
mumamo-chunk-mjt$
mumamo-chunk-xml-pi
mumamo-chunk-inlined-style
mumamo-chunk-inlined-script
mumamo-chunk-style=
mumamo-chunk-onjs=
)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; smarty
(defun mumamo-chunk-smarty-literal (pos min max)
"Find {literal} ... {/literal}. Return range and 'html-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{literal}" "{/literal}" t 'html-mode t))
(defun mumamo-chunk-smarty-t (pos min max)
"Find {t} ... {/t}. Return range and 'html-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{t}" "{/t}" t 'text-mode t))
(defun mumamo-chunk-smarty-comment (pos min max)
"Find {* ... *}. Return range and 'mumamo-comment-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{*" "*}" t 'mumamo-comment-mode nil))
(defun mumamo-chunk-smarty (pos min max)
"Find { ... }. Return range and 'smarty-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max "{" "}" t 'smarty-mode nil))
;;;###autoload
(define-mumamo-multi-major-mode smarty-html-mumamo-mode
"Turn on multiple major modes for Smarty with main mode `html-mode'.
This also covers inlined style and javascript."
("Smarty HTML Family" html-mode
(mumamo-chunk-xml-pi
mumamo-chunk-style=
mumamo-chunk-onjs=
;;mumamo-chunk-inlined-style
;;mumamo-chunk-inlined-script
mumamo-chunk-smarty-literal
mumamo-chunk-smarty-t
mumamo-chunk-smarty-comment
mumamo-chunk-smarty
)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; ssjs - server side javascript
;; http://www.sitepoint.com/blogs/2009/03/10/server-side-javascript-will-be-as-common-as-php/
;;
;; It looks like there are different syntaxes, both
;;
;; <script runat="server">...</script> 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 "<script"
space
(0+ (not (any ">")))
"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) "<![CDATA[" )
))
;; (defun mumamo-search-bw-exc-start-inlined-ssjs (pos min)
;; "Helper for `mumamo-chunk-inlined-ssjs'.
;; POS is where to start search and MIN is where to stop."
;; (goto-char (+ pos 7))
;; (let ((marker-start (when (< min (point)) (search-backward "<script" min t)))
;; exc-mode
;; exc-start)
;; (when marker-start
;; (when (looking-at mumamo-ssjs-tag-start-regex)
;; (setq exc-start (match-end 0))
;; (goto-char exc-start)
;; (when (<= exc-start pos)
;; ;;(cons (point) 'javascript-mode)
;; (list (point) 'javascript-mode '(nxml-mode))
;; )
;; ))))
;; (defun mumamo-search-fw-exc-start-inlined-ssjs-old (pos max)
;; "Helper for `mumamo-chunk-inlined-ssjs'.
;; POS is where to start search and MAX is where to stop."
;; (goto-char (1+ pos))
;; (skip-chars-backward "^<")
;; ;; Handle <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<script" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 7))
;; (when (looking-at mumamo-ssjs-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-search-fw-exc-start-inlined-ssjs (pos max)
"Helper for `mumamo-chunk-inlined-ssjs'.
POS is where to start search and MAX is where to stop."
(goto-char (1+ pos))
(skip-chars-backward "^<")
;; Handle <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<script" max t))
exc-mode)
(when exc-start
(goto-char (- exc-start 7))
(when (looking-at mumamo-ssjs-tag-start-regex)
(goto-char (match-end 0))
(list (point) 'javascript-mode)
))))
(defun mumamo-chunk-inlined-ssjs (pos min max)
"Find <script runat=...>...</script>. 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 "<method"
(optional
space
(0+ (not (any ">"))))
">"
;; FIX-ME: Commented out because of bug in Emacs
;;
;;(optional (0+ space) "<![CDATA[" )
))
(defun mumamo-search-bw-exc-start-inlined-lzx-method (pos min)
"Helper for `mumamo-chunk-inlined-lzx-method'.
POS is where to start search and MIN is where to stop."
(goto-char (+ pos 7))
(let ((marker-start (search-backward "<method" min t))
exc-mode
exc-start)
(when marker-start
(when (looking-at mumamo-lzx-method-tag-start-regex)
(setq exc-start (match-end 0))
(goto-char exc-start)
(when (<= exc-start pos)
(cons (point) 'javascript-mode))
))))
;; (defun mumamo-search-bw-exc-end-inlined-lzx-method (pos min)
;; "Helper for `mumamo-chunk-inlined-lzx-method'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str pos min "</method>"))
;; (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 <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<method" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 7))
;; (when (looking-at mumamo-lzx-method-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-search-fw-exc-start-inlined-lzx-method (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 <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<method" max t))
exc-mode)
(when exc-start
(goto-char (- exc-start 7))
(when (looking-at mumamo-lzx-method-tag-start-regex)
(goto-char (match-end 0))
(list (point) 'javascript-mode)
))))
(defun mumamo-search-fw-exc-end-inlined-lzx-method (pos max)
"Helper for `mumamo-chunk-inlined-lzx-method'.
POS is where to start search and MAX is where to stop."
(save-match-data
(mumamo-chunk-end-fw-str pos max "</method>")))
(defun mumamo-chunk-inlined-lzx-method (pos min max)
"Find <method>...</method>. 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 "<handler"
(optional
space
(0+ (not (any ">"))))
">"
;; FIX-ME: Commented out because of bug in Emacs
;;
;;(optional (0+ space) "<![CDATA[" )
))
;; (defun mumamo-search-bw-exc-start-inlined-lzx-handler (pos min)
;; "Helper for `mumamo-chunk-inlined-lzx-handler'.
;; POS is where to start search and MIN is where to stop."
;; (goto-char (+ pos 8))
;; (let ((marker-start (search-backward "<handler" min t))
;; exc-mode
;; exc-start)
;; (when marker-start
;; (when (looking-at mumamo-lzx-handler-tag-start-regex)
;; (setq exc-start (match-end 0))
;; (goto-char exc-start)
;; (when (<= exc-start pos)
;; (cons (point) 'javascript-mode))
;; ))))
;; (defun mumamo-search-bw-exc-end-inlined-lzx-handler (pos min)
;; "Helper for `mumamo-chunk-inlined-lzx-handler'.
;; POS is where to start search and MIN is where to stop."
;; (mumamo-chunk-end-bw-str pos min "</handler>"))
;; (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 <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<handler" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 8))
;; (when (looking-at mumamo-lzx-handler-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-search-fw-exc-start-inlined-lzx-handler (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 <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<handler" max t))
exc-mode)
(when exc-start
(goto-char (- exc-start 8))
(when (looking-at mumamo-lzx-handler-tag-start-regex)
(goto-char (match-end 0))
(list (point) 'javascript-mode)
))))
(defun mumamo-search-fw-exc-end-inlined-lzx-handler (pos max)
"Helper for `mumamo-chunk-inlined-lzx-handler'.
POS is where to start search and MAX is where to stop."
(save-match-data
(mumamo-chunk-end-fw-str pos max "</handler>")))
(defun mumamo-chunk-inlined-lzx-handler (pos min max)
"Find <handler>...</handler>. 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 "<csinstruments>")))
;; (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 "</csinstruments>"))
;; (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 "<csinstruments>"))
(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 "<csinstruments>")))
(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 "</csinstruments>")))
(defun mumamo-chunk-csound-orc (pos min max)
"Find <csinstruments>...</...>. 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 "<csscore>")))
;; (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 "</csscore>"))
;; (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 "<csscore>"))
(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 "<csscore>")))
(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 "</csscore>")))
(defun mumamo-chunk-csound-sco (pos min max)
"Found <csscore>...</csscore>. 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 <script ...>
(defconst mumamo-asp-script-tag-start-regex
(rx "<script"
space
(0+ (not (any ">")))
"language"
(0+ space)
"="
(0+ space)
?\"
;;(or "text" "application")
;;"/"
;;(or "javascript" "ecmascript")
;; "text/javascript"
(submatch
(or "javascript" "vbscript"))
?\"
(0+ (not (any ">")))
">"
;; FIX-ME: Commented out because of bug in Emacs
;;
;;(optional (0+ space) "<![CDATA[" )
))
;; (defun mumamo-asp-search-bw-exc-start-inlined-script (pos min)
;; "Helper function for `mumamo-asp-chunk-inlined-script'.
;; POS is where to start search and MIN is where to stop."
;; (goto-char (+ pos 7))
;; (let ((marker-start (search-backward "<script" min t))
;; (exc-mode 'asp-vb-mode)
;; exc-start
;; lang)
;; (when marker-start
;; (when (looking-at mumamo-asp-script-tag-start-regex)
;; (setq lang (downcase (match-string-no-properties 1)))
;; (cond
;; ((string= lang "javascript")
;; (setq exc-mode 'asp-js-mode))
;; ((string= lang "vbscript")
;; (setq exc-mode 'asp-vb-mode))))
;; (setq exc-start (match-end 0))
;; (goto-char exc-start)
;; (when (<= exc-start pos)
;; (cons (point) exc-mode))
;; )))
;; (defun mumamo-asp-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 <![CDATA[
;; (when (and
;; (eq ?< (char-before))
;; (eq ?! (char-after))
;; (not (bobp)))
;; (backward-char)
;; (skip-chars-backward "^<"))
;; (unless (bobp)
;; (backward-char 1))
;; (let ((exc-start (search-forward "<script" max t))
;; exc-mode)
;; (when exc-start
;; (goto-char (- exc-start 7))
;; (when (looking-at mumamo-asp-script-tag-start-regex)
;; (goto-char (match-end 0))
;; (point)
;; ))))
(defun mumamo-asp-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 <![CDATA[
(when (and
(eq ?< (char-before))
(eq ?! (char-after))
(not (bobp)))
(backward-char)
(skip-chars-backward "^<"))
(unless (bobp)
(backward-char 1))
(let ((exc-start (search-forward "<script" max t))
(exc-mode 'asp-vb-mode)
(lang "vbscript"))
(when exc-start
(goto-char (- exc-start 7))
(when (looking-at mumamo-asp-script-tag-start-regex)
(goto-char (match-end 0))
(setq lang (downcase (match-string-no-properties 1)))
(cond
((string= lang "javascript")
(setq exc-mode 'asp-js-mode))
((string= lang "vbscript")
(setq exc-mode 'asp-vb-mode)))
(list (point) exc-mode)
))))
(defun mumamo-asp-chunk-inlined-script (pos min max)
"Find <script language=... runat=...>...</script>. 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>" "</%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" "</%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