【求助】内置的app.commands.executeCommandById()命令

已用Ob一段时间了,但这个问题一直困扰着我:

[!info]+ 大背景
使用Tempalter插件搭建了一个模板命令:下拉让我选择一个命令,然后会执行这个命令对应的命令id(通过内置的app.commands.executeCommandById()实现)

问题详细描述:

  • 预期:当我想要选择一部分文字后,执行命令,如选择变量,执行 wrapped_by_mustache,就会被 {{}}包裹
  • 问题:选择文字后,执行到app.commands.executeCommandById(),还没有执行我指定的命令时,就会删除我选择的文本,具体定位到这个函数,不知道是不是系统的bug:
 const bytesRead = (await PromisePrototypeThen(
      binding.read(filehandle.fd, buffer, offset, length, -1, kUsePromises),
      undefined,
      handleErrorFromBinding,
    )) ?? 0;
    totalRead += bytesRead;

现状:

目前我只能执行一些插入的命令,不能执行一些基于选择文本的命令

尝试的方案

  1. 直接使用hotkey快捷键执行指定的命令没有这个问题
    • 但我依然还是想通过一个统一的命令面板让我选择命令(记不住太多快捷键)
  2. 也许可以通过templater调用自定义script,而不是执行命令的方式解决
    • 因为实现起来较为复杂(个人认为),还没有研究,如果这个方式没有答案,我会去尝试一下

附:问题具体举例

  1. 命令脚本如下(已注册为Tempalter命令并添加hotkey)
<%
let lstCmds = {
  // Insert:替换所选文字为Mustache语法
  "⚠️INSERT: Mustache(alt+3)": "templater-obsidian:010-Templates/Cmd-Insert-Mustache.md",
};
let keys = Object.keys(lstCmds);
let key = await tp.system.suggester(keys, keys);
if (!key) return;
let cmd = lstCmds[key]
app.commands.executeCommandById(cmd);
-%>
  1. 执行的脚本如下(已注册为Tempalter命令并添加hotkey)
<%*
debugger  // 执行到这里就已经把选中的内容删除了,导致后面什么也拿不到
let selObj = window.getSelection();
-%>
  1. 当我在一篇笔记中选择一段文字后,呼出命令面板,选择这个命令时,会自动删掉我选中的部分

附:版本

  • obsidian:v1.7.7

我理解这是个 tp 模板调用的事

建议把 app.commands.executeCommandById(cmd); 改成 let txt = await tp.file.include("[[子模版名字]]"); 参考 How to use nested suggester to execute multiple templates - Help


根据描述大致改了这两处

1 “命令脚本如下(已注册为Tempalter命令并添加hotkey)” 里的 <% let lstCmds... 似乎应该是 <%* let lstCmds... 需要加星号

此外, 这个模板改成

<%*
let lstCmds = {
  "INSERT: Mustache(alt+3)": "[[仓库里子目录/下面的/具体添加修饰符的模板.md]]"
};
let keys = Object.keys(lstCmds);
let key = await tp.system.suggester(keys, keys);
if (!key) return;
let cmd = lstCmds[key];
let txt = await tp.file.include(cmd);
-%>
<% txt += "(后处理修饰文字 可能用不到) " %>

2 子模版 的 window.getSelection() 改成 tp.file.selection() 更方便

下为完整的子模板

{{<% tp.file.selection() %>}}

完后我这里能实现, 只调出作为网关的总模版, 然后在下拉里选我要执行哪一段具体的文本装饰 (对这个插件不太熟, 可能有更好的办法)