我知道 latex suite 插件可以通过打出特定文字调用无参命令,例如
{trigger: "设置", replacement: () => {
app.commands.executeCommandById("app:open-settings");
return "";
}, options: "t"},
就能打开设置界面。
问题是如果需要传递参数呢?例如,传递此时光标选中的文本到命令中,之后再调用命令,该怎么写?反复尝试后发现仍然是 undefined
希望有经验的大家不吝赐教,感谢
{
trigger: "r",
replacement: (self) => {new Notice(`hello ${self}`); return self;},
options: "v"
}
感谢回复,不过并不是我想调用并不是这类命令,而是 app.commands 里面的命令。
打个比方说,假如我想调用词典查询一个词语 apple
,我需要先选中这个词语,然后调用 ctrl + p,敲入“词典翻译”,回车后得到结果。或者要选中后调用快捷键命令。
而假设我先敲入 apple:tran
,然后调用 latex suite,就能利用正则把前一个词筛出来,再通过 replacement 里面的 executeCommandById
调用词典翻译即可,省去上面的几个步骤,只需要直接敲几个字符。
问题就是卡在 executeCommandById
好像就没有传参这个选项
因为 command 本来就没有参数。
command 的注册一般是这样的:
this.addCommand({
id: "xxxxx",
name: "xxxx",
callback: () => {...}
})
// 或者
this.addCommand({
id: "xxxxx",
name: "xxxx",
editorCallback: (editor: Editor, view: MarkdownView) => {...}
})
无论是哪种 callback,都是不需要自己传参数的。 你说的那种选中一个单词,然后按命令搜索,这个单词并不是作为函数参数传进 callback的,而是在 callback 函数体里面获取的,类似:
editorCallback: (editor: Editor, view: MarkdownView) => {
const word = editor.getSelection();
search(word);
}
所以不可能用 app.executeCommandById
来传递参数,因为实际执行的函数本身就不需要传参数。
1 个赞
我看见你一开始问的是这个,这种情况直接调用 executeCommandById
就行,一般这种命令会自动获取 selection 的内容。
但是后面的需求是不需要先选中,能直接调用搜索:
这种情况可能需要你研究一下你用的那个词典插件,看看插件类里面有没有可以直接调用的搜索成员函数,然后你可以直接调用:
class DictPlugin {
// ...
search(word: string) {...}
// ...
}
// 规则
{
trigger: /([a-zA-Z]+):tran/,
replacement: (match) => {
app.plugins.plugins['dict-plugin'].search(match[1]);
}
}
感觉蛮难的,找出来也很难从 latex suite 里面调用 还是正常地用命令面板操作吧,其实也就多敲几个字符,不是什么不能接受的问题,还好
找到方法调用了,不过限制颇多:
{trigger: "t", replacement: (result) => {
app.commands.executeCommandById("命令");
return result;
}, options: "v"},
首先,必须先选中字符,然后切换到英文输入法,再输入字符,比如 t
这个字符,就能用 latex suite 可视模式触发有参命令。
感觉挺麻烦的,先选中,某些情况下必须切换输入法,而且最多最少都输入一个字符……
不过后面发生了一件让我惊讶的事——我发现如果把触发字符换成中英文都通用的字符,就可以直接触发命令,其中包括:
空格、+、=、@、#、%、&、*、/、|,可以直接触发命令。
也就是说,有十个字符可以在选中字符的情况下,直接对字符进行操作,比如获得翻译结果、调用浏览器进行搜索
其中,空格和/对我来说是最方便的。折腾两天,算是获得了两个快速命令吧