已尝试的解决方案
我目前通过插入模板来实现,但插入模板还需要再选择一下模板,没办法直接一次性调用某个模板
quickadd+templater可以一次性调用模板/绑定到快捷键
有插件metaedit之类的
我不太理解如何实现?templater插件我不太熟悉,似乎快捷键和命令都是用模板新建文件,该如何实现插入模板呢?
如果不需要高级功能直接用quickadd就行了,quickadd设置面板中创建一个template指令,选择模板路径+创建路径就行了
我的目的是 如何实现通过命令修改当前文件中的某一个属性值?
这也就意味着需要创建的文件名字和当前文件名字一样,这怎么实现呢?
这个似乎无法直接修改属性值啊
楼主是怎么通过插入模板实现修改属性值的呢?
quickadd是可以把插入模板等操作绑定到快捷键,蛋不知道是不是楼主的需求
能啊, 执行命令run metaedit, 选择要改的键名, 填入要改的键值
唔 obsidian 似乎自带一个命令是插入模板,可以实现用模板中设定的 meta 属性值替换当前文件中的 就是这个命令必须选择后再去选择对应的模板 我希望可以直接一步用选定的模板实现命令操作
这样就要点3下了,我希望用一个命令实现将属性值改到某一个固定的值
那是不可能的吧. 你不选, 插件咋知道你想改的到底是哪个键呢, 而且往里传值也得手输或点选啊.
不知道,你现在找没找到解决办法。我现在找到了一个插件,为模板增加命令插入的
Hotkeys for templates
Note Toolbar的JS功能

// ============================
// 配置区域
// ============================
// 设置要操作的属性名
const PROPERTY_NAME = 'tags'; // 修改为您的属性名
// 1. 成对替换:添加特定值时会删除对立值
const VALUE_REPLACEMENTS = {
'常绿': ['落叶'], // 添加"常绿"时,删除"落叶"
'乔木': ['灌木', '地被', '水生'], // 添加"乔木"时,删除这三个值
'热带': ['寒带', '亚热带'], // 添加"热带"时,删除这两个值
'阳性': ['阴性', '中性'], // 添加"阳性"时,删除这两个值
'耐旱': ['喜湿'] // 添加"耐旱"时,删除"喜湿"
};
// 2. 独立添加的值(不触发删除操作)
const INDEPENDENT_ADD = ['植物', '观赏植物', '园林植物'];
// 3. 独立删除的值(不触发添加操作)
const INDEPENDENT_REMOVE = ['测试标签', '临时标签'];
// 4. 始终保留的标签(不会被删除,无论什么规则)
const PROTECTED_VALUES = ['常绿乔木', '落叶乔木', '灌木/观赏'];
// ============================
// 执行代码
// ============================
// 获取当前属性值
let current = await ntb.getProperty(PROPERTY_NAME);
let currentArray = [];
// 转换为数组
if (Array.isArray(current)) {
currentArray = [...current];
} else if (typeof current === 'string' && current.trim() !== '') {
currentArray = [current];
} else if (current) {
currentArray = [String(current)];
}
console.log(`初始 ${PROPERTY_NAME}:`, currentArray);
let changes = [];
// 步骤1:处理成对替换
for (const [addValue, valuesToRemove] of Object.entries(VALUE_REPLACEMENTS)) {
const shouldAdd = addValue && !currentArray.includes(addValue);
let removedValues = [];
// 检查是否需要删除对立值
for (const removeValue of valuesToRemove) {
if (removeValue && currentArray.includes(removeValue)) {
// 检查是否在保护列表中
if (!PROTECTED_VALUES.includes(removeValue)) {
removedValues.push(removeValue);
}
}
}
// 如果有需要删除的值,则进行替换
if (shouldAdd || removedValues.length > 0) {
if (shouldAdd) {
currentArray.push(addValue);
changes.push(`添加: ${addValue}`);
}
// 删除对立值
for (const removeValue of removedValues) {
currentArray = currentArray.filter(v => v !== removeValue);
changes.push(`删除: ${removeValue} (因为添加了 ${addValue})`);
}
}
}
// 步骤2:独立添加的值
for (const newValue of INDEPENDENT_ADD) {
if (newValue && !currentArray.includes(newValue)) {
currentArray.push(newValue);
changes.push(`独立添加: ${newValue}`);
}
}
// 步骤3:独立删除的值
for (const removeValue of INDEPENDENT_REMOVE) {
if (removeValue && currentArray.includes(removeValue)) {
// 检查是否在保护列表中
if (!PROTECTED_VALUES.includes(removeValue)) {
currentArray = currentArray.filter(v => v !== removeValue);
changes.push(`独立删除: ${removeValue}`);
}
}
}
// 去重(避免重复值)
currentArray = [...new Set(currentArray)];
// 保存更新
if (currentArray.length > 0) {
await ntb.setProperty(PROPERTY_NAME, currentArray);
console.log(`\n更新记录:`);
changes.forEach(change => console.log(` - ${change}`));
console.log(`\n最终 ${PROPERTY_NAME}:`, currentArray);
} else {
await ntb.setProperty(PROPERTY_NAME, null);
console.log(`属性 ${PROPERTY_NAME} 为空,已删除`);
}