Emacs Org-Mode 和 Literate Haskell

9

在 org-mode 中,以冒号开头的行会被格式化为源代码。( http://orgmode.org/manual/Literal-examples.html )

在 literate Haskell 中,源代码行以大于号开头。

我想使用我当前首选的格式:org-mode markdown 来编写 literate Haskell。

由于我假设无法更改 Haskell 编译器,我的问题是:

我是否可以在 org-mode 中将大于号作为代码行标记?(我尝试自己找到它,但由于 org.el 是一个 865k 文件,22k loc,我仍然感到迷茫。)

4个回答

7
并不是你问题的确切答案,但我可以举个例子来说明我如何使用org编写易读的Haskell代码:https://github.com/haroldcarr/make-mp3-copies README.org是易读的Haskell代码,MakeMP3Copies.hs是从.org文件中“提取”出来的Haskell代码。
我将其导出为HTML并发布在我的博客上:http://haroldcarr.com/posts/2013-09-11-flac-to-mp3-via-haskell-shelly-and-ffmpeg.html README.org也会自动在GitHub上渲染(虽然有一些只适用于HTML的内容我还没有修复)。

这似乎是预期的方式,而不是我要求的那种hack :-) - Falko

5
我本来的动机和您一样,希望使用 org-mode 标记语言来编写我的 Haskell(Bird 风格)文学编程。最终我使用了 multi-mode,它允许在同一缓冲区中使用多个 emacs 主模式来处理不同区域(虽然有其他选项,但 multi-mode 更符合我的要求)。我开发了haskell-org,它可以通过 multi-mode 在单个缓冲区中同时启用 org-mode 和 haskell-mode。
更多细节请参考这篇博客文章。这种设置足够好,以至于我在 Haskell 编码时都使用它。

3

我有点晚了,但最近开始着手于99个Haskell问题,并决定将我的工作收集在org模式文件中。

据我了解,orgmode的文学化编程方式是将源代码块封装在BEGIN/END块中。例如,

#+BEGIN_SRC hs :tangle yes
myReverse :: [a] -> [a]
myReverse l = myReverse' l []
myReverse' [] accu = accu
myReverse' (x:xs) accu = myReverse' xs (x:accu)
#+END_SRC

这样结构化的orgmode文档可以进行以下操作:

  • 导出 导出是通过后端将orgmode文件转换为多种其他文件格式的过程。其中一些格式包括PDF、LateX或HTML。

  • 提取 这是向可读性编程和“编织”方向发展的。代码块可以被导出为纯源文件,这就是我在99个问题文件中所做的。

  • 执行 源代码块可以被执行,并且执行结果可以直接放置在orgmode文件中。我还没有尝试过Haskell的这种方法。

您可以在我的GitHub页面上查看我的尝试: https://github.com/dischoen/H99 在那里,我将orgmode文件提取到两个Haskell文件中,一个模块和一个测试工具,然后可以在ghc或ghci中进行测试。


0

显然,这不是使用org的预期方式。

在这样做时的主要问题是,org-mode和haskell-mode都是主要模式。因此,我无法并行使用它们。

尽管如此,这就是它的工作原理,这是一种hack方法,我不确定是否会产生副作用..:

在emacs中查看文件时,(a?)代码触发器似乎在org-activate-code(org.el)中,但这不用于导出。对于HTML导出,我还必须修改org-html.el。

我改变了:

在org.el的第5378行,从函数org-activate-code

"^[ \t]*\\(:\\(?: .*\\|$\\)\n?\\)"

"^[ \t]*\\([:>]\\(?: .*\\|$\\)\n?\\)"

在org-html.el的第1508行和1516行,函数org-export-as-html从中返回。
(string-match "^[ \t]*:\\(\\([ \t]\\|$\\)\\(.*\\)\\)" line)

(string-match "^[ \t]*[:>]\\(\\([ \t]\\|$\\)\\(.*\\)\\)" line)

并且(第1516行)

(string-match "^[ \t]*[:>]\\(\\([ \t]\\|$\\)\\(.*\\)\\)"

看起来我认为这必须适应每个打算使用的出口渠道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接