在Emacs缓冲区中渲染Markdown

时间:2010-08-04 20:19:14

标签: emacs elisp markdown

是否可以使用Emacs自己的缓冲区文本格式化功能在Emacs缓冲区中呈现Markdown?图形环境中的Emacs具有丰富的文本显示功能(字体样式,颜色,链接甚至图像),因此它应该是非常可能的。有没有现有的实施?

请注意,我们的想法是让呈现的Markdown成为本机Emacs格式的文本,可以像在Emacs中的任何其他文本一样进行导航和操作。因此,这里不需要渲染到嵌入在Emacs缓冲区中的图像的解决方案。

另请注意,不是关于编辑 Markdown的模式,而是用于在Emacs缓冲区中呈现渲染的Markdown。它应该最好是一个纯粹的Emacs Lisp解决方案,以便于移植。

8 个答案:

答案 0 :(得分:20)

Personnaly,我使​​用以下工作流程:

  • C-c C-c m上运行以在当前缓冲区上运行Markdown并在另一个缓冲区中预览输出。
  • 在此其他缓冲区(html-mode
  • 上移至M-x html-mode
  • 隐藏html标记以显示接近输出的内容(M-x sgml-tags-invisible

然后,每次要刷新渲染时,只需在降价缓冲区上再次运行C-c C-c m

然而我承认直到现在为Markdown编辑/预览,没有什么比我Textmate及其降价预览面板更好。实际上,从个人的角度来看,我喜欢运行Textmate而不是Emacs的唯一情况是我想要编辑markdown文件。然而,在emacs上具有相同的预览质量的路径并不是那么困难,我可能应该对其进行调查。正如我所看到的,它只是:

  • 获取Textmate用于渲染预览的内部css
  • 使用w3或w3m使用此css预览降价输出

答案 1 :(得分:6)

我猜您可以使用latex-preview的源代码获取灵感,或使用pretty-lambda(更简单的软件)。

或者,您可以在后台进程中将markdown转换为html并预览html。

在Emacs中一切皆有可能,但并非一切都很容易实现: - )

答案 2 :(得分:6)

我的.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-mode本身将斜体显示已加星标的文本和粗体双色标题文本,因此这将使您获得。但是,它不会使控制字符不可见。

如果你想这样,你应该查看pretty-lambda的例子(如Bozhidar Batsov suggested

答案 3 :(得分:5)

根据您想要查看渲染文本的上下文,只需调整markdown-mode的字体锁定规则,您就可以非常接近所需的内容。

答案 4 :(得分:4)

除了pretty-lambda(已经多次建议)之外,您可以查看org-mode及其语法高亮规则。特别是,org-hide-emphasis-markers变量或多或少地执行您想要的操作(请参阅例如org-do-emphasis-faces隐藏标记字符的方式)。

答案 5 :(得分:3)

由于我不知道任何基于emacs的Markdown解析器,我不得不说你必须从头开始编写代码。也许this这个问题可以给你一些指示。

如果您选择通过仅限Emacs的道路,那么Semantic是该作业的优秀API(它为您提供词法分析器,解析器生成器和解析器;它已经存在了十多年,它有文档!)。拥有语言分析器后,您必须为每个标记类型创建一些渲染函数。这样你就可以自定义一切。

虽然这将是一次具有启发性的旅行,当然,我仍然会选择在单独的后台进程中使用现有的Markdown-> html转换器,然后使用w3(m)进行emacs预览(如Bozhidar建议的那样)。它完成了工作,而且更简单。没有重大的性能问题 - 你应该很少运行这个工具,这样你就可以轻松地节省一些额外的毫秒数。)

混合解决方案是让Markdown解析器直接生成HTML,并在w3(m)缓冲区上预览它(它会从你的肩膀上消除渲染权重,你只需将markdown音译成html,那就是用语义看起来非常简单。

答案 6 :(得分:1)

如果只是渲染,请按照Bozhidar的建议进行Markdown to HTML转换,然后在W3缓冲区中显示HTML。 markdown-mode有一些代码可以通过一些好东西来调用外部Markdown命令。

但如果你真的想在Emacs Lisp中做所有事情,你必须先写一个Markdown解析器。

答案 7 :(得分:0)

我也是,我一直在寻找类似的东西非常很长一段时间。然而,我能找到的最好的不是Emacs解决方案,它是一个独立的伟大软件,名为ReText