是否可以使用 Emacs 自己的缓冲区文本格式化功能在 Emacs 缓冲区中呈现 Markdown?图形环境中的 Emacs 具有丰富的文本呈现功能(字体样式、颜色、链接甚至图像),因此这应该是完全可能的。有现成的实现吗?
请注意,我们的想法是让渲染的 Markdown 成为本机 Emacs 格式的文本,可以像 Emacs 中的任何其他文本一样进行导航和操作。因此,渲染到嵌入 Emacs 缓冲区中的图像的解决方案在这里并不理想。
另请注意,这不是编辑模式 Markdown,而是在 Emacs 缓冲区中呈现渲染的 Markdown。为了可移植性,它最好是一个纯 Emacs Lisp 解决方案。
就个人而言,我使用以下工作流程:
C-c C-c m
上运行以在当前缓冲区上运行 Markdown 并预览另一个缓冲区中的输出。 html-mode
(M-x html-mode
)M-x sgml-tags-invisible
)然后每次想要刷新渲染时,只需在 Markdown 缓冲区上再次运行
C-c C-c m
即可。
但我承认到目前为止,对于 Markdown 编辑/预览来说,没有什么比 Textmate 及其 Markdown 预览面板更好的了。实际上,从个人角度来看,我唯一喜欢运行 Textmate 而不是 Emacs 的情况是当我想编辑 Markdown 文件时。然而,在 emacs 上获得相同质量的预览并不是那么困难,也许我应该研究一下。在我看来,这很简单:
我想你可以使用 latex-preview 的源代码来获得灵感或使用 pretty-lambda(一个更简单的软件)。
或者,您可以在后台进程中将 Markdown 转换为 html 并预览 html。
在 Emacs 中一切皆有可能,但并非一切都能轻松实现:-)
我的 .emacs 文件中有这个:
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(markdown-header-delimiter-face ((t (:inherit font-lock-function-name-face :underline t :weight bold))) t)
'(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.5))) t)
'(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.3))) t)
'(markdown-header-face-3 ((t (:inherit markdown-header-face :underline t :height 1.2))) t)
'(markdown-header-face-4 ((t (:inherit markdown-header-face :underline t :height 1.1))) t)
'(markdown-header-face-5 ((t (:inherit markdown-header-face :underline t))) t)
'(markdown-header-face-6 ((t (:inherit markdown-header-face :underline t))) t))
(put 'set-goal-column 'disabled nil)
放大了所有标题。 Markdown 模式本身会将加星号的文本和粗体双星号的文本显示为斜体,因此这将帮助您实现这一目标。但是,它不会使控制字符不可见。
如果你想要这样,你可能应该看看 pretty-lambda 的例子(如 Bozhidar Batsov 建议)
根据您想要查看渲染文本的上下文,您只需调整 markdown 模式的字体锁定规则就可以非常接近您需要的内容。
除了pretty-lambda(已经被多次建议过)之外,您还可以研究org-mode及其语法高亮规则。特别是,
org-hide-emphasis-markers
变量或多或少可以实现您想要的功能(例如,请参阅 org-do-emphasis-faces 如何隐藏标记字符)。
由于我不知道任何基于 emacs 的 Markdown 解析器,我不得不说你必须从头开始编写一个。也许thisSO问题可以给你一些提示。
如果您选择只使用 Emacs,那么 Semantic 是适合这项工作的优秀 API(它为您提供了词法分析器、解析器生成器和解析器;它已经存在了十多年了,而且它已经文档!)。拥有语言解析器后,您必须为每种标记类型创建一些渲染函数。这样你就可以定制一切。
虽然这将是一次启发性的旅程,但当然,我仍然选择在单独的后台进程上使用现有的 Markdown->html 转换器,然后使用 w3(m) 进行 emacs 预览(正如 Bozhidar 建议的那样)。它可以完成工作,而且做起来要简单得多。也没有重大的性能问题 - 您应该很少运行这个工具,这样您就可以轻松地节省一些额外的毫秒)。
一个混合的解决方案是让 Markdown 解析器直接生成 HTML,并在 w3(m) 缓冲区上预览它(它减轻了你肩上的渲染负担,你只需要将 markdown 音译为 html,这看起来很漂亮直接使用语义)。
如果只是关于渲染,请按照 Bozhidar 的建议进行 Markdown 到 HTML 的转换,然后在 W3 缓冲区中显示 HTML。 markdown-mode 具有调用外部 Markdown 命令的代码以及一些好处。
但是如果你真的想在 Emacs Lisp 中完成所有事情,你必须先编写一个 Markdown 解析器。
我也是,我一直在寻找这样的东西非常很长一段时间。不过,我能找到的最好的不是 Emacs 解决方案,它是一个独立的伟大软件,名为 ReText。