3

私は IntelliJ Idea 13 のプラグインに取り組んでいbeforeDocumentSavingますdocument.setText

public class AppendAction implements ApplicationComponent
{
    @Override public void initComponent()
    {
        MessageBus bus = ApplicationManager.getApplication().getMessageBus();
        MessageBusConnection connection = bus.connect();

        connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter()
            {
                @Override public void beforeDocumentSaving(Document document)
                {
                    document.setText(appendSomething(document.getText()));                        
                }
            });
    }
}

これはうまく機能します。私の唯一の問題は、このプラグインが実行され、変更を元に戻したいときに、次のエラー メッセージが表示されることです。

Cannot Undo
Following files have changes that cannot be undone:

ありますかIdea?:-)

4

2 に答える 2

4

答えは、document.setTextApplicationManager.getApplication().runWriteActionとにラップすることCommandProcessor.getInstance().runUndoTransparentActionです。

github の intellij-community ソースの中から TrailingSpacesStripper の例を見つけました: https://github.com/JetBrains/intellij-community/blob/master/platform/platform-impl/src/com/intellij/openapi/editor/impl/TrailingSpacesStripper .java

public class AppendAction implements ApplicationComponent
{
    @Override public void initComponent()
    {
        MessageBus bus = ApplicationManager.getApplication().getMessageBus();
        MessageBusConnection connection = bus.connect();

        connection.subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter()
            {
                @Override public void beforeDocumentSaving(final Document document)
                {
                    ApplicationManager.getApplication().runWriteAction(new DocumentRunnable(document, null)
                        {
                            @Override public void run()
                            {
                                CommandProcessor.getInstance().runUndoTransparentAction(new Runnable()
                                    {
                                        @Override public void run()
                                        {
                                            document.setText(appendSomething(document.getText()));
                                        }
                                    });
                            }
                        });
                }
            });
    }
}
于 2014-01-06T13:22:59.853 に答える
2

CommandProcessor API を介して変更をラップする必要があります。

IntelliJ IDEA アーキテクチャの概要から:

ドキュメントの内容を変更するすべての操作は、コマンドでラップする必要があります(CommandProcessor.getInstance().executeCommand())。executeCommand() 呼び出しはネストでき、最も外側の executeCommand 呼び出しが元に戻すスタックに追加されます。コマンド内で複数のドキュメントが変更されている場合、このコマンドを元に戻すと、デフォルトでユーザーに確認ダイアログが表示されます。

于 2014-01-06T12:03:02.437 に答える