IntelliJ Idea 插件无法撤消 document.setText

kav*_*i77 4 java intellij-idea intellij-plugin

我正在为 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()));                        
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,我唯一的问题是当这个插件运行时,我想撤消更改,我收到以下错误消息:

Cannot Undo
Following files have changes that cannot be undone:
Run Code Online (Sandbox Code Playgroud)

任何Idea?:-)

kav*_*i77 5

答案是将 包装document.setTextApplicationManager.getApplication().runWriteActionCommandProcessor.getInstance().runUndoTransparentAction

我在 gitib 上的 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()));
                                        }
                                    });
                            }
                        });
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)