--- trigger: always_on description: Common code patterns and examples --- # Code Examples ## Organize Code Across Multiple Files ### main.ts (minimal, lifecycle only) ```ts import { Plugin } from "obsidian"; import { MySettings, DEFAULT_SETTINGS } from "./settings"; import { registerCommands } from "./commands"; export default class MyPlugin extends Plugin { settings: MySettings; async onload() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); registerCommands(this); } } ``` ### settings.ts ```ts export interface MySettings { enabled: boolean; apiKey: string; } export const DEFAULT_SETTINGS: MySettings = { enabled: true, apiKey: "", }; ``` ### commands/index.ts ```ts import { Plugin } from "obsidian"; import { doSomething } from "./my-command"; export function registerCommands(plugin: Plugin) { plugin.addCommand({ id: "do-something", name: "Do something", callback: () => doSomething(plugin), }); } ``` ## Add a Command ```ts this.addCommand({ id: "your-command-id", name: "Do the thing", callback: () => this.doTheThing(), }); ``` ## Persist Settings ```ts interface MySettings { enabled: boolean } const DEFAULT_SETTINGS: MySettings = { enabled: true }; async onload() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); await this.saveData(this.settings); } ``` ## Register Listeners Safely ```ts this.registerEvent(this.app.workspace.on("file-open", f => { /* ... */ })); this.registerDomEvent(window, "resize", () => { /* ... */ }); this.registerInterval(window.setInterval(() => { /* ... */ }, 1000)); ```