From 0c29680da766a9508b7dd0cc9b85d4e264e8d13c Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Mon, 2 Jun 2025 15:48:13 +0200 Subject: [PATCH] feat: support multi-character suggestions --- .../SuggestionMenu/SuggestionPlugin.ts | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts b/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts index b68618713..520b664d9 100644 --- a/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts +++ b/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts @@ -293,18 +293,28 @@ export class SuggestionMenuProseMirrorPlugin< }, props: { - handleTextInput(view, _from, _to, text) { - if (triggerCharacters.includes(text)) { - view.dispatch(view.state.tr.insertText(text)); - view.dispatch( - view.state.tr - .setMeta(suggestionMenuPluginKey, { - triggerCharacter: text, - }) - .scrollIntoView(), - ); - - return true; + handleTextInput(view, from, to, text) { + // only on insert + if (from === to) { + const doc = view.state.doc; + for (const str of triggerCharacters) { + const snippet = + str.length > 1 + ? doc.textBetween(from - str.length, from) + text + : text; + + if (str === snippet) { + view.dispatch(view.state.tr.insertText(text)); + view.dispatch( + view.state.tr + .setMeta(suggestionMenuPluginKey, { + triggerCharacter: snippet, + }) + .scrollIntoView(), + ); + return true; + } + } } return false; },