已用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;
现状:
目前我只能执行一些插入的命令,不能执行一些基于选择文本的命令
尝试的方案
- 直接使用hotkey快捷键执行指定的命令没有这个问题
- 但我依然还是想通过一个统一的命令面板让我选择命令(记不住太多快捷键)
- 也许可以通过templater调用自定义script,而不是执行命令的方式解决
- 因为实现起来较为复杂(个人认为),还没有研究,如果这个方式没有答案,我会去尝试一下
附:问题具体举例
- 命令脚本如下(已注册为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);
-%>
- 执行的脚本如下(已注册为Tempalter命令并添加hotkey)
<%*
debugger // 执行到这里就已经把选中的内容删除了,导致后面什么也拿不到
let selObj = window.getSelection();
-%>
- 当我在一篇笔记中选择一段文字后,呼出命令面板,选择这个命令时,会自动删掉我选中的部分
附:版本
- obsidian:v1.7.7