Spaces:
Sleeping
Sleeping
| A view plugin is an [[Editor extensions|editor extension]] that gives you access to the editor [[Viewport]]. | |
| > [!note] | |
| > This page aims to distill the official CodeMirror 6 documentation for Obsidian plugin developers. For more information on state management, refer to [Affecting the View](https://codemirror.net/docs/guide/#affecting-the-view). | |
| ## Prerequisites | |
| - Basic understanding of the [[Viewport]]. | |
| ## Creating a view plugin | |
| View plugins are editor extensions that run _after_ the viewport has been recomputed. While this means that they can access the viewport, it also means that a view plugin can't make any changes that would impact the viewport. For example, by inserting blocks or line breaks into the document. | |
| > [!tip] | |
| > If you want to make changes that impact the vertical layout of the editor, by for example inserting blocks and line breaks, you need to use a [[State fields|state field]]. | |
| To create a view plugin, create a class that implements [PluginValue](https://codemirror.net/docs/ref/#view.PluginValue) and pass it to the [ViewPlugin.fromClass()](https://codemirror.net/docs/ref/#view.ViewPlugin^fromClass) function. | |
| ```ts | |
| import { | |
| ViewUpdate, | |
| PluginValue, | |
| EditorView, | |
| ViewPlugin, | |
| } from "@codemirror/view"; | |
| class ExamplePlugin implements PluginValue { | |
| constructor(view: EditorView) { | |
| // ... | |
| } | |
| update(update: ViewUpdate) { | |
| // ... | |
| } | |
| destroy() { | |
| // ... | |
| } | |
| } | |
| export const examplePlugin = ViewPlugin.fromClass(ExamplePlugin); | |
| ``` | |
| The three methods of the view plugin control its lifecycle: | |
| - `constructor()` initializes the plugin. | |
| - `update()` updates your plugin when something has changed, for example when the user entered or selected some text. | |
| - `destroy()` cleans up after the plugin. | |
| While the view plugin in the example works, it doesn't do much. If you want to better understand what causes the plugin to update, you can add a `console.log(update);` line to the `update()` method to print all updates to the console. | |
| ## Next steps | |
| Provide [[Decorations]] from your view plugin to change how to display the document. | |