• block_level_tag.png
  • 在數位工具的世界裡,有一群「數位工匠」。他們不喜歡被蘋果(Apple)設定好的完美環境餵養,反而熱愛 Linux 那種「隨你折騰」的車庫魂。Logseq 正是這群 Geek 們心中的那台拼裝吉普車。
  • 筆記界的 Linux:為什麼愛 Logseq 的 Geeky 靈魂?

    • 用 Logseq 的人多半帶點技術宅的浪漫。我們喜歡自己設定工作環境,甚至不惜從原始碼開始編譯。與其追求精美的外殼,我們更在意它的開源與自由度,比如更普遍的 Obsidian 不是開源的,隨時可以改變政策不玩,但 Logseq 是純粹開源。
    • Logseq 野心不小,一方面兼容「純檔案系統」吸引大量的 Obsidian 用戶,另一方面兼容 RemNote 風格的「資料庫系統」,性能好過 Obsidian。
    • 但雙系統帶來了致命麻煩。
  • 當「純檔案」遇上「資料庫」:標籤失效的崩潰現場

    • 傳統「頁面思維」,標籤是用來標註整篇檔案的,這顆粒度太大了,想想 19 世紀末盧曼發明卡片盒筆記法(Zettelkasten)時就已經放棄「頁」,而顆粒度小到「卡片」了,21 世紀不能走回頭路啊!
    • 在我們追求的「原子化筆記」結構中,每一段話(Block)都是獨立的知識單元,詳情查看 如果愛因斯坦失憶了:為什麼企業「-AI-知識庫-」要像樂高一樣原子化?
    • 這裡出現了斷層:Logseq 許多功能都綁在「頁面」上。如果改用「區塊」作為「標籤」,無法在視覺上像原生標籤高亮,為什麼呢?因為程式碼看不到它!
      • 當我輸入 ++/tag1 時,以為程式碼可以找到這個標籤,把它高亮?
      • 實際上,我們看到的是 ++/tag1,但程式看到的是一串冰冷的 UUID(例如 ((69844440-b95a-4d45-84e1-0e5cce1a556d))),它找不到標籤!
    • 結果,你的知識庫看起來不像大腦,更像是一堆工程報修單。
  • custom.js 魔法:如何讓冷冰冰的 ID 變身橘色膠囊?

    • uuid_vs_capsules.png
      • 用 Logseq 寫筆記就是為了比純文字好的視覺效果,變成膠囊就清楚多了
    • 這就是 Logseq Geeky 的好處:如果 CSS 找不到路,我們就用 JavaScript 給它地圖,自幹就行了!
    • 我在 Logseq 中加一段程式碼,它的邏輯是:
      1. 掃描開頭是 ++/ 的區塊(「++/」是我的自訂「原子標籤」前綴,你可以換,程式碼記得跟著改),沒規定寫在哪裡,整個 Logseq 中都行。
      2. 抓出區塊 UUID,列成清單。
      3. 告訴系統:只要在清單裡的 ID,通通套用橘色背景、白色文字、圓角膠囊樣式(你也可以自己改喜歡的樣子)。
    • 重啟 Logseq,同意後,奇蹟就發生了——那些令人煩躁的亂碼,瞬間變成了識別度極高的橘色膠囊。
  • 為了愛因斯坦的記憶:知識庫「原子化」是 AI Friendly 的?

    • 在 AI 時代,如果你的知識是「整本書」,AI 很難精準引用;但如果你的知識庫是「一塊塊樂高」,AI 就能隨心所欲地為你重新組裝。
    • AI 可以看到了,但我自己反而看不到了啊!讓標籤「區塊化」後加上視覺化,我也可以一眼辨識出知識屬性。這不只是視覺美化,這是為了讓筆記從「靜態檔案」進化為「活性資料庫」。
    • 現在你要跟任何資料庫整合時,就會覺得好多了!
  • 附錄:

    • 附錄一:Step By Step 照著做

      • 截圖 2026-02-06 下午2.38.33.png
        • 區塊標籤也可以高亮顯示
      • 一、找到正確位置
        • 如果你想試試,但你不是個 Geek,我們一步步說明,按圖索驥即可!
        • 你的 Logseq 會把所有資料儲存在一個檔案夾裡,找到它,通常位置會是 你的Logseq檔案夾/logseq/
        • 如果在這個檔案夾看到自訂版型檔案 custom.css 就對了,你看看是否已經有個 custom.js,通常不會有。
      • 二、加入新檔案
        • 跟它同一層,新增 custom.js,這是讓你寫自己設定的程式。
      • 三、貼入程式碼
        • 這裡需要用純文字的軟體打開 custom.js,比如小作家,貼上下面的程式碼後儲存
          • console.log('[Block Tags] Loading...');
            // 自動為所有 ++/ 開頭的 blocks 添加 tag 樣式
            async function applyAutoTagStyles() {
              console.log('[Block Tags] Applying styles...');
              try {
                // 檢查 API 是否可用
                if (!window.logseq || !window.logseq.api) {
                  console.log('[Block Tags] Logseq API not ready');
                  return;
                }
                // 使用 window.logseq.api 而不是 logseq.DB
                const allBlocks = await window.logseq.api.datascript_query(`
                        [:find ?uuid ?content
                         :where
                         [?b :block/uuid ?uuid]
                         [?b :block/content ?content]]
                      `);
                if (!allBlocks || allBlocks.length === 0) {
                  console.log('[Block Tags] No blocks found');
                  return;
                }
                // 過濾出 ++/ 開頭的 blocks
                const tagBlocks = allBlocks.filter(([uuid, content]) => {
                  return content && typeof content === 'string' && content.trim().startsWith('++/');
                });
                console.log(`[Block Tags] Found ${tagBlocks.length} tag blocks:`, tagBlocks);
                if (tagBlocks.length === 0) {
                  console.log('[Block Tags] No ++/ tags found');
                  return;
                }
                // 生成 CSS
                let css = '';
                tagBlocks.forEach(([uuid, content]) => {
                  const tagName = content.trim();
                  console.log(`[Block Tags] - ${tagName} (${uuid})`);
                  // 樣式: tag 引用(橘色填滿膠囊,白字)
                  css += `
                  .block-ref-wrap.inline:has([blockid="${uuid}"]) {
                    background-color: #ff9800 !important;
                    color: white !important;
                    padding: 4px 14px !important;
                    border-radius: 20px !important;
                    display: inline-block !important;
                    font-weight: normal !important;
                    font-size: 0.7em !important;
                    transition: all 0.2s ease !important;
                    cursor: pointer !important;
                  }
                  .block-ref-wrap.inline:has([blockid="${uuid}"]):hover {
                    background-color: #f57c00 !important;
                    transform: translateY(-1px) !important;
                    box-shadow: 0 2px 6px rgba(255, 152, 0, 0.4) !important;
                  }
                        `;
                });
                // 移除舊樣式
                const oldStyle = document.getElementById('auto-block-tags');
                if (oldStyle) oldStyle.remove();
                // 注入新樣式
                const style = document.createElement('style');
                style.id = 'auto-block-tags';
                style.textContent = css;
                document.head.appendChild(style);
                console.log(`[Block Tags] ✓ Styles applied to ${tagBlocks.length} tags`);
              } catch (error) {
                console.error('[Block Tags] Error:', error);
              }
            }
            // 等待 Logseq API 就緒
            function waitForLogseq() {
              if (window.logseq && window.logseq.api) {
                console.log('[Block Tags] Logseq API ready!');
                // 初始執行(延遲確保 DOM 完全載入)
                setTimeout(applyAutoTagStyles, 3000);
                // 定期更新(每 15 秒)
                setInterval(applyAutoTagStyles, 15000);
              } else {
                console.log('[Block Tags] Waiting for Logseq API...');
                setTimeout(waitForLogseq, 500);
              }
            }
            // 開始執行
            waitForLogseq();
      • 四、重啓
        • 完全關閉 Logseq 再重啓,一開啓它發現有自訂程式碼,會問你要不要執行,選同意。
        • 它執行剛剛的程式碼,過一下看到區塊等級標籤變成橘底白字膠囊,滑鼠經過會變色。
        • 等 3 秒是故意設定的,不會讓你電腦吃力,避免太早執行其他的程式還沒準備好。
    • 附錄二:如果我用 RemNote 怎麼改?不用改!

      • 原本 Logseq 建標籤,要顯式告訴它「我要新增一個標籤咯!」,就是增加一頁空白筆記
        • 宣告標籤: [[my_new_tag]],因為標籤就是一「頁」;
        • 使用標籤:「這是我要貼標籤的內容 #my_new_tag」,會把內容與標籤頁產生關係,完成!
      • RemNote 沒有「檔案」觀念,全面資料庫,所以標籤特別簡單,完全不會打斷你的寫作思緒
        • 上一行輸入「my_new_tag
        • 下一行輸入「這是我要貼標籤的內容 #my_new_tag」,完成!
      • Logseq 經過本次改裝,也跟 RemNote 一樣簡單
        • 上一行輸入「++/my_new_tag
        • 下一行輸入「這是我要貼標籤的內容 ((++/my_new_tag))」,完成!
      • 不是為了少個動作,觀察 RemNote,團隊應該有試着把 Logseq 或 Obsidian 改成資料庫,但發現各種衝突,現在的操作就是它的好解答。

📚 相關文章