有没有一种方法可以从外部文件将代码导入到Babel源代码块中?

3
我特别感兴趣的是文学编程,其中文档和源代码在一个文件中。Org-Mode 支持 Babel 的嵌入源代码块的功能。一个缺点是语法高亮不起作用,并且当块在 Org-Mode 中时,无法利用完整的语言模式功能。
Babel 支持“tangling”源代码,将源代码复制到命名文件中,例如 test.py。我正在寻找一种解决方案,可以让我在完整功能的语言模式下开发源代码,同时能够使用 org mode 记录该代码的说明“为什么要这样做”。

1
在代码块中,输入C-c '以使用其原生模式进行编辑。此外,在初始化文件中使用(setq org-src-fontify-natively t),以便对代码块进行语法高亮显示。 - John Kitchin
另外,考虑使用lentic包:https://github.com/phillord/lentic,它允许您在org-mode和程序模式之间来回切换视图。 - John Kitchin
Lentic似乎是一个很好的解决方案,可以实现两全其美。我会进行一些测试,看它是否能处理多个org文件(也许作为顶部的包含文件,根据语言而定)。 - Teddy Nguyen
我已经安装了Lentic,但它似乎存在一些稳定性问题。在编辑Python源代码时,它偶尔会将源文件与Python注释混淆。 - Teddy Nguyen
我怀疑任何允许两个源文件之间出现“分裂大脑”情况的方法都可能存在稳定性问题。这就是为什么Git有时需要在合并之前进行手动操作的原因。 - ben rudgers
1个回答

2
在源代码块的 <body> 中。
 #+NAME: <name>
 #+BEGIN_SRC <language> <switches> <header arguments>
   <body>
 #+END_SRC

C-c '会打开一个适合<language>的主要模式(buffer)。这里Babel文档。


是的,C-c '会打开一个带有适当主模式的缓冲区,但它不允许您将代码导入到org文件中(主要是为了对外部文件进行所有更改,并将更新的更改导入到org模式文件中)。 - Teddy Nguyen
@TeddyNguyen 当然,可以将文件#+INCLUDE到org文件中,并在导出的文档中显示。我怀疑org-mode Babel不支持您寻找的工作流程的原因是因为没有单一的真相点:tangle写入外部文件,而外部文件将写回代码块。如果存在冲突,哪个是正确的?从CAP术语来看,系统是CP。无论如何,以数据和持久性为基础可能会更有帮助,而不是以文件为基础。如果您想要外部文件成为规范,则始终可以使用#+INCLUDE - ben rudgers
@TeddyNguyen Emacs的insert-file函数会在光标位置插入一个文件。由于你是唯一的用户,而且你的org-mode缓冲区是唯一的真实数据来源,所以CAP(一致性、可用性和分区容忍性)在这里不是问题。如果你使用的是一个带有工具链的语言,该工具链最初通过代码生成来创建源文件的存根,并且你想将这些存根插入到你的literate org-mode缓冲区中的源代码块中,以便通过noweb进一步开发它们,那么这种方法是可行的。如果工具链在最初创建存根后,在某个以后的日期修改了源文件,那么这里就会出现问题。 - ninegrid

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