讓Gemini CLI幫忙統整筆記

使用像 Obsidian 的系統管理筆記的過程中,保持筆記的組織性,對像我這種視覺型學習者來說,是個很重要但卻困難的一個步驟,我需要在腦袋裡「開圖」,日後才能比較順利的回想,不然基本上是看過即忘。

在Obsidian中一種常見且有效的方法是建立內容地圖(Maps of Content, MOCs)作為特定主題的索引。但是要在每次有新筆記的時候,就同步更新MOC實在很困難,很常覺得自己有寫下來了好棒棒,但只是淪為知識搬運工。這幾天借助 Gemini CLI 的能力,從現有筆記中自動建立不同 MOCs 總覽列表。

挑戰:手動創建 MOC 繁瑣

我的筆記散落在不同資料夾中,每個資料夾專注於特定主題 (至少一開始是),例如 命令列HTML 與 DOM 元素JavaScript 效能。手動建立和更新這些主題的 MOCs 既耗時又容易出錯,也時常遇到根本來不及整理的情況。

因此希望用以下方式達成自動化的目的:

  1. 依據筆記的資料夾位置或Obsidian Properties辨認相關筆記。
  2. 參考一個現有的MOC檔案格式,產生新的 MOC 檔案。
  3. 在 MOC 中填入相關筆記的連結,並進行分類。

解決方案:與 Gemini CLI 的協作流程

建立一個利用 Gemini CLI 功能的流程,讓它能夠讀取檔案、理解內容並根據模板生成新檔案

1. 指定 MOC 模板

找到或建立一個 MOC 的模板。把該模板儲存在 gemini.md 檔案中,內容結構包括:

  • 標題:MOC 的主要標題。
  • 子項目:用於分組相關筆記的主題區塊。
  • 連結格式:使用 [[wiki連結]] 格式,便於在 Obsidian 中連結到相關筆記。
  • Dataview 查詢:在結尾加上一個 dataview 查詢,動態列出與主題相關的所有筆記。

2. 生成過程

有了模板後,針對特定主題生成 MOC 的過程變得簡單:

  1. 指定來源:告知 Gemini CLI 使用哪些筆記作為來源。可以是某個資料夾(例如 /命令列/)或符合條件的檔案(例如 topic: frontend/performance)。
  2. 指定目標:提供目的檔路徑(例如 /MOC/202505071648 \&命令列.md)。
  3. Gemini 讀取與分析:CLI 會讀取所有指定的來源筆記,分析內容和metadata。
  4. 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"))