适用全部类型文件。
实例一:按住 Alt 键双击文件列表
效果 GIF
注:Obsidian v1.6.2 似乎更改了对应元素类名,可自行尝试寻找更改为新类名,不再维护。
const uniEv = (id, item, type, func)=> { item[id] && item.removeEventListener(type, item[id]); item[id] = func; item.addEventListener(type, item[id]) }
uniEv('ev', document.querySelector('.tree-item.nav-folder.mod-root'), 'dblclick', ev=> ev.altKey && app.openWithDefaultApp(ev.target.dataset.path))
实例二:快速切换选单 & 原文选区
原文选区以正则匹配判断,见变量 rgx
。
选中内容匹配,以默认应用打开所选。通常用于打开文中图片。
无选中或选中内容不匹配,弹出快速切换选单,当前活动文档始终位于第一项。
先选择文档,再选择 VSCode 打开或显示在系统文件资源管理器。
若用 VSCode 打开,当所选文档为当前活动文档时,将跳转到编辑器同一行。
效果 GIF
F8 是展示设置的快捷键。
注:老代码了,请更多参考思路。
const { exec } = require('child_process')
, rgx = /^!|\[(?!\[).*?\]\(|\)$|\[\[|\]\]|\|.*/g
, suggest = arr=> this.quickAddApi.suggester(p=> p, arr)
, pin = (arr, x)=> {
const pin = arr.indexOf(x); if (pin > -1) { arr.splice(pin, 1); arr.unshift(x) }; return arr
}
, act = app.workspace.activeEditor; let line; if (act) line = act.editor.getCursor().line
const selected = String(getSelection()), currPath = app.workspace.getActiveFile().path
if (selected.match(rgx)) {
const target = app.metadataCache.getFirstLinkpathDest(selected.replace(rgx, ''), currPath)
if (target) app.openWithDefaultApp(target)
} else {
const allPaths = app.vault.getFiles().map(p=> p.path)
const path = await suggest(pin(allPaths, currPath)); if (!path) return
const fullPath = app.vault.adapter.getFullPath(path), sus = ['VSCode', '所在目录']
switch (await suggest(sus)) {
case sus[0]: exec(`code -g "${fullPath}:${path==currPath?(line+1):1}"`); break
case sus[1]: app.showInFolder(path); break
}}