(?=.*词) 全部串起来,末尾接一个 .*;
最后如果开头不是 /,再补一个 / 前缀——因为 Obsidian 靠这个斜杠识别「这是正则」。
TypeScript · esbuild · 自用插件,源码全是中文函数名
一个只给自己用的 Obsidian 插件,装进去之后就叫「史锦泽的插件」。 招牌功能是把思源笔记那套搜索抄过来:在 Obsidian 原生搜索框里用空格分隔多个关键词, 按下回车自动拼成按行 AND 匹配的正则;不想要了,再按一次回车就变回原来的词。 另外还有右键复制绝对 / 相对路径、6 个常用文件槽、把原生搜索整块搬进大弹框、最近文件卡片墙。
Obsidian 原生搜索里多个关键词是「同一篇文件里都出现过就算命中」,一搜一大把。 这个插件监听回车键,把你敲的词现场改写成一串前瞻正则——命中条件立刻收紧成「同一行里全都有」。 下面是真实的转换过程,两串字符串都跟源码里的拼装规则逐字对得上。
obsidian css,
用 Obsidian 原生搜法出 51 项结果「很难找到我需要的」,
换成上面这串正则之后只剩 6 项结果,一眼就看见了。
这两个数字来自插件仓库 README 里的原话与配套的两张对照截图。
(?=.*词) 全部串起来,末尾接一个 .*;
最后如果开头不是 /,再补一个 / 前缀——因为 Obsidian 靠这个斜杠识别「这是正则」。
.*(不跨行),所以命中的是同一行同时包含全部关键词的结果,
而不是「同一个文件里各处出现过」。这既是它好用的原因,也是它的事实边界——
关键词散落在不同段落的文件会被它滤掉。
type="search" 且
enterkeyhint="search" 的输入框(也就是 Obsidian 那类原生搜索框)。
在正文里敲回车、在别的输入框里敲回车,都不会被它改写。
sjzSearch 键;
再次按回车时,只要框里的内容同时含有 * 和 .(说明现在放的是正则),
就把原词取回来填上。所以「再按一次变回去」是有条件的,不是任意时刻都能撤销。
不想往下翻的话,这六条就是它每天真正在干的事。
不用记语法、不用点开关:空格分隔敲完直接回车,框里就换成了按行 AND 的正则;再按一次回车原样变回去。
不另造一套搜索,而是把 Obsidian 原生 search 视图整块 DOM 搬进 1200×900 的模态框用,关闭时再原样搬回去。
弹框顶部一行标签:回车即记录,最多 20 条,点一下回填并置顶,悬停出 × 删单条,行尾有「清空」。存在插件自己的 data.json 里。
文件右键菜单多出「复制绝对路径」和「复制相对路径」两项,前者解码成真实磁盘路径,后者就是库内路径。
设置里填 6 条路径,命令面板对应 6 条命令一键直达;已经开着的文件直接激活那个标签,不会重复开一份。
插件在库里自建一个目录,把打开过的文件记成「路径 → 时间戳」,打开那篇 md 时铺成一排可点的卡片,每行最多三张。
下面每一条都对得上源码里的具体实现,没有「即将支持」。 最后单独留了一组「写了但当前版本没生效」——这个插件是自用的, 有几块代码在仓库里躺着但压根没接上线,与其让人装完之后找不到,不如提前讲清楚。
/(?=.*A)(?=.*B).*,命中收紧到同一行;
再按一次回车从 localStorage 把原词取回来。转换与还原的完整规则、触发条件见上面「招牌功能」那节。
data.json,关掉 Obsidian 也还在。
decodeURIComponent 解码一遍——
不解码的话中文目录会是一串 %E6%88%91,贴到别处没法看。
文件夹/笔记.md 这种)。
写双链、写脚本、跟别人说「在库里的哪儿」时用这条。
例如: 项目/重要文档1.md),命令面板对应
sjz打开指定文件1~sjz打开指定文件6 六条命令。
打开逻辑是先找已开标签再新开:遍历所有 markdown 标签比对路径,
找到就直接激活那个标签,找不到才新开一个,不会同一篇开出好几份。
插件与教程/史锦泽的插件 这个目录,
里面放四份文件:最近打开的文件.md、默认搜索框文件.md,
以及两份 json——最近打开的文件信息.json 和 搜索文件框历史记录.json。
它们是普通的库内文件,跟着你的笔记一起同步、一起备份。
最近打开的文件.md 时,插件把这份记录从新到旧铺成一排卡片,
每张显示文件名、点一下在当前页打开,每行最多三张、悬停上浮 3px。
默认搜索框文件.md 时,页面顶部插进一个输入框(默认值「常用」)加一行历史标签。
敲个词回车,插件把这个词记进历史,并用模板整篇重写这个文件:
一段 YAML(cssclasses: zettelkasten)加两段 dataview 查询——
一段按文件名含关键词、一段按 tags 含关键词,都是 sort mtime desc。
这两段查询要靠 dataview 插件渲染,没装 dataview 就只是两段代码块。
史锦泽的插件-自动填充内容:向当前选区插入一句固定文本「这个是通过命令输入的内容」;
sjz-简单的弹框模板:弹一个只写着「欢迎来到史锦泽的插件」的空框。
这两条是从官方模板留下来的骨架,留着当写新功能时的起手式,功能本身就这么点。
命令面板里能搜到的全部 11 条命令(这个插件没有绑定任何快捷键, 全靠命令面板、右键菜单和左侧栏图标触发;想要快捷键得自己去 Obsidian 的快捷键设置里绑):
没有安装包、没有商店、也没有在线更新——这是个自用插件,装法就是 Obsidian 官方那套「手动装第三方插件」: 自己 build 出三个文件,拷进笔记库的插件目录,重启启用。下面六步照着做即可。
shijinze-plugin-obsidian 这个目录之后,在它里面执行:
npm install
main.js(仓库里没有它,它是编译产物):
npm run build
shijinze-plugin(manifest 里的 id),
写成中文名或仓库名 Obsidian 都认不出来:
<你的库>/.obsidian/plugins/shijinze-plugin/
main.js manifest.json styles.css
npm run dev 会常驻监听文件变化并即时重编译;
但 Obsidian 不会自动重载插件——每次改完都要去「第三方插件」里把它关掉再打开才生效。
npm run dev
插件与教程/史锦泽的插件 目录,
并在里面建四个文件(最近打开的文件.md、默认搜索框文件.md 和两份 json)。
最近文件记录、标签历史都存在这里;插件自己的设置和搜索历史则在
.obsidian/plugins/shijinze-plugin/data.json。不想要这个目录的话,装之前先知道有这回事。
isDesktopOnly 写的是 false,
但源码有三个文件 import 了 Node 的 path 模块,而打包配置把所有 Node 内置模块都设成了 external。
移动端没有验证过,请按桌面端插件来用。