latex suite 插件如何调用有参命令?

我知道 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 好像就没有传参这个选项 :disappointed_relieved:

因为 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 里面调用 :smiling_face_with_tear: 还是正常地用命令面板操作吧,其实也就多敲几个字符,不是什么不能接受的问题,还好

找到方法调用了,不过限制颇多:

{trigger: "t", replacement: (result) => {
    app.commands.executeCommandById("命令");
    return result;
}, options: "v"},

首先,必须先选中字符,然后切换到英文输入法,再输入字符,比如 t 这个字符,就能用 latex suite 可视模式触发有参命令。

感觉挺麻烦的,先选中,某些情况下必须切换输入法,而且最多最少都输入一个字符……

不过后面发生了一件让我惊讶的事——我发现如果把触发字符换成中英文都通用的字符,就可以直接触发命令,其中包括:

空格、+、=、@、#、%、&、*、/、|,可以直接触发命令。

也就是说,有十个字符可以在选中字符的情况下,直接对字符进行操作,比如获得翻译结果、调用浏览器进行搜索

其中,空格和/对我来说是最方便的。折腾两天,算是获得了两个快速命令吧 :saluting_face:

这和选中后按快捷键调用也没啥区别吧

右手选中以后,敲一下空格比敲命令快一些 :thinking:

不过细究起来也差不多吧哈哈 :stuck_out_tongue_closed_eyes: