#obsidian #templater #Commander #卡片盒笔记法 #编码
使用obsidian 插件 templater,实现了脚本更新yaml的标题属性, 配合 Commander ,将这个能力绑定到保存宏组合中,尝试了豆包、元宝,最终使用[[kimi]]实验成功
/* setTitleFromFilename.js */
async function setTitleFromFilename() {
const file = app.workspace.getActiveFile();
if (!file) return;
/* ===== 排除指定文件 ===== */
if (['Inbox', '待办记录.components'].includes(file.basename)) return;
/* ========== 1. 读取并标准化标签 ========== */
const cache = app.metadataCache.getFileCache(file);
const rawTags = cache?.frontmatter?.tags ?? cache?.frontmatter?.tag ?? [];
const tags = Array.isArray(rawTags)
? rawTags.map(t => String(t).toLowerCase())
: [String(rawTags).toLowerCase()];
/* ========== 2. 标签 → 前缀 映射表(按优先级排序) ========== */
const tagRules = [
{ match: ['清单'], prefix: '7.1' },
{ match: ['人物', '角色'], prefix: '3.1' },
{ match: ['企业'], prefix: '1.1' },
{ match: ['记录'], prefix: '1.4' },
{ match: ['酷口家数字花园'], prefix: '0.0' },
{ match: ['思维模型'], prefix: '2.1' },
{ match: ['技术'], prefix: '2.2' },
{ match: ['城市', '地名'], prefix: '4.1' },
{ match: ['app','法宝'], prefix: '5.1' },
{ match: ['灵兽'], prefix: '5.2' },
{ match: ['功法'], prefix: '5.3' },
{ match: ['上线记录'], prefix: '8.2' },
{ match: ['攻略'], prefix: '6.1' },
{ match: ['法宝'], prefix: '5.1' },
{ match: ['门派'], prefix: '3.2' },
{ match: ['方法论'], prefix: '2.2' },
{ match: ['参考资料','书名'], prefix: '9.1' },
{ match: ['自媒体'], prefix: '9.2' },
{ match: ['插件'], prefix: '5.2' },
{ match: ['行业'], prefix: '1.0' }
];
/* ========== 3. 根据标签确定前缀(命中即停) ========== */
let prefixBase = '8.1';
for (const rule of tagRules) {
if (rule.match.some(k => tags.includes(k))) {
prefixBase = rule.prefix;
break;
}
}
/* ========== 4. 拼完整前缀:基础 + 年月日 ========== */
const today = new Date();
const y = today.getFullYear();
const m = String(today.getMonth() + 1).padStart(2, '0');
const d = String(today.getDate()).padStart(2, '0');
const datePart = `${y}${m}${d}`;
const datePrefix = `${prefixBase}.${datePart}`;
/* ========== 5. 处理 title ========== */
const currentTitle = String(cache?.frontmatter?.title ?? '').trim();
const shouldPrefix = prefixBase; // 不含日期
const shouldFull = `${prefixBase}.${datePart}`; // 含今天日期
const parts = currentTitle.match(/^([\d.]+)\s*(.*)$/);
const oldPrefixRaw = parts ? parts[1] : '';
const body = parts ? parts[2] : (currentTitle || file.basename);
// 只取前两段,忽略第三段及以后
const pureOld = oldPrefixRaw.replace(/\.\d{8}$/, '').split('.').slice(0, 2).join('.');
let newTitle = '';
if (pureOld !== shouldPrefix) {
// 规则1:标签不一致 → 重拼
newTitle = `${shouldFull} ${body.trim()}`;
} else if (/^\d$/.test(pureOld)) {
// 规则2:单数字且一致 → 重拼
newTitle = `${shouldFull} ${body.trim()}`;
} else {
// 规则3:X.X.X 且一致 → 仅补空格
newTitle = `${oldPrefixRaw} ${body.trim()}`;
}
if (newTitle !== currentTitle) {
await app.fileManager.processFrontMatter(file, fm => fm.title = newTitle);
new Notice(`✅ 已更新:${newTitle}`);
}
/* ========== 6. 写回 frontmatter ========== */
await app.fileManager.processFrontMatter(file, fm => {
fm.title = newTitle;
});
new Notice(`✅ title 已更新:${newTitle}`);
}
module.exports = setTitleFromFilename;
标题规则:
1. 如果笔记标签与对应前缀不一致,都要改成对应的前缀。要体验掉之前的(数字+.)的内容
2. 如果前缀与标签一致,1位数字开头的,修改为对应的前缀,前缀和标题之间只有一个空格
3. 如果前缀与标签一致,X.X.X结构(只有数字和.), 前缀保存不变,前缀和标题只有一个空格
为什么 1.1.1 企业-零售-美团 会变成1.1.20250722 企业-零售-美团
使用方法:
-
js保存为 setTitleFromFilename.js(放在 Templater 的 Scripts 目录):
-
新建摸板笔记,在任意模板或空模板里放一行:
<%*
await tp.user.setTitleFromFilename(tp);
return ""; // 返回空串
%>
最终绑定到commander.
ob地址:笔记
推荐文章
- 5.2.20250802 obsidian插件-Commander (0.800)
- 8.1.20250720 不同标签的编码逻辑 (0.667)
- 8.1.20250720 “000”开头的笔记编码规则调整 (0.667)
- 8.1.20250722 按照标签自动更新标题编码 (0.667)
- 2.2.20250722 数字花园-卡片盒笔记法编码体系 (0.623)
- 2.2.20250803 KG笔记法:打造自己的个人百科和知识图谱 (RANDOM - 0.500)