Skip to content

ctx.* 服务速查

按此签名调用,不要臆测方法名。

服务列表(inject 声明)

  • vaultgetMarkdownPaths() → string[](vault 相对路径,别名 listMarkdown);read(path) → string;write(path, content)create(path, content)createFolder(path)(逐层创建);delete(path)rename(old, new)on(ev, cb)vault/modify|create|delete|rename
  • viewsregisterView(type, (leaf) => view)open(type)
  • commandsaddCommand({ id, name, callback })
  • ribbonaddRibbonIcon(icon, title, callback){ remove }
  • statusbaraddStatusBarItem(){ el, remove }
  • noticenotice(message, timeoutMs?)
  • workspacegetActiveFile() → string | null;onFileOpen(cb)
  • editorgetSelection() / insertText(text) / replaceSelection(text)(无活动编辑器返回 null)
  • toolsCompatregister({ name, description, input, execute })(execute 返回 JSON 可序列化对象)
  • settingsget(key, fallback) / set(key, value)registerSettingTab(tab)
  • sandbox / approval / sessionLog / llmCaller / dshI18n:见对应章节

事件(ctx.on)

dsh/session/event(会话事件)、vault/modify|create|delete|renameworkspace/file-opendsh/waiting-approval(审批弹窗打开)。

面板插件

js
const { ItemView } = require('obsidian')
class MyView extends ItemView {
  getViewType() { return 'my-view' }
  getDisplayText() { return '我的面板' }
  onOpen() { this.contentEl.createEl('h3', { text: '你好' }) }
}
module.exports = {
  name: 'my-plugin',
  inject: ['views', 'commands'],
  apply(ctx) {
    ctx.effect(() => [
      ctx.views.registerView('my-view', (leaf) => new MyView(leaf)),
      ctx.commands.addCommand({ id: 'open', name: '打开面板', callback: () => ctx.views.open('my-view') }),
    ])
  },
}