遇到的问题
如何用obsidian内的插件或机制修改或添加元数据?
我用的metaedit插件似乎主要用来修改单个笔记的元数据,如果是选中多个笔记,就没有此功能。如果使用ctrl+p打开Metaedit,也是只能修改
其实也不是没有办法用metaedit插件修改多个笔记的方法:只要将所有要修改元数据的笔记放到一个文件夹里,然后右键就能弹出来一个“将YAML属性添加到此文件(及子文件)中的所有文件"的选项,这样子才行。这么反人类的操作不是不行,只是想到我每次都得来这么一遍,就十分的不爽。去找了找有没有人开发了插件,惊讶地发现除了一个22年的已经停止维护的插件https://forum-zh.obsidian.md/t/topic/5948,就没有此类其他插件了,当然也可能是我没找到。
预期的效果
我希望的是选中的几个文件,然后操作给每个笔记添加一个相同的YAML 属性值
这个功能肯定是可以做到的,metaedit有一个api,不知道有没有用,使用quickadd也行
已尝试的解决方案
其实我是会通过Trae这种AI代码工具的,理论上写个批量修改的脚本也不难,我只单纯觉得这样实在太麻烦了,感觉这也不是没人用的功能,唯一符合要求的插件,批量添加的功能居然这么反人类。这才是让我惊讶的一点
当然了,最简单的做法就是使用templater在创建的时候就用模板,但这就不符合我的要求了,我要添加元数据的笔记还挺多的
1 个赞
一个解决方案
步骤1:多选目标笔记
步骤2:向右拖动笔记到当前文件,生成目标笔记列表的字符串
步骤3:复制字符串,在控制台输入命令
const str = `[[A 马克思主义、列宁主义、毛泽东思想、邓小平理论]]
[[C 社会科学总论]]
[[F 经济]]`
步骤4:输入如下的命令
function getTargetFiles(str){
const files = app.vault.getFiles()
const targetFiles = str.split("\n").map(line=>{
const path = DataviewAPI.parse(line).path;
const file = files.find(f=>f.path.endsWith(path+".md"))
return file;
})
return targetFiles;
}
const createYamlProperty = app.plugins.plugins.metaedit.api.createYamlProperty;
getTargetFiles(str).forEach(targetFile=>{
createYamlProperty("属性名","属性值", targetFile)
})
结果:成功批量添加了元属性(属性名: 属性值)
补充:如果反悔了,可运行如下代码可批量删掉元属性(更高明的操作是使用Git版本管理回滚变化)
getTargetFiles(str).forEach(targetFile=>{
app.fileManager.processFrontMatter(targetFile, (frontmatter)=>{
delete frontmatter["属性名"]
})
})