思源筆記 v2.11.1 發行解析:雲端收集箱、搜尋與插件事件體系的全面升級
前言:本版做了什麼
思源筆記(SiYuan)v2.11.1 是一次以「雲端收集箱與微信小助手」為核心的迭代版本,官方在概述中明確點出「此版本改進了雲端收集箱和微信小助手,歡迎體驗」。除此之外,該版本還覆蓋了搜尋介面與關鍵字歷史管理、只讀模式與移動端編輯體驗、匯出品質、一批數據倉儲缺陷修復,以及面向開發者的資料庫多視圖、插件事件匯流排擴充、日記屬性與日期範本函數等能力。
本篇文章以 v2.11.1 的官方繁體中文變更記錄(app/changelogs/v2.8.4-v2.12.8/v2.11.1/v2.11.1_zh_CHT.md)為主體骨架,逐一拆解每一類改進的功能含義與使用者價值,並結合當前倉庫內對應的 Go 內核與前端 TypeScript 原始碼,給出可核對的實現依據。讀完你將掌握:
- 雲端收集箱「移動到文檔」時自動化處理(資源下載、語音/視訊塊轉換)的完整行為;
- v2.11.1 新增的插件事件(
mobile-keyboard-show/hide、sync-start/end/fail)的觸發時機與訂閱方式; - 日記文檔
custom-dailynote-yyyyMMdd屬性的底層寫入邏輯與應用場景。
說明:原文中的商業廣告段落(功能特性早鳥價等)屬於時效性資訊,截至 2024 年初已結束,本文不再展開;年付訂閱含功能特性這一帳戶規則仍適用於理解其商業模式,但不影響功能本身的使用。
一、雲端收集箱與微信小助手:語音資源的自動化處理鏈路
本版最大的功能主線是雲端收集箱與微信小助手。微信小助手通常用於將微信中的內容(文字、語音、圖片等)轉存到思源雲端收集箱,因此「語音」是這條鏈路上的高頻素材。
1.1 微信小助手:AMR 語音自動轉 MP3
微信語音消息的原始格式為 AMR(Adaptive Multi-Rate),瀏覽器與思源編輯器對其原生播放支援有限。v2.11.1 中思源微信小助手會把收到的 amr 檔自動轉換為 mp3 文件(Issue #9753),從而在源頭上解決「收集了語音卻無法在編輯器內直接播放」的問題。
該能力與下面的「移動收集箱時自動轉換 mp3/mp4」相互配合,構成語音素材從「微信收集 → 雲端暫存 → 移入文檔」全程自動化的閉環。
1.2 雲端收集箱移動到文檔:三步自動化
在 v2.11.1 之前,將雲端收集箱中的內容移動到知識庫文檔時,對網路資源、多媒體連結的處理並不完善。本版一口氣補齊了三項自動化能力:
- 自動下載網路資源文件(Issue #9775):移動到文檔時,若內容中包含遠端網路資源連結,會自動將其下載到本地資產目錄,而不是留下一個依賴外網可用性的死連結;
- mp3/mp4 超連結自動轉換為語音塊與視訊塊(Issue #9778):當收集箱條目內包含 mp3、mp4 這類媒體連結時,移動過程中會直接把「超連結」就地升級為思源的語音塊(audio block)與視訊塊(video block),使其具備內嵌播放能力;
- 收集箱內支援預覽語音與視訊(Issue #9780):在尚未移入文檔前,收集箱列表中即可直接預覽語音與視訊內容,方便先聽/先看再決定是否收錄。
1.3 界面改進與資料完整性修復
- 改進雲端收集箱界面(Issue #9776):對條目列表、操作入口做了整體佈局與互動優化;
- 修復「移動端文檔時遺漏數據」(Issue #9771):修補了從收集箱移入文檔時特定條件下部分數據丟失的缺陷,與 1.2 的自動化轉換一同保障資料不丟、格式正確。
1.4 原始碼佐證:收集箱的內核 API 結構
雲端收集箱在思源內部稱為 shorthand(摘錄/速記),相關後端 HTTP API 集中於 kernel/api/inbox.go:
getShorthands(kernel/api/inbox.go#L73-L92):分頁拉取收集箱條目列表,接收page參數後呼叫model.GetCloudShorthands(page);getShorthand(kernel/api/inbox.go#L51-L71):依據id拉取單條收集箱內容;removeShorthands(kernel/api/inbox.go#L28-L49):批量刪除收集箱條目,接收ids陣列後呼叫model.RemoveCloudShorthands(ids)。
這些 API 的模型層實現在 kernel/model/cloud_service.go,包括 RemoveCloudShorthands(L415)、GetCloudShorthand(L446)與 GetCloudShorthands(L487)。由於雲端收集箱本質上依賴思源雲端帳號體系,其數據保存在雲端而非本地工作空間,因此「移動到文檔」一詞指的是:把雲端暫存的條目內容經上述自動化處理後,落地為知識庫中真實的 .sy 文檔節點。
二、搜尋體驗:介面重構與關鍵字歷史管理
搜尋是思源的高頻功能,v2.11.1 對搜尋入口與結果展示做了多處打磨:
- 改進搜尋介面(Issue #9788):整體 UI 調整;
- 搜尋關鍵字歷史支援刪除(Issue #9794):搜尋下拉中的歷史記錄此前無法單獨清除,本版支援逐條刪除,避免誤操作留下的歷史污染建議;
- 搜尋輸入框新增清空按鈕(Issue #9801):輸入內容後一鍵清空,減少手動刪除成本;
- 修復搜尋結果預覽包含轉義符問題(Issue #9790):此前命中內容的摘要預覽可能把 Markdown 轉義字元(如
\\、\*)原樣帶出,影響可讀性,本版修正了預覽文字的轉義處理。
值得注意的是 Issue #9790 與缺陷修復中的「貼上轉義文字 處理不正確」(Issue #9787)同屬「轉義符號在複製/預覽鏈路中被錯誤保留」的問題族,說明該版本在「文字進出編輯器的轉義一致性」上做了系統性收斂。
三、編輯與移動端體驗改進
3.1 全局只讀模式
- 切換全局只讀模式時編輯器閃爍(Issue #9767):此前在「讀寫 ↔ 只讀」切換瞬間,編輯器會出現明顯閃爍,本版優化了狀態切換時的渲染穩定性;
- 只讀模式文檔切換頁籤時不保留劃選內容(Issue #9785):在只讀模式下劃選文字後切換文件頁籤再回來,範圍選中狀態不應殘留,本版修正該行為。
3.2 Android 軟鍵盤相容性
- 改進 Android 端軟鍵盤隱藏相容性(Issue #9765):不同 Android 廠商 ROM 對軟鍵盤
resize/pan策略實現差異大,此前部分裝置在輸入法收起後編輯器底部留白或佈局錯位,本版針對該相容性做了改進; - 為行動端新增軟換行按鈕(Issue #9797):移動端鍵盤工具列提供軟換行(Shift+Enter 對應的軟換行行為)按鈕,便於在列表項等場景中插入不產生新塊的換行。
與軟鍵盤相關的前端工具列實現在 app/src/mobile/util/keyboardToolbar.ts,該檔案同時是下文 4.2 中 mobile-keyboard-show/hide 事件的觸發源。
3.3 行級程式碼編輯與貼上
- 改進
行級程式碼Markdown 編輯(Issue #9805):行級程式碼(inline code)的 Markdown 原始碼編輯體驗優化; 貼上轉義文字處理不正確(Issue #9787):修正貼上帶轉義文字時內容被二次轉義或轉義失效的問題。
四、匯出品質:圖片、超連結與檔案系統安全
- 改進匯出包含換行下劃線的圖片(Issue #9789):當圖片 src 中因換行而帶有底線(
_)被誤判為 Markdown 強調語法時,匯出圖片會異常,本版修正了該場景的 Markdown 圖片語法生成; - 改進匯出 Markdown 超連結空格(Issue #9792):匯出 Markdown 時超連結文字與 URL 中的空格處理更規範;
- 修復匯出含
../超連結 Markdown 時檔案系統異常(Issue #9779):文檔內如存在指向其他目錄的../相對超連結,匯出為 Markdown 時可能觸發檔案系統層級異常,本版增加防護。
這幾項都屬於「匯出結果與原始內容等價、且不在目標檔案系統上造成副作用」的收斂,體現了匯出引擎對 Markdown 語法邊界(空格、底線、斜線)的嚴格處理。
五、缺陷修復與開發重構
- 清理資料倉儲報錯
清理資料倉儲失敗:CreateFile ...(Issue #9760):在「設定 → 資源 → 清理資料倉儲」時,Windows 下可能因檔案句柄/佔用拋出CreateFile錯誤,本版修復,確保快照與資源清理流程穩定; Ctrl+Tab在 Windows 端失效(Issue #9770):在 Windows 桌面端,Ctrl+Tab用於頁籤切換,本版修復其在特定條件下失效的問題(該修復與文檔區Ctrl+Tab的文件頁籤循環邏輯相關);- 開發重構:升級 Electron v27.1.3(Issue #9802):桌面端殼層由舊版 Electron 升級至 v27.1.3,獲得對應的 Chromium/V8 安全修復與效能改進。從當前倉庫的 app/package.json 可以看到,Electron 依賴此後仍持續演進,v2.11.1 的 v27.1.3 是當時發行時的版本狀態。
六、開發者能力:資料庫多視圖與插件體系擴充
v2.11.1 對插件開發者的 API 面有較大擴充,是插件作者值得關注的一個版本。
6.1 資料庫(屬性視圖)多視圖
- 資料庫支援多視圖(Issue #9751):同一份資料表不再被鎖死在單一展示形式下,可在不同視圖間切換/並存;
- 改進資料庫表格視圖
Tab鍵互動(Issue #9761):表格視圖內Tab鍵在儲存格之間的焦點移動邏輯更符合編輯預期; - 當編輯器左側邊距最小時改進資料庫表格視圖行圖示(Issue #9772,PR #9772):在編輯器左邊距收窄到最小時,表格視圖左側行操作圖示的顯示與點擊區域得到修正。
在當前倉庫中,屬性視圖(Attribute View / AV)的各視圖渲染實現分散於 kernel/av/layout_table.go、kernel/av/layout_kanban.go、kernel/av/layout_gallery.go 等檔案,並由 kernel/av/layout.go 統一編排——從檔案結構可以推斷,v2.11.1 的「多視圖」正是這一層佈局能力的起點,後續版本持續在此基礎上擴展。
6.2 為插件 API 添加 Protyle 方法
- 為插件 API 添加一些
Protyle方法(Issue #9762):Protyle是思源內核編輯器渲染實例的抽象,插件透過其 API 操作當前打開文檔的塊。本版為插件可見的 Protyle 物件補充了若干方法,擴充插件對編輯器的控制能力。
6.3 插件事件:鍵盤與同步狀態可監聽
v2.11.1 新增了兩組插件事件匯流排(Event Bus)事件:
移動端鍵盤事件
mobile-keyboard-show與mobile-keyboard-hide(Issue #9773):分別在移動端軟鍵盤彈出與收起時觸發,供插件感知輸入法狀態、動態調整自訂 UI 位置。
同步事件
sync-start、sync-end與sync-fail(Issue #9798):分別在資料同步開始、成功結束與失敗時觸發,讓插件可以即時反映「正在同步 / 同步完成 / 同步失敗」三態。
從當前倉庫可以核對其實現:
- 事件名的型別定義收錄於 app/src/types/index.d.ts#L81-L94 的
TEventBus聯合型別中,同時包含ws-main、sync-start、sync-end、sync-fail、mobile-keyboard-show、mobile-keyboard-hide等; sync-start/end/fail的實際觸發點在 app/src/dialog/processSystem.ts#L470-L474:同步進程中根據結果分支呼叫item.eventBus.emit("sync-start", data)/emit("sync-end", data)/emit("sync-fail", data);mobile-keyboard-show/hide的觸發點在 app/src/mobile/util/keyboardToolbar.ts#L444 與 L489,由移動端鍵盤工具列在軟鍵盤開合時發出。
插件訂閱範例(訂閱名與 TEventBus 型別一致):
this.eventBus.on("sync-start", () => {
console.log("同步開始");
});
this.eventBus.on("sync-fail", (data) => {
console.error("同步失敗", data);
});
this.eventBus.on("mobile-keyboard-hide", () => {
// 收起輸入法時復位自訂浮層
});
6.4 插件 require 支援載入 Node 模組
- 插件
require函式支援載入 Node 模組(Issue #9803,PR #9803):此前插件沙箱中require的能力受限,本版讓其可載入標準 Node 模組,意味著插件作者可以把檔案操作、網路請求等依賴 Node API 的第三方庫直接帶入插件運行環境,顯著拓寬了插件可實現的功能範圍。
6.5 日記:custom-dailynote-yyyyMMdd 屬性
- 建立日記文檔時新增
custom-dailynote-yyyyMMdd屬性(Issue #9807):思源在建立日記時,會自動為文檔根節點寫入custom-dailynote-前綴、後接當日日期(yyyyMMdd格式,如custom-dailynote-20240101)的自訂屬性,用於將日記文檔與普通文檔在資料層面區分開來。
原始碼依據非常明確:常數定義於 kernel/model/file.go#L1164-L1168:
const (
DailyNoteAttrPrefix = "custom-dailynote-"
NodeAttrTitleEmpty = "custom-sy-title-empty"
DocHiddenAttr = "custom-hidden"
)
而 CreateDailyNote(kernel/model/file.go#L1170)在建立日記時會以當日 20060102 格式作為屬性值寫入 IAL(Inline Attribute List):
- 若當日日記已存在(kernel/model/file.go#L1194-L1213),僅在缺少該屬性時補寫
tree.Root.SetIALAttr(DailyNoteAttrPrefix+date, date); - 若不存在,則按「日記儲存路徑 + 日記範本」建立新文檔,並在末尾統一寫入該屬性(kernel/model/file.go#L1274-L1275)。
該屬性的存在意義在於:外掛、主題、模板與查詢語句可以透過 custom-dailynote-* 精確識別「某年某月某日的日記」,例如在資料庫查詢中過濾出所有日記、或統計每日記錄量。需要留意的是,屬性鍵中的日期與日記所屬日期對應,與「文檔最後更新日」並不相同,這正是它適合做日記判定的原因。
6.6 日期相關模板函數
- 新增一些日期相關的模板函數(Issue #9812,PR #9812):模板函數在思源中廣泛用於日記儲存路徑、模板渲染與匯出。本版補充的日期類函數可直接在
{{ }}範本表達式中使用。
當前倉庫的內建模板函數註冊於 kernel/filesys/template.go#L35-L64 的 BuiltInTemplateFuncs:函數表以 sprig.TxtFuncMap() 為基底(因此內含 date、now、dateModify 等常用日期函數),並額外註冊了 Weekday、WeekdayCN、WeekdayCN2、ISOWeek、ISOYear、ISOMonth、ISOWeekDate、parseTime 等與日期/週/ISO 8601 週曆相關的自訂函數。模板渲染入口 RenderGoTemplate 位於 kernel/model/template.go#L51-L69,它將 BuiltInTemplateFuncs 註冊進 text/template 後執行,而日記的儲存路徑正是透過 RenderGoTemplate(boxConf.DailyNoteSavePath) 渲染的(kernel/model/file.go#L1186),例如:
{{now | date "2006/01/02"}} 日記
七、小結與升級建議
v2.11.1 是一次「內容入口品質」與「開發者能力」並重的版本:
- 對一般使用者,雲端收集箱的資源下載、語音/視訊塊自動轉換與預覽能力,配合微信小助手的
amr → mp3轉換,讓「微信語音 → 可播放的思源語音塊」首次做到全自動;搜尋歷史管理、清空按鈕、只讀模式與移動端軟鍵盤/軟換行的改進則直接作用於日常編輯頻率最高的場景; - 對插件與主題開發者,
mobile-keyboard-show/hide、sync-start/end/fail五個新事件、Protyle 新方法與 Node 模組require支援,值得在第一時間接入以擴充插件能力; - 對資料管理層,
custom-dailynote-yyyyMMdd屬性為「以屬性驅動日記管理」提供了穩固的資料依據,可作為後續查詢、統計與自動化腳本的判據。
如需查閱三語種的完整變更清單,可對照瀏覽 v2.11.1_zh_CN.md、v2.11.1.md。如果你正計劃將思源接入自己的自動化工作流,本文所涉及的雲端收集箱 API(kernel/api/inbox.go)、插件事件(app/src/types/index.d.ts)與日記屬性(kernel/model/file.go)即可作為首選的切入點。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.24 K638- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python670
SlideSCIPPT插件,支持素材库、AI助手、一键添加图片标题,复制粘贴位置、一键图片对齐、一键插入Markdown(加粗、超链接等行内样式、代码块、LaTeX等块级样式)、便捷导出图片!C#230
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python52874
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go22545
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java36351