【分享】org 代码块中 switches 参数的使用

最近在用 ox-publish 手搓博客的过程中了解到了许多以前不怎么用的 org-mode 特性,比如说代码块中的 switches 参数。在论坛上翻了翻发现几乎没有人提过,因此来分享一下。

由于 switches 参数的最大作用是导出时提供更精细的控制,所以我认为最好的展示效果是用其写一篇文章,然后分享其导出效果。

下面是文章链接, 以分析函数 org-element-src-block-parser 为例,简要介绍了 Org-mode 代码块中 switches 的作用和用法。

https://elilif.github.io/articles/2024-03-01-org-babel-switches.html

10 个赞

楼主的博客主题非常漂亮,能否分享下如何搭建的吗?

1 个赞

博客是通过 ox-publish 搭建的,目前还没有完工,这部分具体可以看 百般武艺,此乃 Emacs (一):用 Emacs 写博客

美化部分是自己手搓的 css/js ,具体效果可以看 CSS for Org-exported HTML(WIP)

css/js 代码在仓库:GitHub - Elilif/Elilif.github.io 但是目前代码还比较杂乱,打算后续整理一下写一篇文章总结(欢迎订阅 RSS

2 个赞

博客很简洁, 喜欢 :smiling_face_with_three_hearts:

1 个赞

楼主网站很不错,其中定制 html 导出后端的方式、switch 用法的内容也是我以前不太了解的,感谢分享。

楼主最近做的两件事情–blog 和 Emacs 配置发布我也折腾过,分享一下自己的体会:

我最初也是用 ox-publish 来发布 blog, 用了一年多,随着自己对 blog 的需求更细,慢慢发现了 ox-publish 的一些问题,这里提一下核心的几个点:

  • 用比较原始的字符串拼接来定制 html, 比如 html-preamble-format 等等,一般的 blog 生成器都有专门的模板语言来方便处理,同时还有模板继承之类的能力以创造更多相似但结构又不完全相同的页面,比如 index ,about, category list 页面等
  • 文章 tag/categories 页面不太好生成
  • 对 html 的后处理更容易局限在 elisp 代码中,比如对多个 html 生成统一的目录,或者对所有 html 构建索引从而支持整站搜索,还有楼主文章里提到的生成 rss,有更多 elisp 之外的专门针对 web 开发的工具,一般只需要执行一次命令行即可,但为了照顾到 ox-publish 就需要用 elisp 代码去间接包装一下。

加上其他的一些偏好,最后我自己逐渐写了一个包装 org-export* 的工具来替代 ox-publish 了,详细参见: orgchange: 文学编程式 org 文件静态网页生成器, 类似的处理方式在另一位 emacser 的 blog About 页也提到过,但没有涉及到 jinja 或 org 化的 index,所以我感觉如果真的想用 org 来导出一个"现代"一点的个人网页 ,可能还是会面对一些共同的问题,甚至用相似的处理方法,只不过看用什么语言去统筹 org parser 的结果,重新定制 ox-publish 细节和重新用一个包含更多 web 开发现成工具的语言(比如 python,nodejs)去处理 org-export 导出的 html 文件的代价可能差不多,甚至会更多,因为 elisp 毕竟不是为网页开发设计的,当然这些只是个人的看法。

除此之外,楼主 blog 里还提到自己正在对 emacs 配置做(文学编程式)导出,如果你目前用的是结构化的 emacs.d 目录组织 el 文件来管理配置,可以考虑用 #+include 语法把 el 文件里核心函数加到一个 org 文件里,在 include 前后加上文字说明即可。除非时间足够多,否则没必要重新把配置放到 org 文件再用 noweb 组织并导出,当配置很多时再转成 org 会花不少时间,因为我曾把 i3wm 配置转到 org 里再导出成 blog,才几百行就有一些工作量了,何况 emacs 配置动不动几千行,那可能会是个漫长的过程。

2 个赞

确实,您说的这些缺点我在折腾的时候也或多或少感受到了,我也从网上看到了很多用 org 写博客的方案,要求高一点的基本上都有一套自己的实现,可见相比其他静态网页生成器, ox-publish 还差了很多。但是我目前的需求它能满足 80% ,就先将就一下(

是的,这样做确实很费时间和精力,我的 emacs 配置有一万多行,所以我到现在还没开始(也有可能一直鸽下去)。我目前的想法是把我配置里的一些东西抽出来整理一下,写成一个系列看看效果如何,同时希望能对刚接触 Emacs 的人有所帮助。

1 个赞

嗯,按自己需求来就好,何况文章内容以及 org-export 后端(别的工具很难取代原生的 org parser,包括你提到的对自定义 org对象导出的定制也仍然需要修改导出后端代码) + css/js的定制才是网页核心, 这些基本不会随着 ox-publish 的变化或替换而受到影响。

那这样的话,直接手动拷贝到 src block 或者用 #+include 都可以,也可以用我在 org-imagine: 对 org 对象进行可视化的插件 - #29,来自 twiddling 里提到的 org-imagine 代码提取功能,对 #+include 语法扩展了一点,支持指定函数名提取 el 文件中整个 elisp 函数定义的 s-expression. 比如以下写法执行 org-imagine-view 后提取出对应文件中的 extract-elisp-s-expression 实现,我自己也是用类似方式抽取一些代码片段加上说明并发布成文章的,这样更容易保持 org 和源码的一致性,也可以通过 C-c ‘ 跳转到源码。

  #+IMAGINE: "~/.emacs.d/site-lisp/org-imagine/org-imagine.el::extract-elisp-s-expression"
2 个赞

这点我用 CSS 解决了

Peek 2024-03-09 20-07

1 个赞

这样也是可以的,这种办法相当于用 css 原生处理 html 的功能在前端进行“渲染”,只要在 org-html-template 或者 ox-publish 相关的函数里添加足够多的附加信息抽取功能(获得 org 中额外属性再用 format 形式填到 html 字符串模板中),接着前端的 css 或 js 再提取这些 html 对象生成各种视觉效果或者页面都是可以实现的,比如 js 还能创建路由生成单独的 about.html,categories.html 页面等等。

这里主要是找一个平衡点,有些信息确实是需要修改 org-html* 相关的 elisp 函数来抽取才方便的,抽取完之后还有一个重新分配和二次处理的过程,主要就是对 html 结构树进行修剪、摘取信息然后拼成别的对象(可以是 rss,索引数据库,categories 页面),这可以用 elisp 来做,也可以用前端的 css/js, 我自己是加了一个 python 层,用 python 里比较成熟的修剪、重组 html 树的工具,包括 beautiful soup, jinja2 模板这些来处理,实际和 ox-publish 对等的是这类工具。

1 个赞