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

答案是将 in和包裹document.setText起来。ApplicationManager.getApplication().runWriteActionCommandProcessor.getInstance().runUndoTransparentAction

我在 githib 上的 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 回答