@Override
    public void execute(
        @NotNull final Editor editor, char charTyped, @NotNull DataContext dataContext) {
      if (editor.isViewer()) return;

      Document doc = editor.getDocument();
      Project project = CommonDataKeys.PROJECT.getData(dataContext);
      if (!FileDocumentManager.getInstance().requestWriting(doc, project)) {
        return;
      }

      doc.startGuardedBlockChecking();
      try {
        final String str = String.valueOf(charTyped);
        CommandProcessor.getInstance()
            .setCurrentCommandName(EditorBundle.message("typing.in.editor.command.name"));
        EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, str, true);
      } catch (ReadOnlyFragmentModificationException e) {
        EditorActionManager.getInstance().getReadonlyFragmentModificationHandler(doc).handle(e);
      } finally {
        doc.stopGuardedBlockChecking();
      }
    }
 public static void typeInStringAtCaretHonorMultipleCarets(
     final Editor editor, @NotNull final String str, final boolean toProcessOverwriteMode) {
   typeInStringAtCaretHonorMultipleCarets(editor, str, toProcessOverwriteMode, str.length());
 }