diff --git a/layers/+lang/markdown/README.org b/layers/+lang/markdown/README.org index 6d5e09746..6fa9b0015 100644 --- a/layers/+lang/markdown/README.org +++ b/layers/+lang/markdown/README.org @@ -9,6 +9,7 @@ - [[#install][Install]] - [[#configuration][Configuration]] - [[#live-preview][Live preview]] + - [[#automatic-mmm-mode-generation][Automatic MMM-Mode Generation]] - [[#usage][Usage]] - [[#generate-a-toc][Generate a TOC]] - [[#key-bindings][Key bindings]] @@ -65,6 +66,16 @@ Additionally there is =flymd= package in =chrome= layer that allows to preview markdown buffer in Chrome. Please refer to =chrome= layer documentation for more information. +** Automatic MMM-Mode Generation +To generate MMM-Modes for languages where the language name directly relates to +the Emacs mode name, set the value of the variable =markdown-mmm-auto-modes= to +a list of the languages: + +#+BEGIN_SRC emacs-lisp + dotspacemacs-configuration-layers '( + (markdown :variables markdown-mmm-auto-modes '("c" "c++" "python" "scala")) +#+END_SRC + * Usage ** Generate a TOC To generate a table of contents type on top of the buffer: diff --git a/layers/+lang/markdown/config.el b/layers/+lang/markdown/config.el index 3aa5c2702..63aeb194f 100644 --- a/layers/+lang/markdown/config.el +++ b/layers/+lang/markdown/config.el @@ -13,3 +13,8 @@ (defvar markdown-live-preview-engine 'eww "Possibe values are `eww' (built-in browser) or `vmd' (installed with `npm').") + +(defvar markdown-mmm-auto-modes + '("c" "c++" "css" "java" "javascript" "python" "ruby" "rust" "scala") + "Automatically add mmm class for languages where its name and mode name are +directly related") diff --git a/layers/+lang/markdown/packages.el b/layers/+lang/markdown/packages.el index ad132d402..73568e188 100644 --- a/layers/+lang/markdown/packages.el +++ b/layers/+lang/markdown/packages.el @@ -43,6 +43,17 @@ (defun markdown/post-init-smartparens () (add-hook 'markdown-mode-hook 'smartparens-mode)) +(defun markdown/mmm-auto-class (lang &optional submode) + (let ((class (intern (concat "markdown-" lang))) + (submode (or submode (intern (concat lang "-mode")))) + (front (concat "^```" lang "[\n\r]+")) + (back "^```$")) + (mmm-add-classes (list (list class + :submode submode + :front front + :back back))) + (mmm-add-mode-ext-class 'markdown-mode nil class))) + (defun markdown/init-markdown-mode () (use-package markdown-mode :mode ("\\.m[k]d" . markdown-mode) @@ -170,80 +181,15 @@ Will work on both org-mode and any mode that accepts plain html." :init (add-hook 'markdown-mode-hook 'spacemacs/activate-mmm-mode) :config (progn - (spacemacs|hide-lighter mmm-mode) - (mmm-add-classes '((markdown-ini - :submode conf-unix-mode - :face mmm-declaration-submode-face - :front "^```ini[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-python - :submode python-mode - :face mmm-declaration-submode-face - :front "^```python[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-html - :submode web-mode - :face mmm-declaration-submode-face - :front "^```html[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-java - :submode java-mode - :face mmm-declaration-submode-face - :front "^```java[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-ruby - :submode ruby-mode - :face mmm-declaration-submode-face - :front "^```ruby[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-c - :submode c-mode - :face mmm-declaration-submode-face - :front "^```c[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-c++ - :submode c++-mode - :face mmm-declaration-submode-face - :front "^```c\+\+[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-elisp - :submode emacs-lisp-mode - :face mmm-declaration-submode-face - :front "^```elisp[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-javascript - :submode javascript-mode - :face mmm-declaration-submode-face - :front "^```javascript[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-ess - :submode R-mode - :face mmm-declaration-submode-face - :front "^```{?r.*}?[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-rust - :submode rust-mode - :face mmm-declaration-submode-face - :front "^```rust[\n\r]+" - :back "^```$"))) - (mmm-add-classes '((markdown-scala - :submode scala-mode - :face mmm-declaration-submode-face - :front "^```scala[\n\r]+" - :back "^```$"))) - (setq mmm-global-mode t) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-python) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-java) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-ruby) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-c) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-c++) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-elisp) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-html) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-javascript) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-ess) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-rust) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-ini) - (mmm-add-mode-ext-class 'markdown-mode nil 'markdown-scala)))) + ;; Automatically add mmm class for languages where its name and mode + ;; name are directly related + (mapc 'markdown/mmm-auto-class markdown-mmm-auto-modes) + + ;; Otherwise define these manually + (markdown/mmm-auto-class "html" 'web-mode) + (markdown/mmm-auto-class "elisp" 'emacs-lisp-mode) + (markdown/mmm-auto-class "ess" 'R-mode) + (setq mmm-global-mode t)))) (defun markdown/init-vmd-mode () (use-package vmd-mode