Полимод Emacs для Markdown и Python
Я использую библиотеку python3 pweave ( http://mpastell.com/pweave/usage.html) для грамотного программирования.
pweave использует как разметку текстового режима, как режим кода python3, и можно использовать синтаксис грамотного программирования noweb ( https://en.wikipedia.org/wiki/Noweb).
Для правильной подсветки синтаксиса в emacs я стремился использовать библиотеку полимодов ( https://polymode.github.io/ и https://github.com/polymode).
Я использую Emacs версии 26.1. И мне удалось установить полимод из melpa.
К сожалению, ранее не существовало многорежимного режима для режима хоста: markdown, inner-mode: python3, синтаксис: noweb, поэтому я попытался, основываясь на документации и существующем коде, написать свой единственный режим poly-pweave, поставив следующее код lisp в мой файл .emacs.
(require 'polymode-classes)
(defcustom pm-host/pweave-text
(pm-host-chunkmode :name "pweave-text"
:mode 'markdown-mode)
"markdown host chunkmode"
:group 'poly-hostmodes
:type 'object)
(defcustom pm-inner/pweave-code
(pm-inner-chunkmode :name "pweave-code"
:head-matcher "^[ \t]*<<\\(.*\\)>>="
:tail-matcher "^[ \t]*@.*$"
:mode 'python-mode)
"noweb static python3 inner chunkmode."
:group 'poly-innermodes
:type 'object)
(define-polymode poly-pweave-mode
:hostmode 'pm-host/pweave-text
:innermode 'pm-inner/pweave-code)
(add-to-list 'auto-mode-alist '("\\.pymd" . poly-pweave-mode))
Но почему-то Emacs не ест это. Когда я открываю emacs, я получаю следующую ошибку:
Warning (initialization): An error occurred while loading `/Users/abc/.emacs':
Symbol's function definition is void: pm-host-chunkmode
To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file. Start Emacs with
the `--debug-init' option to view a complete error backtrace.
Что я не прав? Как я могу запустить желаемый полимод?
1 ответ
Это решение о том, как указать многомод markdown-python3-noweb.
;; define pwn polymode
(require 'poly-noweb)
(require 'poly-markdown)
(defcustom pm-inner/noweb-python
(clone pm-inner/noweb
:name "noweb-python"
:mode 'python-mode)
"Noweb for Python"
:group 'poly-innermodes
:type 'object)
(define-polymode poly-pweave-mode poly-markdown-mode
:innermodes '(pm-inner/noweb-python :inherit))
(add-to-list 'auto-mode-alist '("\\.pymd" . poly-pweave-mode))
Я благодарю Виталия Спину, автора пакета полимодов, который помог мне решить этот вопрос! Для подробного обсуждения взгляните на проблему многомодового режима 180 на github.
В качестве альтернативы я нашел этот пост на бирже стека emacs: https://emacs.stackexchange.com/questions/20136/pythontex-and-auctex Итак, после этого поста это решение для перехода к markdown-python3-noweb mmm- Режим
;; define pwn multi major modes mode
(require 'mmm-auto)
(mmm-add-classes
'((noweb-python
:submode python-mode
:face mmm-default-submode-face
:front "^<<.*>>=\n"
:back "^@$")))
(setq mmm-global-mode 'maybe)
(mmm-add-mode-ext-class 'markdown-mode nil 'noweb-python)
(add-to-list 'auto-mode-alist '("\\.pymd" . markdown-mode))
Моя благодарность принадлежит Жану Пьеру, чье подробное объяснение в посте сделало его легким в использовании для моего случая!