Установить режим от регулярного выражения до регулярного выражения?
Это вопрос о MuMaMo. Если добавить в конец nxhtml/util/mumamo-fun.el
следующий код:
(defun rst-bk-latex-directive-chunk (pos min max)
"Find math chunks. Return range and 'latex-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max ".. math::\n\n" ".." nil 'latex-mode t))
;;;###autoload
(define-mumamo-multi-major-mode rst-bk-mumamo-mode
"Turn on multiple major modes for Python with RestructuredText docstrings."
("ReST" rst-mode
(
rst-bk-latex-directive-chunk
)))
(add-to-list 'auto-mode-alist '("\\.rst\\'" . rst-bk-mumamo-mode))
А также
(load "~/.emacs.d/site-lisp/nxhtml/autostart.el")
(require 'mumamo)
(require 'mumamo-fun)
в ~/.emacs
Один получает куски между струнами .. math::\n\n
а также ..
быть в режиме латекса.
Мой вопрос - как сделать чанк между двумя заданными регулярными выражениями данного режима?
Редактировать:
Я добавил следующие в конце mumamo-fun.el
:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; ReST + math + bash + python + cl
;; LaTeX:
(defun rst-bk-mumamo-math-regexp-chunk-start (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max
"\\.\\. math::\\(.?\\|\n\\)*?\n\n"
)))
(when where
(list where 'latex-mode))))
(defun rst-bk-mumamo-math-regexp-chunk-end (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max
"\\(^[[:blank:]]+$\\|\n\\)+[^[:blank:]\n]"
)))
(defun rst-bk-mumamo-math-quick-regexp-chunk (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max 'rst-bk-mumamo-math-regexp-chunk-start
'rst-bk-mumamo-math-regexp-chunk-end)))
(defun rst-bk-mumamo-math-directive (pos min max)
"Find math chunks. Return range and 'math-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(rst-bk-mumamo-math-quick-regexp-chunk pos min max))
(defun rst-bk-mumamo-math-inline-chunk (pos min max)
"Find math chunks. Return range and 'math-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-static-chunk pos min max ":math:`" "`" nil 'math-mode t))
;; bash:
(defun rst-bk-mumamo-sh-regexp-chunk-start (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max "\\.\\. code-block:: bash\\(.\\|\n\\)*?\n\n")))
(when where
(list where 'sh-mode))))
(defun rst-bk-mumamo-sh-regexp-chunk-end (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max
"\\(^[[:blank:]]+$\\|\n\\)+[^[:blank:]\n]"
)))
(defun rst-bk-mumamo-sh-quick-regexp-chunk (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max 'rst-bk-mumamo-sh-regexp-chunk-start
'rst-bk-mumamo-sh-regexp-chunk-end)))
(defun rst-bk-mumamo-sh-directive (pos min max)
"Find math chunks. Return range and 'sh-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(rst-bk-mumamo-sh-quick-regexp-chunk pos min max))
;; python:
(defun rst-bk-mumamo-py-regexp-chunk-start (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max "\\.\\. code-block:: py\\(thon\\)?\\(.\\|\n\\)*?\n\n")))
(when where
(list where 'python-mode))))
(defun rst-bk-mumamo-py-regexp-chunk-end (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max "\\(^[[:blank:]]+$\\|\n\\)+[^[:blank:]\n]")))
(defun rst-bk-mumamo-py-quick-regexp-chunk (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max 'rst-bk-mumamo-py-regexp-chunk-start
'rst-bk-mumamo-py-regexp-chunk-end)))
(defun rst-bk-mumamo-py-directive (pos min max)
"Find math chunks. Return range and 'py-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(rst-bk-mumamo-py-quick-regexp-chunk pos min max))
;; cl:
(defun rst-bk-mumamo-cl-regexp-chunk-start (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max "\\.\\. code-block:: cl\\(.\\|\n\\)*?\n\n")))
(when where
(list where 'emacs-lisp-mode))))
(defun rst-bk-mumamo-cl-regexp-chunk-end (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max "\\(^[[:blank:]]+$\\|\n\\)+[^[:blank:]\n]")))
(defun rst-bk-mumamo-cl-quick-regexp-chunk (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max 'rst-bk-mumamo-cl-regexp-chunk-start
'rst-bk-mumamo-cl-regexp-chunk-end)))
(defun rst-bk-mumamo-cl-directive (pos min max)
"Find math chunks. Return range and 'cl-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(rst-bk-mumamo-cl-quick-regexp-chunk pos min max))
;;;###autoload
(define-mumamo-multi-major-mode rst-bk-mumamo-mode
"Turn on multiple major modes for Python with RestructuredText docstrings."
("ReST" rst-mode (
rst-bk-mumamo-math-directive
rst-bk-mumamo-math-inline-chunk
rst-bk-mumamo-sh-directive
rst-bk-mumamo-py-directive
)))
Прямо перед (provide 'mumamo-fun)
,
А потом в .emacs
:
(load "~/.emacs.d/site-lisp/nxhtml/autostart.el")
;; Mumamo is making emacs 23.3 freak out:
(when (and (equal emacs-major-version 23)
(equal emacs-minor-version 3))
(eval-after-load "bytecomp"
'(add-to-list 'byte-compile-not-obsolete-vars
'font-lock-beginning-of-syntax-function))
;; tramp-compat.el clobbers this variable!
(eval-after-load "tramp-compat"
'(add-to-list 'byte-compile-not-obsolete-vars
'font-lock-beginning-of-syntax-function)))
(require 'mumamo)
(load "mumamo-fun")
(add-to-list 'auto-mode-alist '("\\.rst\\'" . rst-bk-mumamo-mode))
И теперь, когда я открываю файлы ReST, у меня есть:
math:`TEXT`
режима LaTeX
.. math:
TEXT
режима LaTeX
.. code-block: bash
TEXT
из sh-режима и
.. code-block: py
TEXT
Python-режима.
Изменить 2:
Также, если добавить
("^ \\(.+\\)" 1 'font-latex-math-face)
после
(dolist (item
'(("\\(^\\|[^\\]\\)\\(&+\\)" 2 'font-latex-warning-face)
("\\$\\$\\([^$]+\\)\\$\\$" 1 'font-latex-math-face)
;; HERE
...
в font-latex-make-user-keywords
в font-latex.el
AUCTeX, то можно получить математический режим под .. math::
,
1 ответ
Ключевые функции mumamo-possible-chunk-forward
в комбинации с mumamo-chunk-start-fw-re
а также mumamo-chunk-end-fw-re
- последние два соответствуют регулярному выражению.
Следующее делает трюк:
(defun regexp-chunk-start (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max "math:\n\n")))
(when where
(list where 'latex-mode))))
(defun regexp-chunk-end (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max "\\.\\.")))
(defun mumamo-quick-regexp-chunk (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max 'regexp-chunk-start
'regexp-chunk-end)))
(defun rst-bk-latex-directive (pos min max)
"Find math chunks. Return range and 'latex-mode.
See `mumamo-find-possible-chunk' for POS, MIN and MAX."
(mumamo-quick-regexp-chunk pos min max))
;;;###autoload
(define-mumamo-multi-major-mode rst-bk-mumamo-mode
"Turn on multiple major modes for Python with RestructuredText docstrings."
("ReST" rst-mode (rst-bk-latex-directive)))
(add-to-list 'auto-mode-alist '("\\.rst\\'" . rst-bk-mumamo-mode))
Я скопировал предоставленный вами материал автозагрузки. Честно говоря, я не понимаю, как должны загружаться основные режимы MuMaMo. Однако я смог протестировать эту функцию, вызвав ее вручную. mumamo-alias-rst-bk-latex-directive
в файле ReST.
API MuMaMo немного неудачно. Функциональность для соответствия области буфера разбросана по трем отдельным функциям, что затрудняет повторное использование. Я ожидаю, что вы, вероятно, захотите определить много регулярных выражений, как только у вас будет работать поиск по шаблону.
Так вот еще одна версия, которая оборачивает все в Марко define-quick-regexp-chunk
:
(defmacro define-quick-regexp-chunk (regexp-chunk-fun begin-mark end-mark mode)
(let ((regexp-chunk-start-fun (gensym))
(regexp-chunk-end-fun (gensym)))
`(progn
(defun ,regexp-chunk-start-fun (pos max)
(let ((where (mumamo-chunk-start-fw-re pos max ,begin-mark)))
(when where
(list where ,mode))))
(defun ,regexp-chunk-end-fun (pos max)
(save-match-data
(mumamo-chunk-end-fw-re pos max ,end-mark)))
(defun ,regexp-chunk-fun (pos
min
max)
(save-match-data
(mumamo-possible-chunk-forward pos max ',regexp-chunk-start-fun
',regexp-chunk-end-fun))))))
;; switch to latex-mode in between "math:\n\n" ".."
;; defines a function named "rst-bk-latex-directive" which should be called by MuMaMo
(define-quick-regexp-chunk rst-bk-latex-directive "math:\n\n" "\\.\\." 'latex-mode)
;;;###autoload
(define-mumamo-multi-major-mode rst-bk-mumamo-mode
"Turn on multiple major modes for Python with RestructuredText docstrings."
("ReST" rst-mode (rst-bk-latex-directive)))
(add-to-list 'auto-mode-alist '("\\.rst\\'" . rst-bk-mumamo-mode))
Он делает то же самое, но теперь я могу использовать define-quick-regexp-chunk
легко определить много областей, разделенных регулярным выражением. Обратите внимание, что вы должны дважды убежать от точек ( .
)
Проверьте определение фрагмента noweb2 в источниках nxHtml (в /util/mumamo-fun.el) для более продвинутого примера использования функций регулярного выражения MuMaMo.