求助:关于obsidian的templater代码问题

我想要的效果

当我用测试模板创建新笔记时,调用普通笔记模板,并将普通笔记模板里的代码正常输出
理想结果图如下:

实际下面的代码已经能做到了,但是发现:

当我应用时,发现在测试模板输入的标题(变量title)并没有被链接到"普通笔记模板"里的属性title上
实际结果如图:

求解:该如何做,才能让测试模板里的title变量给到我的"普通笔记模板"里的title属性

代码如下

  • 这是一个测试模板
<%*
let title = tp.file.title;
if (title.startsWith ("未命名")) {
 title = await tp.system.prompt ("输入笔记标题名");
}
if (title == "") {
title = "笔记 "+ tp.date.now ("mmss");
} 
else {
await tp.file.rename (title);
};
const choice = await tp.system.suggester (["笔记-No Action", "笔记-阅读", "笔记-记录"], ["笔记-No Action", "笔记-阅读", "笔记-记录"]);
let output = ""
switch (choice) {
 case "笔记-No Action":
  output = await tp.file.include ("[[普通笔记模板]]");
  await tp.file.move ("/笔记-No Action/" + title);
  break;
 case "笔记-阅读":
  output = await tp.file.include ("[[普通笔记模板]]");
  await tp.file.move ("/笔记-阅读/" + title);
  break;
 case "笔记-记录":
  output = await tp.file.include ("[[普通笔记模板]]");
  await tp.file.move ("/笔记-记录/" + title);
  break;
 default:
  new Notice ("No Matching Template")
};
tR += output
%>
  • 这是我的"普通笔记模板"
---
title: "[[<% tp.file.title %>]]"
tags: 
CreateDate: <% tp.file.creation_date("Y-M-D H:mm:ss") %>
ModifyDate: <% tp.file.last_modified_date("Y-M-D H:mn:ss")%>
FinishedDate: 
status: No Action
---
4 Likes

开发调优搞七捻三

JavaScript, #obsidian添加

没怎么看懂title的关系。
不过templater里面有tp.config.active_file能拿到当前活跃的file数据
而obsidian API 提供更改frontmatter值的方法app.fileManager.processFrontMatter

1 Like

我觉得这样是不是把事件变得更复杂了?
第一个是在模板内部再选择一次模板
第二个是,如果都是用普通笔记模板,那么在保留普通笔记模板的内容后面,再去做文件移动的逻辑

<%*
// 变量保存输入和选择
-%>
---
//frontmatter的部分
---
tp.file.move

-%>是不会显示空行的

1 Like
  1. 其实我是想将该测试模板直接用于根目录,这样只要我要创建新文件,就会提示我是要创建笔记还是日记
  2. 然后根据我的选择,去调用我已经创建好的笔记/日记模板
  3. 其实我的遇到的问题是:当我运行测试模板时,会提示我设置标题,设置完后会去调用我已设置的模板(即这里的普通笔记模板),但是这个标题在已设置好的模板(即普通笔记模板)里,使用tp.file.title无法识别出
1 Like

是不同端的缘故吗?我没有用手机端。我会直接用templater的命令新建文件,所以get不到为什么要一个测试模板来用作选择模板的模板。
因为你在include模板的时候,模板已经执行了,你如果想要保持你的思路,还可以先移动文件和改名,再include模板呢?

画了个简单的思维图

title: "[[<% tp.config.active_file.basenamee %>]]"

或者是

app.fileManager.processFrontMatter(app.workspace.getActiveFile(), fm => {
    fm.title = `[[${title}]]`
});

可以了,更改过来了,感谢大佬,我的主模板又可以实施了

1 Like

不过还得是先移动改名,再include模板

大佬,这命令在哪找的?我从官方文档里没找到这样的格式 :thinking:

有的啊 tp.config - Templater

1 Like

如果你有电脑端的obsidian,也可以在obsidian打开开发者工具,在控制台中输入

app.plugins.plugins["templater-obsidian"].templater.current_functions_object.config.active_file

有时候不知道有什么,就debugger或者console看看具体是怎样的数据

1 Like

是我死板了,看带问号,以为就只能那么用,吃了没文化的亏,代码基础不太好

1 Like

不对啊,没看到有basename啊? :joy:原谅我的无知和来自小白的求知

看下面那个吧。其实Templater文档没有明说,这里返回的file是obsidian的Tfile的类型。