diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index 6976acea0..030bba37d 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -1925,14 +1925,26 @@ describe "TextEditorComponent", -> expect(editor.lineTextForBufferRow(0)).toBe 'var quicksort = function () {' it "groups events that occur close together in time into single undo entries", -> + currentTime = 0 + spyOn(Date, 'now').andCallFake -> currentTime + + atom.config.set('editor.undoGroupingInterval', 100) + editor.setText("") componentNode.dispatchEvent(buildTextInputEvent(data: 'x', target: inputNode)) - componentNode.dispatchEvent(buildTextInputEvent(data: 'y', target: inputNode)) - componentNode.dispatchEvent(buildTextInputEvent(data: 'z', target: inputNode)) + currentTime += 99 + componentNode.dispatchEvent(buildTextInputEvent(data: 'y', target: inputNode)) + + currentTime += 99 componentNode.dispatchEvent(new CustomEvent('editor:duplicate-lines', bubbles: true, cancelable: true)) - expect(editor.getText()).toBe "xyz\nxyz" + currentTime += 100 + componentNode.dispatchEvent(new CustomEvent('editor:duplicate-lines', bubbles: true, cancelable: true)) + expect(editor.getText()).toBe "xy\nxy\nxy" + + componentNode.dispatchEvent(new CustomEvent('core:undo', bubbles: true, cancelable: true)) + expect(editor.getText()).toBe "xy\nxy" componentNode.dispatchEvent(new CustomEvent('core:undo', bubbles: true, cancelable: true)) expect(editor.getText()).toBe "" diff --git a/src/config-schema.coffee b/src/config-schema.coffee index afb1af4ce..49805eaf4 100644 --- a/src/config-schema.coffee +++ b/src/config-schema.coffee @@ -105,6 +105,11 @@ module.exports = scrollPastEnd: type: 'boolean' default: false + undoGroupingInterval: + type: 'integer' + default: 500 + minimum: 0 + description: 'Time interval in milliseconds within which operations will be grouped in the undo history' useHardwareAcceleration: type: 'boolean' default: true diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index 117ce168c..c6e1af08b 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -21,7 +21,6 @@ TextEditorComponent = React.createClass statics: performSyncUpdates: false - groupingInterval: 500 visible: false autoHeight: false @@ -458,7 +457,7 @@ TextEditorComponent = React.createClass selectedLength = inputNode.selectionEnd - inputNode.selectionStart editor.selectLeft() if selectedLength is 1 - insertedRange = editor.transact @constructor.groupingInterval, -> + insertedRange = editor.transact atom.config.get('editor.undoGroupingInterval'), -> editor.insertText(event.data) inputNode.value = event.data if insertedRange diff --git a/src/text-editor-element.coffee b/src/text-editor-element.coffee index 3ad46ffed..377aa2a55 100644 --- a/src/text-editor-element.coffee +++ b/src/text-editor-element.coffee @@ -150,7 +150,7 @@ stopEventPropagationAndGroupUndo = (commandListeners) -> newCommandListeners[commandName] = (event) -> event.stopPropagation() model = @getModel() - model.transact TextEditorComponent.groupingInterval, -> + model.transact atom.config.get('editor.undoGroupingInterval'), -> commandListener.call(model, event) newCommandListeners