PLUGIN · Obsidian

TypeScript · esbuild · 自用插件,源码全是中文函数名

搜索框敲两个词,回车自动变正则

一个只给自己用的 Obsidian 插件,装进去之后就叫「史锦泽的插件」。 招牌功能是把思源笔记那套搜索抄过来:在 Obsidian 原生搜索框里用空格分隔多个关键词, 按下回车自动拼成按行 AND 匹配的正则;不想要了,再按一次回车就变回原来的词。 另外还有右键复制绝对 / 相对路径、6 个常用文件槽、把原生搜索整块搬进大弹框、最近文件卡片墙。

🔍 正则搜索(招牌) 🗔 1200×900 搜索弹框 📋 右键复制路径 🗂️ 6 个常用文件槽 🧩 11 条命令
版本 1.0.0 最低 Obsidian 0.15.0 命令面板 11 条 要拷的文件 3 个

这页没有下载按钮,是真没有:这个插件没有做任何在线发布—— versions.json 里至今只有 1.0.0 一条记录, 编译产物 main.js 也被 .gitignore 排除在仓库之外。 所以装法只有一条:拉源码自己 npm run build,把三个文件拷进笔记库。步骤在本页最下面。

招牌功能:正则搜索

Regex search

Obsidian 原生搜索里多个关键词是「同一篇文件里都出现过就算命中」,一搜一大把。 这个插件监听回车键,把你敲的词现场改写成一串前瞻正则——命中条件立刻收紧成「同一行里全都有」。 下面是真实的转换过程,两串字符串都跟源码里的拼装规则逐字对得上。

你在搜索框里敲的 obsidian css
框里立刻变成 /(?=.*obsidian)(?=.*css).*
正则还在框里时 /(?=.*obsidian)(?=.*css).*
变回你原来敲的词 obsidian css
📉 作者自己记下来的那次实测:同样搜 obsidian css, 用 Obsidian 原生搜法出 51 项结果「很难找到我需要的」, 换成上面这串正则之后只剩 6 项结果,一眼就看见了。 这两个数字来自插件仓库 README 里的原话与配套的两张对照截图。
拼装规则:每个词包一层前瞻
按空格切开你输入的每一段,各自包成 (?=.*词) 全部串起来,末尾接一个 .*; 最后如果开头不是 /,再补一个 / 前缀——因为 Obsidian 靠这个斜杠识别「这是正则」。
是「同一行」都有,不是同一篇
前瞻里用的是 .*(不跨行),所以命中的是同一行同时包含全部关键词的结果, 而不是「同一个文件里各处出现过」。这既是它好用的原因,也是它的事实边界—— 关键词散落在不同段落的文件会被它滤掉。
只在真正的搜索框里生效
插件在 document 上监听 keydown,但只认同时满足 type="search" 且 enterkeyhint="search" 的输入框(也就是 Obsidian 那类原生搜索框)。 在正文里敲回车、在别的输入框里敲回车,都不会被它改写。
还原靠 localStorage 存了一份原词
转换之前,原始输入先写进 localStorage 的 sjzSearch 键; 再次按回车时,只要框里的内容同时含有 * 和 .(说明现在放的是正则), 就把原词取回来填上。所以「再按一次变回去」是有条件的,不是任意时刻都能撤销。

一眼看懂

At a glance

不想往下翻的话,这六条就是它每天真正在干的事。

回车即正则,几乎无感

不用记语法、不用点开关:空格分隔敲完直接回车,框里就换成了按行 AND 的正则;再按一次回车原样变回去。

把原生搜索搬进大弹框

不另造一套搜索,而是把 Obsidian 原生 search 视图整块 DOM 搬进 1200×900 的模态框用,关闭时再原样搬回去。

搜索历史留 20 条

弹框顶部一行标签:回车即记录,最多 20 条,点一下回填并置顶,悬停出 × 删单条,行尾有「清空」。存在插件自己的 data.json 里。

右键两条复制路径

文件右键菜单多出「复制绝对路径」和「复制相对路径」两项,前者解码成真实磁盘路径,后者就是库内路径。

6 个常用文件槽

设置里填 6 条路径,命令面板对应 6 条命令一键直达;已经开着的文件直接激活那个标签,不会重复开一份。

最近文件铺成卡片墙

插件在库里自建一个目录,把打开过的文件记成「路径 → 时间戳」,打开那篇 md 时铺成一排可点的卡片,每行最多三张。

功能,一条一条来

Features

下面每一条都对得上源码里的具体实现,没有「即将支持」。 最后单独留了一组「写了但当前版本没生效」——这个插件是自用的, 有几块代码在仓库里躺着但压根没接上线,与其让人装完之后找不到,不如提前讲清楚。

正则搜索(本页开头那一段)
空格分隔的关键词一按回车就变成 /(?=.*A)(?=.*B).*,命中收紧到同一行; 再按一次回车从 localStorage 把原词取回来。转换与还原的完整规则、触发条件见上面「招牌功能」那节。
「史锦泽的搜索框」:搬 DOM,不重造
本插件体量最大的一块(794 行)。它不自己实现搜索,而是找到 Obsidian 原生的 search 视图, 把整块 DOM 搬进一个 1200×900(上限 95vw / 90vh)的模态框, 顺手把原生的建议下拉、历史下拉和上下键导航禁掉,并让双击任一条搜索结果 100 毫秒后自动关闭弹框。 关闭时把 DOM 和它原来的那套内联样式一起还原回原父容器,不给主界面留残留。 两个入口:命令面板里的「史锦泽的搜索框」,或左侧栏那个闪电图标。
搜索历史:20 条,持久化
弹框顶部一条标签行:回车就记一条,重复的先去重再置顶,最多留 20 条。 点标签回填到搜索框,悬停冒出 × 删单条,行尾有清空。 底座是自写的 StorageUtil(422 行,plugin.loadData / saveData 外面套一层内存 Map 缓存), 数据存进插件自己的 data.json,关掉 Obsidian 也还在。

路径与常用文件

3 项
右键「复制绝对路径」
挂在文件右键菜单上(只对文件生效,文件夹上不出现)。 取 Obsidian 给出的资源路径再 decodeURIComponent 解码一遍—— 不解码的话中文目录会是一串 %E6%88%91,贴到别处没法看。
右键「复制相对路径」
同一个右键菜单里的第二条,复制的是库内相对路径(文件夹/笔记.md 这种)。 写双链、写脚本、跟别人说「在库里的哪儿」时用这条。
6 个常用文件槽 + 6 条命令
设置面板「⚡ 快速访问文件」里有常用文件 1~6 六个输入框(占位提示形如 例如: 项目/重要文档1.md),命令面板对应 sjz打开指定文件1~sjz打开指定文件6 六条命令。 打开逻辑是先找已开标签再新开:遍历所有 markdown 标签比对路径, 找到就直接激活那个标签,找不到才新开一个,不会同一篇开出好几份。

最近文件与标签

3 项
在库里自建一个目录放家当
插件加载时先检查、没有就创建 插件与教程/史锦泽的插件 这个目录, 里面放四份文件:最近打开的文件.md、默认搜索框文件.md, 以及两份 json——最近打开的文件信息.json 和 搜索文件框历史记录.json。 它们是普通的库内文件,跟着你的笔记一起同步、一起备份。
最近文件卡片墙
每打开一个文件就记一条「路径 → 时间戳」写回 json; 当你打开 最近打开的文件.md 时,插件把这份记录从新到旧铺成一排卡片, 每张显示文件名、点一下在当前页打开,每行最多三张、悬停上浮 3px。
标签搜索页:一个词生成两段 dataview
打开 默认搜索框文件.md 时,页面顶部插进一个输入框(默认值「常用」)加一行历史标签。 敲个词回车,插件把这个词记进历史,并用模板整篇重写这个文件: 一段 YAML(cssclasses: zettelkasten)加两段 dataview 查询—— 一段按文件名含关键词、一段按 tags 含关键词,都是 sort mtime desc。 这两段查询要靠 dataview 插件渲染,没装 dataview 就只是两段代码块。

界面与杂项

4 项
左侧栏闪电图标 + 状态栏一行字
左侧功能区加一个闪电(zap)图标,点它等于执行「史锦泽的搜索框」那条命令; 右下角状态栏显示一行静态文字「史锦泽的插件」——就是块牌子, 不是计时器、也不会跳数字,别期待它变。
每个新会话弹一次加载提示
靠比对 sessionId 与上次存下的 lastSessionId 判断「是不是新开的 Obsidian」, 是的话弹一条 Notice「🎉史锦泽的插件已加载。」,显示 3 秒。 插件到底启没启用,看这一下就知道。
两条示例命令
史锦泽的插件-自动填充内容:向当前选区插入一句固定文本「这个是通过命令输入的内容」; sjz-简单的弹框模板:弹一个只写着「欢迎来到史锦泽的插件」的空框。 这两条是从官方模板留下来的骨架,留着当写新功能时的起手式,功能本身就这么点。
两个定时器 + 一把山寨「redis 锁」
定时器都用 registerInterval 注册(插件一禁用就自动清掉): 一个每 3 分钟跑一次,作用是把已经从库里删掉的文件从最近列表里剔除; 另一个每 5 分钟只打一行日志。 另外还有个自己写的「锁」——用两次调用间隔是否超过 1 毫秒判重入, 专治「打开新标签页 + 打开文件」会让 layout-change 连触发两次、界面被插两遍的问题。

命令面板里能搜到的全部 11 条命令(这个插件没有绑定任何快捷键, 全靠命令面板、右键菜单和左侧栏图标触发;想要快捷键得自己去 Obsidian 的快捷键设置里绑):

🔍 史锦泽的搜索框 🕒 sjz最近打开的文件 1️⃣ sjz打开指定文件1 2️⃣ sjz打开指定文件2 3️⃣ sjz打开指定文件3 4️⃣ sjz打开指定文件4 5️⃣ sjz打开指定文件5 6️⃣ sjz打开指定文件6 ⌨️ 史锦泽的插件-自动填充内容 🪟 sjz-简单的弹框模板 🔑 sjz-输入密码解密文件

说清楚:写了但当前版本没生效

5 项
⚠️ 下面这几块在仓库里能看到代码,但装上之后找不到、或者点了没反应。 列出来是为了别让人白找——不要按「已实现的功能」去期待它们。
文件加密:骨架有,线没接
仓库里确实有一份用 crypto-js 做 AES 全文加解密的模块,也有一个 password 输入框弹窗, 但那个文件从没被入口 main.ts 引入,里面的加解密函数一个调用点都没有。 它本身也还是半成品(密钥写死成一句占位字符串、解密函数解的是一个字符串字面量而不是文件内容)。 当前版本没有可用的文件加密。
「sjz-输入密码解密文件」只是回显密码
命令面板里能搜到这一条,点开也真有一个「请输入密码」的框。 但点确定或按回车之后,它做的唯一一件事是把你输入的内容原样用 Notice 弹出来—— 不解密任何东西。它是上面那块加密功能留下的入口壳子。
设置项「启动时打开的文件」只写不读
设置面板「🚀 启动设置」里那个输入框能填、也确实存下来了, 但全仓库没有任何一处在启动时去读它并打开对应文件。 换句话说:填了不生效。真要开机直达某个文件,先用「常用文件 1~6」加命令代替。
顶栏那三个按钮被硬关掉了
「最近文件 / 定位文件 / 搜索文件」三个按钮的绘制函数,第一行就是一个写死的开关直接 return, 所以界面上根本不会出现。它们的样式还留在 styles.css 里,但按钮本身不显示。
代码块一键复制被作者自己注释了
「给代码块添加复制功能」整整 243 行写完了,但在 main.ts 里那行调用被注释掉了, 作者自己写的理由是:它需要监听 DOM 树变化,比较消耗资源、还可能导致死循环, 出问题第一个排查它。当前版本代码块没有复制按钮。

怎么装

Install

没有安装包、没有商店、也没有在线更新——这是个自用插件,装法就是 Obsidian 官方那套「手动装第三方插件」: 自己 build 出三个文件,拷进笔记库的插件目录,重启启用。下面六步照着做即可。

1.0.0插件版本(至今仅此一版) 0.15.0要求的最低 Obsidian 版本 3要拷进去的文件 11命令面板里的命令
  1. 拉源码,装依赖。拿到 shijinze-plugin-obsidian 这个目录之后,在它里面执行: npm install
  2. 打生产包。这一步先跑一遍 TypeScript 类型检查,再用 esbuild 打成单文件; 成功之后目录里会多出一个 main.js(仓库里没有它,它是编译产物): npm run build
  3. 在笔记库里建插件目录。目录名必须是 shijinze-plugin(manifest 里的 id), 写成中文名或仓库名 Obsidian 都认不出来: <你的库>/.obsidian/plugins/shijinze-plugin/
  4. 把三个文件拷进去。就这三个,多一个不用: main.js manifest.json styles.css
  5. 启用。重启 Obsidian(或在「设置 → 第三方插件」里刷新一下), 在第三方插件列表里找到「史锦泽的插件」打开开关。 右下角弹出 🎉史锦泽的插件已加载。 就说明成了,同时左侧栏会多出一个闪电图标。
  6. (要改代码才需要)开发模式。npm run dev 会常驻监听文件变化并即时重编译; 但 Obsidian 不会自动重载插件——每次改完都要去「第三方插件」里把它关掉再打开才生效。 npm run dev
📁 它会往你的库里写东西:首次加载时会自动创建 插件与教程/史锦泽的插件 目录, 并在里面建四个文件(最近打开的文件.md、默认搜索框文件.md 和两份 json)。 最近文件记录、标签历史都存在这里;插件自己的设置和搜索历史则在 .obsidian/plugins/shijinze-plugin/data.json。不想要这个目录的话,装之前先知道有这回事。
🧩 「标签搜索页」那条依赖 dataview:插件只负责把两段 dataview 查询写进文件, 渲染是 dataview 插件干的。没装 dataview 的话,那篇文件里就是两段没渲染的代码块,别以为是坏了。
📱 手机端别抱期待:manifest 里 isDesktopOnly 写的是 false, 但源码有三个文件 import 了 Node 的 path 模块,而打包配置把所有 Node 内置模块都设成了 external。 移动端没有验证过,请按桌面端插件来用。
🧬 TypeScript 4.7 📦 esbuild 打单文件 🔐 crypto-js(唯一运行时依赖) 🧱 基于官方 sample-plugin 模板 🀄 源码函数名全是中文 🎨 styles.css 164 行