用于 Markdown 和 Python 的 Emacs 多模式

Emacs polymode for Markdown and Python

我使用 python3 pweave 库 (http://mpastell.com/pweave/usage.html) 文学编程

pweave 用作文本模式 markdown,用作代码模式 python3, 并且可以使用 noweb (https://en.wikipedia.org/wiki/Noweb) 文学编程语法。

为了在 emacs 中正确突出显示语法,我打算使用 polymode 库 (https://polymode.github.io/ and https://github.com/polymode)。

我使用的是emacs version26.1。 而且我能够从 melpa 安装 polymode。

不幸的是没有预先存在的多模式 主机模式:markdown,内部模式:python3,语法:noweb 所以我尝试根据文档和现有代码编写我的 poly-pweave-mode,通过将以下 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.

我做错了什么? 我如何获得所需的多模 运行?

这是如何指定 markdown-python3-noweb polymode

的解决方案
;; 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))

感谢 polymode 包的作者 Vitalie Spinu,他帮助我解决了这个问题! 有关详细讨论,请查看 polymode issue 180 at github.

或者 我在 emacs 堆栈交换中发现了这个 post: https://emacs.stackexchange.com/questions/20136/pythontex-and-auctex 所以,在这个 post 之后,这是获得的解决方案到 markdown-python3-noweb mmm-mode

;; 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))

我要感谢 Jean Pierre,他在 post 中的详细解释使我的案例 运行 变得轻而易举!