Unofficial Markdown embed、小語法、大影響

Posted by 每特17劃 on 2024-10-11

Unofficial Markdown embed、小語法、大影響

幾日前(2024-09-30),我意外在論壇上發現 Obsidian 支援一個小語法:

![some_note](some_note.md#section_name)

其作用是,將 some_note.md 的指定 section_name 段落,embed 到眼前的 Markdown 文件裡直接顯示。

這個 embed 的需求不是什麼新概念,從最早的 HTML 的 iframeembed 到後來 Jekyll 的 include ,都有類似的用法。

但 Obsidian 所支援的這語法,方便而直覺,因為跟原本 embed 圖檔、PDF的語法相近,例如:

![some_picture](some_picture.jpg)
![some_document](some_document.pdf)

而其後的 # 後綴,也跟 URL 的標準用法一致,例如:

https://url.spec.whatwg.org/#dom-url-hash

(註:上述直接指向目標網頁的 “dom-url-hash” 的段落)

可說是最接近自然預期的理想語法了。

筆記需求

那,這有什麼影響?

以近日看到 Fourdollars 於 TOSSUG 的臉書分享了一篇文章 🤫 Unlocking secret ThinkPad functionality for emulating USB devices | Andrey Konovalov 為例。

若我想整理心得到筆記裡的話,要編輯到的地方可能有好幾處:

  • Fourdollars, 李世元, Shih-Yuan Lee.md
    • 此處留個標記。因為日後可能會以:“…印象中 Fourdollars 好像曾分享過一篇文章…”像這樣的方式回憶起來。
  • Andrey Konovalov.md
    • 於原作者的條目下,記錄主要內容。
  • ACPI.md
    • 標記用到 acpixtract, iasl 的實際案例。
  • FT2232H.md
    • 提到用 flashrom 跟 FT2232H 刷 Flash 記憶體的方式。
  • SPI.md
    • 提到刷主機板上 SPI 晶片 的問題。
  • USB.md
    • 關聯到 USB OTG, USB Raw Gadget 的知識。
  • ThinkPad.md
    • 文中 提到 ThinkPad X1 Carbon 機型。
  • XPS 13.md
    • 文尾提到 XPS 13 也能開啟同樣功能。

算起來至少有 8 個地方。

那麼,該怎麼編輯?

複本法

若採“複本法”,即在一處寫下來,然後複製到其他 7 處。

雖能留下內容,但會遇到困境如下:

  • 有 8 處重複的文本內容
  • 若其中一處修改,必須同步更新其他 7 處
  • 若無法同步更新,則會產生資料不一致,而折損對資料的信任感

連結法

若採“連結法”,即在一處寫下來,再以 URL 捷徑、內部連結、等傳送門機制,轉連接到其他 7 處。

此法雖能避免重複內容,但缺點也很明顯。就是只看 URL 跟連結,不易回想起相關的心得內容 ,以致於搜尋瀏覽時,容易跳過。而若要一一點擊進去看,則效率低落,而且容易分神。

分拆法

而介於“複本法”與“連結法”的之一作法,是將心得的內文依主題分拆,而分別存放到對應的筆記條目去。例如,分拆部分內容,而記到 ACPI 、 USB、 等等的條目下,再附連結回原始心得文本。

這樣作雖可避開內容重複的問題,卻無可避免的造成筆記內容的支離破碎,而不易吸收跟重用。更要命的是,要分拆、分類、編修多處文件,才能記好一份心得。這成本太高,難以持續。

Embed 法

綜上所述, embed 法,也就是最開頭提到的功能,其實就是(就我所知的)最好的解答。

一行簡單的語法就能重複引用並顯示到多個地方,同時變更編輯只在原始條目一處,從根本上就滿足資料的一致性。

案例: TODO 用法

每個專案有各自的 TODO list , 自己也有個人的總 TODO list 清單,該如何組織?

假設個人總清單為 TODO.md ,並有其他專案 Project01.md, Project02.md,例舉測試內容如下:

  • TODO.md:

    ## My TODOs
    
    - [ ] task01
    - [ ] task02
    - [x] task03
    
    
    ## Project01
    
    ![Project01](Project01.md#TODO)
    
    
    ## Project02
    
    ![Project02](Project02.md#TODO)
    
  • Project01.md:

    ## TODO
    
    - [x] task01
    - [ ] task02
    - [ ] task03
    
    ## Notes
    
    ... blahblah ...
    
  • Project02:

    ## TODO
    
    - [ ] task01
    - [x] task02
    - [ ] task03
    
    ## Notes
    
    ... blahblah ...
    

在 Obsidian 下, TODO.md 總清單的瀏覽效果如下:

Pasted image 20241011201953.png

如此安排的好處如下:

  • 在個人 TODO.md 總清單,可一處集成顯示所有他處的 TODO list
    • 方便每日例行檢視,而不用再一一點開每個子項目
  • 各個專案的文件專注顯示並維護自己局部的 TODO list
  • 在 embed 的框頁面 裡,不能直接編輯內容。而是,注意到右邊有個連接圖示,點入進到對應的頁面再編輯。
  • 另外,我意外發現,在 embed 的框頁面裡,checkbox 是可以直接 toggle 更新的。

小語法、大影響

從上述的討論可以瞭解到,此一 Embed 的語法,不僅僅只是方便顯示的功能而已,而是會聯動到知識內容的整體組織方法。

改變有多大,還不曉得。因為發現這才幾天的時間,目前還在摸索適應的重構中。

但至少最明顯的差異之一是,不用再糾結於某個段落要放分類 A ,還是放分類 B 。在新方法下,可以不用作選擇,直接全都要。