在新窗口打开内链的快捷键是什么?

如题, 以及能否修改为左键默认在新窗口打开双链, ctrl+左键在当前页面或新标签页打开呢

尝试的方法

尝试了社区的new note new window插件, 很遗憾不起作用
发现在ob自己设置里面可以设置快捷键, 但是结果还是在新标签页打开而不是新窗口

发现在ob自己设置里面可以设置快捷键, 但是结果还是在新标签页打开而不是新窗口

并不是快捷键不生效,而是,在实时预览模式下,需要把光标放到链接所在的行,而预览模式下则鼠标需要放到链接上。

原因是ob获取鼠标处的链接通过两种方式,一种是光标所在位置,一种数鼠标所在坐标。而通过快捷键打开是不存在鼠标事件的,只能通过光标位置获取,而按下快捷键时,光标通常并不在链接处,这是个坑。

如果能接受这些,并且正确使用,看到这里就可以了。

当然也有变通方法,比如监听鼠标移入事件并记录下来,按下快捷键时通过上次的鼠标位子来定位链接。由于编辑器内容和标签页是实时变化的,所以只能通过委托监听和active-leaf-change事件来实现。

这是核心代码用来打开链接处的新窗口

function openInternalLinkInNewWindow(e) {
  const activeView = app.workspace.getActiveFileView();
  if (activeView && activeView.getViewType() === "markdown") {
    const token = activeView.editor.getClickableTokenAt(e?activeView.editor.posAtMouse(e):activeView.editor.getCursor());
    if (token?.type === "internal-link") {
      const newLeaf = app.workspace.getLeaf('window');
      newLeaf.openLinkText(token.text, activeView.file.path);
    }
  }
}

e参数接受鼠标事件event,不传参数即通过光标位置获取。

当然,如果想更改原有的鼠标点击事件,也是可以的,下面的代码是通过覆盖官方默认的鼠标点击函数triggerClickableToken的方式实现的

const originTriggerClickableToken=app.workspace.activeLeaf.view.editMode.triggerClickableToken.bind(app.workspace.activeLeaf.view.editMode);
app.workspace.activeLeaf.view.editMode.triggerClickableToken=(e,t)=>{
  // 你的逻辑可以在这里处理
  console.log(e,t);
  // 调用原有函数
  originTriggerClickableToken(e,t)
}

这里首先通过originTriggerClickableToken存储一份原有函数,然后通过重写默认函数来达到自定义目的。参数e是getClickableTokenAt返回对象,参数t是undefined, true/false, window, tab, split,具体请在app.js中搜索相关函数查看。

注意:以上只是通过核心代码提供一种改造思路,具体实现可能会涉及很多细节和边界条件等,只能靠自己慢慢探索了。

2 个赞

谢谢大佬, 我研究一下

使用鼠标中键点击