讓Gemini CLI幫忙統整筆記
使用像 Obsidian 的系統管理筆記的過程中,保持筆記的組織性,對像我這種視覺型學習者來說,是個很重要但卻困難的一個步驟,我需要在腦袋裡「開圖」,日後才能比較順利的回想,不然基本上是看過即忘。
在Obsidian中一種常見且有效的方法是建立內容地圖(Maps of Content, MOCs)作為特定主題的索引。但是要在每次有新筆記的時候,就同步更新MOC實在很困難,很常覺得自己有寫下來了好棒棒,但只是淪為知識搬運工。這幾天借助 Gemini CLI 的能力,從現有筆記中自動建立不同 MOCs 總覽列表。
挑戰:手動創建 MOC 繁瑣
我的筆記散落在不同資料夾中,每個資料夾專注於特定主題 (至少一開始是),例如 命令列
、HTML 與 DOM 元素
或 JavaScript 效能
。手動建立和更新這些主題的 MOCs 既耗時又容易出錯,也時常遇到根本來不及整理的情況。
因此希望用以下方式達成自動化的目的:
- 依據筆記的資料夾位置或Obsidian Properties辨認相關筆記。
- 參考一個現有的MOC檔案格式,產生新的 MOC 檔案。
- 在 MOC 中填入相關筆記的連結,並進行分類。
解決方案:與 Gemini CLI 的協作流程
建立一個利用 Gemini CLI 功能的流程,讓它能夠讀取檔案、理解內容並根據模板生成新檔案
1. 指定 MOC 模板
找到或建立一個 MOC 的模板。把該模板儲存在 gemini.md
檔案中,內容結構包括:
- 標題:MOC 的主要標題。
- 子項目:用於分組相關筆記的主題區塊。
- 連結格式:使用
[[wiki連結]]
格式,便於在 Obsidian 中連結到相關筆記。 - Dataview 查詢:在結尾加上一個
dataview
查詢,動態列出與主題相關的所有筆記。
2. 生成過程
有了模板後,針對特定主題生成 MOC 的過程變得簡單:
- 指定來源:告知 Gemini CLI 使用哪些筆記作為來源。可以是某個資料夾(例如
/命令列/
)或符合條件的檔案(例如topic: frontend/performance
)。 - 指定目標:提供目的檔路徑(例如
/MOC/202505071648 \&命令列.md
)。 - Gemini 讀取與分析:CLI 會讀取所有指定的來源筆記,分析內容和metadata。
- Gemini 生成 MOC:根據分析結果,CLI 依據模板,產生新的MOC檔案
3. 處理更新與特殊情況
過程中有些小小意外事件,例如:
- 明確告知新內容要附加到現有MOC檔案:需要往下新增內容,而不是不覆蓋現有檔案的話,要記得寫在說明裡,不然預設會直接覆蓋原本的內容 QQ。例如在
gemini.md
的說明加上: “最後,請將統整後的內容,以附加(而不是取代)的方式,寫入指定的現有檔案中”。 - dataview錯誤:若
dataview
查詢輸出不符預期時,用持續提問的方式引導Gemini CLI 找語法錯誤並修正,或是如果一眼就能看出來的就自己修掉
結論
透過 Gemini CLI 統整筆記的任務還算順利,自動化了一個原本繁瑣又容易出錯的手動任務,這次發現利用大型語言模型作為知識管理任務的互動助手也很不錯
╭────────────────────────────────────╮
│ │
│ Agent powering down. Goodbye! │
│ │
│ │
│ Cumulative Stats (12 Turns) │
│ │
│ Input Tokens 1,980,421 │
│ Output Tokens 12,719 │
│ Thoughts Tokens 11,317 │
│ ──────────────────────────────── │
│ Total Tokens 2,004,457 │
│ │
│ Total duration (API) 5m 16s │
│ Total duration (wall) 1h 36m 3s │
│ │
╰────────────────────────────────────╯
範例
請參考我提供的 MOC 檔案格式和寫作風格,來統整我的筆記。
範例MOC在本檔案中的 "###Example MOC"
請你參考範例的結構、標題層級、連結格式(使用 `[[筆記名稱]]`),以及每個項目後簡短的摘要說明
根據不同的資料來源,找到對應的指示 (Approach 1、Approach 2、etc)。
## Approach 1 - Files from Directory
請你統整我 `/HTML \& DOM Elements/` 這個資料夾,以及底下所有子資料夾的 Markdown 筆記(檔案名稱為 `*.md`),根據它們的內容關聯性,整理出一個類似的 MOC 結構
最後,將統整後的內容,以append的方式 (而不是取代),寫入一個現有的檔案中: `/MOC/ &HTML and DOM Elements` 。
來源資料夾: `/HTML \& DOM Elements/`
目的地檔案: `/MOC/ \&HTML and DOM Elements`
## Approach 2 - Files from Topic Field
請你統整我資料夾,以及底下所有子資料夾中:
- "type" field 為 "note"
- "topic" field starts with "frontend/performance"
符合以下條件的 Markdown 筆記(附檔名為 md),根據它們的內容關聯性,整理出一個類似的 MOC 結構。
最後,請將統整後的內容,以append的方式 (而不是取代),寫入一個現有的檔案中: `/MOC/ \&JavaScript Performance` 。
來源: type" field is "note" and "topic" field starts with "frontend/performance"
目的地檔案: /MOC/ \&JavaScript Performance
來源資料夾: /DOM\ Events/
目的地檔案: /MOC/\ \&DOM\ Events.md
# 📌 DOM Events 總整理
JavaScript 操作 DOM 的核心能力之一就是「事件監聽」,以下是常見的分類、事件流邏輯與應用情境整理。
---
## 🧭 事件處理的基本流程
- [[DOM]]:什麼是 DOM?何時可操作?
- [[document\.ready]] vs [[window\.onload]]:
- 哪個觸發得比較早?
- addEventListener 基本語法
---
## 📦 事件對象與常見屬性
| 主題 | 筆記連結 |
|------------------------------|-----------------------------------|
| 事件來源與目標 | [[e\.target vs e\.currnetTarget]] |
| 滑鼠座標資訊 | [[Mouse event - offsetX]], [[e.pageX 和 e.pageY]] |
| 鍵盤與修飾鍵資訊 | [[e.target.key]], [[shiftKey event]] |
---
## 🔁 事件流與控制
- [[Event Capture \& Bubble]]:事件捕獲與冒泡機制
- [[Event Propagation 事件傳遞]]:事件如何從父到子再傳回
- [[stopPropagation vs stopImmediatePropagation]]:中止事件傳遞的差異
---
## 🎯 事件代理
- [[Event Delegation 事件代理]]:用冒泡機制節省資源與處理動態內容
- 搭配案例:點擊 todo list 刪除按鈕時,如何只掛一個監聽器?
---
## 🖱 滑鼠與觸控事件
| 類型 | 筆記 |
|--------|------------------------------|
| 滑鼠事件 | [[mouseout vs mouseleave]], [[Mouse event - offsetX]] |
| 觸控事件 | [[Touch events]] |
---
## ⌨️ 鍵盤事件
- [[keyup and keydown]]
- [[e\.target\.key]]
- [[shiftKey event]]
📌 可額外加:`keypress` 何時已廢棄?與 `keydown/keyup` 比較。
---
## 🔤 表單與輸入事件
- [[Input event]]
- [[Input vs Change]]
📌 建議補充:常見 input 欄位的事件觸發差異圖。
---
## 📼 媒體與動畫事件
| 類型 | 筆記 |
|--------|----------------------------------|
| 動畫 | [[transitionend]] |
| 媒體播放 | [[play and ended]] |
---
## 🚀 效能與事件頻率控制
- [[Throttle使用情境]]:如何限制高頻觸發事件如 `scroll`, `input`, `resize` 等
- 可額外補:`debounce` vs `throttle` 差異
---
## 🧩 索引
```text
table topic, tags, file.path
where contains(topic, "web-apis/browser-events")
and (contains(file.path, "Notes") or contains(file.path, "DOM Event") or contains(file.path, "Browser"))