在 Emacs 缓冲区中渲染 Markdown

问题描述 投票:0回答:9

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

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

另请注意,这不是编辑模式 Markdown,而是在 Emacs 缓冲区中呈现渲染的 Markdown。为了可移植性,它最好是一个纯 Emacs Lisp 解决方案。

emacs elisp markdown
9个回答
22
投票

就个人而言,我使用以下工作流程:

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

然后每次想要刷新渲染时,只需在 Markdown 缓冲区上再次运行

C-c C-c m
即可。

但我承认到目前为止,对于 Markdown 编辑/预览来说,没有什么比 Textmate 及其 Markdown 预览面板更好的了。实际上,从个人角度来看,我唯一喜欢运行 Textmate 而不是 Emacs 的情况是当我想编辑 Markdown 文件时。然而,在 emacs 上获得相同质量的预览并不是那么困难,也许我应该研究一下。在我看来,这很简单:

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

7
投票

我想你可以使用 latex-preview 的源代码来获得灵感或使用 pretty-lambda(一个更简单的软件)。

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

在 Emacs 中一切皆有可能,但并非一切都能轻松实现:-)


7
投票

我的 .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 建议


5
投票

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


4
投票

除了pretty-lambda(已经被多次建议过)之外,您还可以研究org-mode及其语法高亮规则。特别是,

org-hide-emphasis-markers
变量或多或少可以实现您想要的功能(例如,请参阅 org-do-emphasis-faces 如何隐藏标记字符)。


3
投票

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

如果您选择只使用 Emacs,那么 Semantic 是适合这项工作的优秀 API(它为您提供了词法分析器、解析器生成器和解析器;它已经存在了十多年了,而且它已经文档!)。拥有语言解析器后,您必须为每种标记类型创建一些渲染函数。这样你就可以定制一切。

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

一个混合的解决方案是让 Markdown 解析器直接生成 HTML,并在 w3(m) 缓冲区上预览它(它减轻了你肩上的渲染负担,你只需要将 markdown 音译为 html,这看起来很漂亮直接使用语义)。


1
投票

如果只是关于渲染,请按照 Bozhidar 的建议进行 Markdown 到 HTML 的转换,然后在 W3 缓冲区中显示 HTML。 markdown-mode 具有调用外部 Markdown 命令的代码以及一些好处。

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


0
投票

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


0
投票

我刚刚发现 markdown-mode 有一个叫做

markdown-view-mode
自 2.4 的东西。听起来这可能就是您正在寻找的!

© www.soinside.com 2019 - 2024. All rights reserved.