The answer is wrapping the document.setText
into ApplicationManager.getApplication().runWriteAction
and CommandProcessor.getInstance().runUndoTransparentAction
.
I found an example TrailingSpacesStripper among intellij-community sources on githib:
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()));
}
});
}
});
}
});
}
}