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

简介

认识 QuickAdd 界面

QuickAdd Capture 加载内部代码
  1. 任意命名、选择 Capture、点击 Add Choice;点击小齿轮;选择任意非脚本 MD 档

    • 多个代码可以选同一个文档。
    • 多库用户推荐选择一个单独的空 MD 档,同时启用“Create file if it doesn’t exist”。
    • 请尽量选择文档,不要勾选 Capture to active file,
      原因见 实现 Vim Mode 的切换 #4 提到的意外。
  2. 配置 Capture format

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

    ```js quickadd
    代码
    ```
    
  3. 点亮闪电、找到命令设置快捷键

    image

QuickAdd Macro 加载外部 JS

一、在外部 JS 书写代码

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

二、配置 User Scripts

需要快捷键

  1. 任意命名、选择 Macro、点击 Add Choice

  2. 点击小齿轮;点击 Create

    • 法 1:直接点击 Create Macro 旁边的 Configure
    • 法 2:回到主界面、点击 Manage Macros、点击 Configure
  3. 选择对应外部 JS、点击 Add

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

    image image

不需要快捷键

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

  2. 命名、点击 Add

    image

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

  4. 同「需要快捷键 > 步骤 3」选择对应外部 JS

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

QuickAdd Macro 加载 QuickAdd Capture

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

第 1-3 步同「QuickAdd Macro 加载外部 JS > 不需要快捷键」第 1-3 步。

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

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

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

最终效果:

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

Templater Hotkeys 加载 MD 脚本档
  1. 在 MD 档书写代码

    <%*
    代码
    -%>
    

  2. 在插件设置:

    • 配置 MD 档所在文件目录到 Template folder location
    • 配置 MD 档到 Template hotkeys
  3. 找到命令设置快捷键

    image

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

相关话题:

相互修改

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

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

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

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

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

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

二、适当用通用 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 即可用,无需代码块包裹,留待自行尝试。

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

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

此外,如果是正则表达式里有 ```,可用 new RegExp() 作变通,
参 QuickAdd 正则保值替换选单

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

10 个赞

好贴 :+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 %>]]

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