Once you've built your editor extension, you might want to communicate with it from outside the editor. For example, through a [[Commands|command]], or a [[Ribbon actions|ribbon action]].
You can access the CodeMirror 6 editor from a [[MarkdownView|MarkdownView]]. However, since the Obsidian API doesn't actually expose the editor, you need to tell TypeScript to trust that it's there, using `@ts-expect-error`.
```ts
import { EditorView } from '@codemirror/view';
// @ts-expect-error, not typed
const editorView = view.editor.cm as EditorView;
```
## View plugin
You can access the [[View plugins|view plugin]] instance from the `EditorView.plugin()` method.
```ts
this.addCommand({
id: 'example-editor-command',
name: 'Example editor command',
editorCallback: (editor, view) => {
// @ts-expect-error, not typed
const editorView = view.editor.cm as EditorView;
const plugin = editorView.plugin(examplePlugin);
if (plugin) {
plugin.addPointerToSelection(editorView);
}
},
});
```
## State field
You can dispatch changes and [[State fields#Dispatching state effects|dispatch state effects]] directly on the editor view.
```ts
this.addCommand({
id: 'example-editor-command',
name: 'Example editor command',
editorCallback: (editor, view) => {
// @ts-expect-error, not typed
const editorView = view.editor.cm as EditorView;
editorView.dispatch({
effects: [
// ...
],
});
},
});
```