QuickAdd JS & Templater JS 简介及相互修改

简介

QuickAdd Capture 加载内部代码
1-3、命名、选择 Capture、点击 Add

4-5、点击小齿轮、选择任意非脚本 MD 档

多库用户推荐选择一个单独的空 MD 档,同时启用“Create file if it doesn’t exist”。

6、配置 Capture format

image

对于 JS 代码,格式:用代码块包裹,语言“js quickadd”。

```js quickadd
代码
```
7-8、点亮闪电、找到命令设置快捷键

image

提醒:设置 QuickAdd Capture 第 5 步一定要选择文档,不要勾选 Capture to active file,
原因见 实现 Vim Mode 的切换 #4 提到的意外。多个代码可以选同一个文档。

QuickAdd Macro 加载外部 JS
一、在外部 JS 书写代码

按需导入 API,如 module.exports = async ({ quickAddApi })=> { 代码 },即可在外部 JS 代码中使用 quickAddApi,无需前加 this.

二、配置 User Scripts

需要快捷键:

1、命名、选择 Macro、点击 Add

image

2、点击小齿轮、点击 Create

image

3、点击 Configure

法 1:直接点击 image

法 2:回到主界面、点击 Manage Macros、点击 Configure

image 20240207210159

4、选择对应外部 JS、点击 Add

image

5、点亮闪电、找到命令设置快捷键

image image

不需要快捷键:

1、同「需要快捷键 > 步骤 3 > 法 2」点击 Manage Macros

2、命名、点击 Add image

3、同「需要快捷键 > 步骤 3 > 法 2」点击 Configure

4、同「需要快捷键 > 步骤 4」

5、按需选择启动插件时加载、在文档加载或在模板加载,实例见相关话题

启动插件时加载:20240207210160

在模板加载示例:

QuickAdd Macro 加载 QuickAdd Capture

通常用于启动插件时静默加载。

第 1-3 步同「QuickAdd Macro 加载外部 JS > 二、配置 User Scripts > 不需要快捷键」第 1-3 步。

第 4 步改为“点击 Add Capture、点击小齿轮”。

image

image

第 5-6 步同「QuickAdd Capture 加载内部代码」第 5-6 步。

第 7 步同「QuickAdd Macro 加载外部 JS > 不需要快捷键 > 第 5 步 > 启动插件时加载」。

最终效果:image

提醒:QuickAdd Macro 设置完直接使用有时会报错,重启一下 Ob 即可。

Templater Hotkeys 加载 MD 脚本档
1、在 MD 档书写代码,格式:用 <%* -%> 包裹
<%*
代码
-%>

image

2、配置 MD 档所在文件目录

image

3、配置 MD 档到 HotKeys

image

4、找到命令设置快捷键

不习惯快捷键,或者移动端,用 Commander 插件 将录入的命令变成一个可交互按钮,放在 Obsidian 的某个栏上。

相关话题:

相互修改

QuickAdd JS 和 Templater JS 交互相关代码存在相互对照。

以选单(suggester)和填空(prompt)为例:

this.quickAddApi.suggester() || tp.system.suggester()

image

this.quickAddApi.inputPrompt() || tp.system.prompt()

image image

基于 JS 的共性,我们可以预先做一些处理,以便日后根据需要相互修改。

一、书写代码时,将存在对照的部分声明为函数,迁移时只需修改函数即可。

举例

1、声明函数,以 Templater 填空为例:

function prompt(str) { return tp.system.prompt(str) }
// 或 let prompt = str=> tp.system.prompt(str)
return await prompt('输入:')

2、Templater → QuickAdd,只需将 tp.system.prompt(str) 修改为 this.quickAddApi.inputPrompt(str)

imageimage

二、适当用通用 API 代替插件 API,减轻修改成本。

如用 app.workspace.getActiveFile()(Obsidian API)代替 tp.file.find_tfile(tp.file.path(1))(Templater API)。

为什么不直接导入 Templater API?
const tp = app.plugins.plugins['templater-obsidian'].templater.current_functions_object

1、楼主测试这样切换文档首次执行命令返回的是上个文档的结果,需再执行一次才能得到正确结果。

2、理论上 Templater JS 代码直接粘贴进 QuickAdd Capture format 即可用,无需代码块包裹,留待自行尝试。

image

三、QuickAdd 内部 JS 代码个别字符可能存在解析问题,可用变通方式。

const bQs = String.fromCharCode(96).repeat(3) 作为 ``` 的变通,
如何设置默认编程语言 #4

此外,如果是正则表达式里有 ```,可用 new RegExp() 作变通,
QuickAdd 正则保值替换选单“简要解析”。

更多请参各插件文档或详询 AI。

7 个赞

好贴 :+1: 必须顶 :arrow_up:

1 个赞

非常好资料,感谢!

理论上 Templater JS 代码直接粘贴进 QuickAdd Capture format 即可用,无需代码块包裹,留待自行尝试。

——这个我试过了,确实可以的。

顺便补充几个「TP函数转通用函数」:

// 获取当前时间
tp.date.now('YYYY-MM-DD')
// ⬇️OB 原生的 MomentJS 写法
moment().format('YYYY-MM-DD');

// 打开特定名称的笔记
tp.file.find_tfile(DailyNoteName)
// ⬇️OB 原生 API 的写法
// 先获取所有Markdown文件
const allFiles = app.vault.getMarkdownFiles();
// 再查找对应名称的文件(注意后面要有 .md)
const targetFile = allFiles.find(file => file.name === DailyNoteName + ".md" );

感谢补充。根据官方文档 Avoid+iterating+all+files+to+find+a+file+by+its+path 的指导思想,假设这里的 DailyNoteName 是不包括后缀的 MD 文档名的字符串,推荐这么找:

const targetFile = app.metadataCache.getFirstLinkpathDest(DailyNoteName, DailyNoteName)
console.log(targetFile)
1 个赞

又学到了,谢谢!

大佬请教个问题,
使用 Quickadd Capture,想要在当前文件中插入一个文件名,同时在相应文件夹下创建相应文件,在 Quickadd 的 Capture format 中输入以下代码:

<%* let name = await tp.system.prompt(“输入名字”,null,true,false)
if (await tp.file.exists(“People” + “/” + name + “.md”) ){}
else {await tp.file.create_new(tp.file.find_tfile(“Templater/PeopleTemplate”), name, false, “People”) }
-%>
[[<%* tR += name %>]]

总是两次弹出窗口,让我输入名字,怎么解决这个问题呢?