在Emacs缓冲区中渲染Markdown

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

请注意,这个想法是让渲染的Markdown成为本地Emacs格式的文本,可以像Emacs中的其他文本一样进行导航和操作。 因此,渲染到embedded到Emacs缓冲区中的图像的解决scheme在这里是不可取的。

另外请注意,这不是关于编辑 Markdown 的模式 ,而是为了在Emacs缓冲区中呈现Markdown。 它应该最好是一个纯粹的Emacs Lisp解决scheme的可移植性。

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

  • Cc Cc m上运行以在当前缓冲区上运行Markdown并在另一个缓冲区中预览输出。
  • 移动到这个其他缓冲区的Mx html-modeMx html-mode
  • 隐藏html标签以显示接近输出的内容( Mx sgml-tags-invisible

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

然而,我承认Markdown编辑/预览,没有什么比我Textmate和它的降价预览面板。 实际上,从个人的angular度来看,我唯一喜欢运行Textmate而不是Emacs的情况是当我想编辑降价文件的时候。 然而,在emacs上预览效果相同的path并不那么困难,可能我应该调查一下。 正如我所看到的,它只是:

  • 获取Textmate用于呈现预览的内部CSS
  • 使用w3或w3m预览降价输出使用这个CSS

我想你可以使用latex-preview的源代码来获取灵感或漂亮的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模式本身会将加星标的文字和粗体文字斜体显示出来,所以这会让你在那里。 但是,它不会使控制字符不可见。

如果你想这样做,你应该看看漂亮的lambda例子(如Bozhidar Batsovbuild议 )

根据您希望看到渲染文本的上下文,您可以通过调整降价模式的字体locking规则来获得所需的内容。

除了漂亮的lambda (已经提出多次),你可以看看org模式及其语法高亮规则。 特别是, org-hide-emphasis-markersvariables或多或less地做了你想要的东西(例如参见org-do-emphasis-faces如何隐藏标记字符)。

因为我不知道任何基于emacs的Markdownparsing器,我不得不说,你必须从头开始编写一个。 也许这个问题可以给你一些指点。

如果您select仅通过Emacs的道路,那么Semantic就是一个非常好的API(它为您提供了一个词法分析器,parsing器生成器和parsing器;它已经存在了十多年了,并且有文档!) 。 拥有语言parsing器之后,您必须为每个标记types制作一些渲染函数。 这样你可以自定义一切。

虽然这将是一个启发性的旅程,当然,我仍然select使用一个单独的后台进程现有的Markdown-> html转换器,然后使用w3(m)进行emacs预览(如Bozhidarbuild议)。 它完成了工作,而且要简单得多。 没有主要的性能问题,你也不应该使用这个工具,所以你可以轻松的多花一些时间)。

混合的解决scheme是让Markdownparsing器直接生成HTML,并在w3(m)缓冲区上预览它(它从您的肩膀拿走渲染重量,您只需要将markdown转换为html,而且看起来非常直转发与语义)。

如果只是关于渲染,请使用Bozhidar的build议,对HTML进行Markdown转换,然后在W3缓冲区中显示HTML。 markdown-mode有一些代码可以调用外部的Markdown命令和一些好东西。

但是如果你真的想在Emacs Lisp中做所有事情,那么你必须先编写一个Markdownparsing器。

我也是,我一直在寻找这样一个长的时间。 尽pipe我能find的最好的不是Emacs解决scheme,但它是一个独立的伟大软件ReText 。