Editor Commands
On Mobile
On mobile, there are two types of editor-related commands:
- Editor commands
- Note screen commands
These commands can be used in different cases and run in different contexts.
Note screen commands
These commands are stored in packages/app-mobile/components/screens/Note/commands
. Note screen commands run in the main React Native JavaScript context.
After adding a new note screen command, run yarn buildScriptIndexes
from the top-level Joplin directory.
CodeMirror commands
These commands are stored in packages/editor/CodeMirror/editorCommands/editorCommands.ts
and are shared between mobile and desktop. On mobile, these commands run in the editor WebView
, giving them access to the CodeMirror API.
Although all of these commands can be accessed by plugins using editor.execCommand
, some are registered directly with the CommandService
. Registering an editor command with the CommandService
can be useful in a few circumstances. In particular, it:
- Allows the command to be run directly using
CommandService.instance().execute('commandName')
. This makes it simpler for plugins to access the command. - Allows adding a toolbar button for the command.
New editor commands registered with CommandService
should:
- Be added to
NoteEditor/commandDeclarations.ts
in theapp-mobile
package. - Be given the
editor.
prefix to mark them as editor commands. This changes how the commands are applied, for example, by focusing the editor after the command completes.
While testing a new editor command, be sure to watch the bundled editor JavaScript for changes. See BUILD.md
for details.
On Desktop
On desktop, the different note editor types each register their own command handlers. For example, the useEditorCommands.ts
hook in NoteBody/CodeMirror/v6/useEditorCommands.ts
is responsible for registering the different editor commands.
In most cases, to share code with the mobile app, new commands here should call:
// For some SomeCommand implemented in packages/editor
editorRef.current.execCommand(EditorCommandType.SomeCommand, ...argsHere)