如何获取编辑器事件-插入链接时,修改链接标题

当使用 [[ 插入链接时, 系统会给出一些列表让我们选择。我需要在插入链接的时候修改链接标题,请问如何获取“插入链接”这个事件?
image

1 个赞

ISuggestOwner 类选中选项时可以加回调,这个类被继承两次,到 EditorSuggestContext,通过这个类,可以在编辑器触发自动补全的时候获取 suggest 对象,以跟踪其选中事件。楼主在api里搜一下 suggest 关键字应该就有了

你好,感谢你的回复,我查阅了官方文档以及谷歌搜索没有找到任何有关获取编辑器选中选项时添加回调信息。经过查阅源码我只在Plugins类发现了这样一段代码

    /**
     * Register an EditorSuggest which can provide live suggestions while the user is typing.
     * @public
     */
    registerEditorSuggest(editorSuggest: EditorSuggest<any>): void;

但是仍然有以下疑问:

  1. 插件是什么时候如何调用registerEditorSuggest方法注入EditorSuggest的?我能否获取到这个EditorSuggest对象?
  2. 如何在onLoad方法中获取到EditorSuggest并添加我需要的回调方法?

官方给出的示例中,监听事件的方法都是在onload中使用

this.registerEvent(
	this.app.workspace.on("事件名称",  (回调参数)=> {
		// 处理事件
}));

其中事件名称可以在obsidian.d.tsworkspace.on 中查找到。
但是我找不到任何关于EditorSuggest事件的事件名称。

已注册的 editorSuggest 可以在 app.workspace.editorSuggest.suggests 数组里找到,具体哪个是文件链接 suggest 需要自己测试,我测出来是这个数组的首个元素(下标0),可能有 id 之类的更加精确的识别方法更好,不知道直接取首个 suggest 会不会遇到冲突,选错对象。

然后就可以拿着 app.workspace.editorSuggest.suggests[0] 这个对象搞事情,比如

let orig_fn = app.workspace.editorSuggest.suggests[0].selectSuggestion;
app.workspace.editorSuggest.suggests[0].selectSuggestion =
    function (value, evt) {
        console.log("patches here");
        orig_fn.apply(this, [value, evt]);
        console.log("also here");
    }

我现在只能做到这里,能够在这个函数执行前后玩些花活,但离你想要的”修改链接标题“还有些距离。value 打 log 出来是个 file 对象,取值并写入编辑器的过程是在这个函数内部完成的,看看你要怎么修改了。

关于找到 suggests 里面哪个对象是插入文件链接的,可以在 console 里面打

setInterval(() => {
    console.log(
        app.workspace.editorSuggest.suggests.findIndex(
            (suggest) => suggest == app.workspace.editorSuggest.currentSuggest
        )
    )
}, 4000)

每4秒 log 一次当前打开的 suggest 下标,然后我们就在编辑器里激活 suggest 就行

关于 registerEditorSuggest,这将允许你为你的插件添加独有的 suggest,比如通过 @字符触发补全人名之类的,看你的需求似乎并不能通过新添加 suggest 来解决。或许你可以实验一下重载官方的 [[ trigger。至于在什么时候添加,可以参考类似的插件