
- 在數位工具的世界裡,有一群「數位工匠」。他們不喜歡被蘋果(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 變身橘色膠囊?
- 用 Logseq 寫筆記就是為了比純文字好的視覺效果,變成膠囊就清楚多了
- 這就是 Logseq Geeky 的好處:如果 CSS 找不到路,我們就用 JavaScript 給它地圖,自幹就行了!
- 我在 Logseq 中加一段程式碼,它的邏輯是:
- 掃描開頭是
++/ 的區塊(「++/」是我的自訂「原子標籤」前綴,你可以換,程式碼記得跟著改),沒規定寫在哪裡,整個 Logseq 中都行。
- 抓出區塊 UUID,列成清單。
- 告訴系統:只要在清單裡的 ID,通通套用橘色背景、白色文字、圓角膠囊樣式(你也可以自己改喜歡的樣子)。
- 重啟 Logseq,同意後,奇蹟就發生了——那些令人煩躁的亂碼,瞬間變成了識別度極高的橘色膠囊。
-
為了愛因斯坦的記憶:知識庫「原子化」是 AI Friendly 的?
- 在 AI 時代,如果你的知識是「整本書」,AI 很難精準引用;但如果你的知識庫是「一塊塊樂高」,AI 就能隨心所欲地為你重新組裝。
- AI 可以看到了,但我自己反而看不到了啊!讓標籤「區塊化」後加上視覺化,我也可以一眼辨識出知識屬性。這不只是視覺美化,這是為了讓筆記從「靜態檔案」進化為「活性資料庫」。
- 現在你要跟任何資料庫整合時,就會覺得好多了!
-
附錄:
-
附錄一:Step By Step 照著做
- 一、找到正確位置
- 如果你想試試,但你不是個 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 改成資料庫,但發現各種衝突,現在的操作就是它的好解答。
📚 相關文章