Emacs 代碼块导出复用

在寫博客時,有時我需要顯示代碼,同時把代碼导出成 HTML,放在頁面裡用。例如在 一些關於連結的建議::進階樣式 裡,我要介紹外部連結的樣式,同時要將樣式應用在頁面上,原來我會這麼做:

一份用於顯示代碼 (#+begin_src css):

#+begin_src css
  a[href^='http']:not([href^='http://taxodium.ink']):not([href^='https://taxodium.ink']) {
    &::after {
      /* 省略 */
    }
  }
#+end_src

然後複製相同的內容,把它导出 (#+begin_export html):

#+begin_export html

但修改時就要改兩個地方,煩得很。那有沒有辦法可以复用代碼呢?當然是有的。

在 Org Mode 裡可以利用 noweb 去引用代碼块,給被引用的代碼块一個名字 (#+name: some-name),在引用的代碼块上設置 :noweb yes ,就可以用 <> 就引用代碼块了。

於是上面的重复代碼就可以變成這樣:

1.定義被引用的代碼块并命名

#+name: css-external-link
#+begin_src css
  a[href^='http']:not([href^='http://taxodium.ink']):not([href^='https://taxodium.ink']) {
    &::after {
      /* 省略 */
    }
  }
#+end_src

2.在另一個代碼块上引用

#+begin_src shell :noweb yes :exports results :results output html
  cat <<'CSS_EOF'
  
  CSS_EOF
#+end_src

在代碼块上開啟 noweb,即 :noweb yes ,然後就可以用 <> 引用名字為 css-external-link 的代碼块。由於最終希望將代碼导出成 HTML 嵌在頁面中,需要設置 :exports results ,這樣代碼的 执行結果 才會导出到頁面裡。而 :results output html ,其中 output 指定代碼以脚本運行,并把標準輸出作為結果返回;html 會把結果用 BEGIN_EXPORT html 包裹。

最終就會變成這樣:

#+begin_export html

這樣就不用寫重复代碼啦 (ノ>ω<)ノ

脚注:

org#Exporting Code Blocks

org#Results of Evaluation


感谢你的阅读!

欢迎 邮件 跟我分享你的想法 :)

你也可以 我的博客,保持更新 :P

祝好,素未某面的读者。

純文本版本 原始 org 文件

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论