**编辑:**自撰写本文以来,似乎部分功能已直接在markdown模式下实现。查看此评论以及其中的链接。
组态
您可以采用两种方法。
- 您可以编写一个编译降价代码的命令(使用shell命令)并在缓冲区中显示html。
- 您可以进行一些自定义a-la org-mode来使缓冲区看起来像渲染的markdown。
我在这里解释如何实现数字2。只需将下面的所有代码复制到您的init文件中。
添加字体锁定规则
此变量控制您希望列表的外观。它增加了一些缩进列表的空间,并使用了漂亮的项目符号(如果字体可以显示的话)。
(defvar endless/bullet-appearance
(propertize (if (char-displayable-p ?•) " •" " *")
'face 'markdown-list-face)
"String to be displayed as the bullet of markdown list items.")
这是实际添加规则的命令。有一个用于列表,一个用于链接。
(require 'rx)
(defvar endless/markdown-link-regexp
"\\[\\(?1:[^]]+\\)]\\(?:(\\(?2:[^)]+\\))\\|\\[\\(?3:[^]]+\\)]\\)"
"Regexp matching a markdown link.")
(font-lock-add-keywords
'markdown-mode
'(("^ *\\(\\*\\|\\+\\|-\\|\\) "
1 `(face nil display ,endless/bullet-appearance) prepend)
(endless/markdown-link-regexp
1 '(face nil display "") prepend))
'append)
使链接可编辑
因为我们正在使用该display
属性隐藏链接的一部分,所以我们需要告诉font-lock,无论何时删除链接的一部分,它都应该擦除该属性(这样我们仍然可以对其进行编辑)。
(add-hook 'markdown-mode-hook #'endless/markdown-font-lock)
(defun endless/markdown-font-lock ()
"Configure aggressive font-locking of `markdown-mode'."
(define-key markdown-mode-map "\C-c\C-l" #'endless/markdown-insert-link)
(add-to-list (make-local-variable 'font-lock-extra-managed-props) 'display))
我们还可以定义一个命令来轻松对其进行编辑(绑定到)C-c C-l
,就像在org-mode中一样。
(defun endless/markdown-insert-link ()
"Insert or edit link at point."
(interactive)
(if (or (looking-at endless/markdown-link-regexp)
(and (ignore-errors (backward-up-list) t)
(or (looking-at endless/markdown-link-regexp)
(and (forward-sexp -1)
(looking-at endless/markdown-link-regexp)))))
(let ((data (endless/ask-for-link
(match-string-no-properties 1)
(or (match-string-no-properties 2)
(match-string-no-properties 3)))))
(if (match-string-no-properties 2)
(replace-match (cdr data) :fixedcase :literal nil 2)
(replace-match (cdr data) :fixedcase :literal nil 3))
(replace-match (car data) :fixedcase :literal nil 1))
(let ((data (endless/ask-for-link)))
(insert "[" (car data) "](" (cdr data) ")"))))
(defun endless/ask-for-link (&optional name link)
(cons (read-string "Text of the link: " name)
(read-string "URL of the link: " link)))
(可选)配置一些面孔
这足以满足您的要求。如果你希望你的缓冲区看起来更象SE降价,通话
M-x customize-group RET markdown-faces
并更改您认为合适的内容。我做了一些自我配置,这就是我得到的。
(custom-set-faces
'(markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
'(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.7))))
'(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.4))))
'(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.1))))
'(markdown-inline-code-face ((t (:inherit font-lock-constant-face :background "gainsboro"))))
'(markdown-link-face ((t (:inherit link))))
'(markdown-pre-face ((t (:inherit font-lock-constant-face :background "gainsboro")))))
结果
这是前两套配置后的内容:
这也是配置完脸后会得到的结果。这看起来是否更好是有争议的,我个人会坚持上面的一种。