From 1f9a7599b7c539fa844ae670f6bc02912845fe29 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 12 Dec 2013 17:30:22 -0800 Subject: [PATCH 01/24] cmd-w works anywhere in the editor --- spec/pane-spec.coffee | 13 ------------- spec/workspace-view-spec.coffee | 9 +++++++++ src/pane.coffee | 1 - src/workspace-view.coffee | 5 +++++ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index d47d0687b..504208c8a 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -299,19 +299,6 @@ describe "Pane", -> pane2.showItemAtIndex(1) expect(pane2.activeView.data('preservative')).toBe 1234 - describe "core:close", -> - it "destroys the active item and does not bubble the event", -> - containerCloseHandler = jasmine.createSpy("containerCloseHandler") - container.on 'core:close', containerCloseHandler - - pane.showItem(editor1) - initialItemCount = pane.getItems().length - pane.trigger 'core:close' - expect(pane.getItems().length).toBe initialItemCount - 1 - expect(editor1.destroyed).toBeTruthy() - - expect(containerCloseHandler).not.toHaveBeenCalled() - describe "pane:close", -> it "destroys all items and removes the pane", -> pane.showItem(editor1) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index a8449cc76..30face645 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -553,3 +553,12 @@ describe "WorkspaceView", -> expect(workspace.getActivePaneItem().getUri()).toBe 'b' workspace.reopenItemSync() expect(workspace.getActivePaneItem().getUri()).toBe 'a' + + describe "core:close", -> + it "closes the active editor until there are none", -> + atom.project.openSync('../sample.txt') + expect(atom.workspaceView.getActivePane().getItems()).toHaveLength 1 + atom.workspaceView.trigger('core:close') + expect(atom.workspaceView.getActivePane()).not.toBeDefined() + atom.workspaceView.trigger('core:close') + expect(atom.workspaceView.getActivePane()).not.toBeDefined() diff --git a/src/pane.coffee b/src/pane.coffee index 326c3a2af..dc1729d32 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -63,7 +63,6 @@ class Pane extends View unless activeItemUri? and @showItemForUri(activeItemUri) @showItem(@items[0]) if @items.length > 0 - @command 'core:close', @destroyActiveItem @command 'core:save', @saveActiveItem @command 'core:save-as', @saveActiveItemAs @command 'pane:save-items', @saveItems diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index d56091dd9..a28fb8c1f 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -125,6 +125,7 @@ class WorkspaceView extends View atom.config.toggle("editor.autoIndent") @command 'pane:reopen-closed-item', => @reopenItemSync() + @command 'core:close', => @destroyActivePaneItem() # Private: serialize: -> @@ -280,6 +281,10 @@ class WorkspaceView extends View getActiveView: -> @panes.getActiveView() + # Public: destroy/close the active item. + destroyActivePaneItem: -> + @getActivePane()?.destroyActiveItem() + # Public: Focuses the previous pane by id. focusPreviousPane: -> @panes.focusPreviousPane() From a25812dca7d30a289e8970dda3ffda31c20814c9 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 12 Dec 2013 17:43:46 -0800 Subject: [PATCH 02/24] Move cmd-s and cmd-S to workspaceView --- spec/pane-spec.coffee | 16 ++++++++-------- spec/workspace-view-spec.coffee | 19 +++++++++++++++++++ src/pane.coffee | 2 -- src/workspace-view.coffee | 11 +++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index 504208c8a..9b28b2250 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -314,20 +314,20 @@ describe "Pane", -> expect(editor2.destroyed).toBeTruthy() expect(pane.getItems()).toEqual [editor1] - describe "core:save", -> + describe "saveActiveItem", -> describe "when the current item has a uri", -> describe "when the current item has a save method", -> it "saves the current item", -> spyOn(editor2, 'save') pane.showItem(editor2) - pane.trigger 'core:save' + pane.saveActiveItem() expect(editor2.save).toHaveBeenCalled() describe "when the current item has no save method", -> it "does nothing", -> pane.activeItem.getUri = -> 'you are eye' expect(pane.activeItem.save).toBeUndefined() - pane.trigger 'core:save' + pane.saveActiveItem() describe "when the current item has no uri", -> beforeEach -> @@ -339,7 +339,7 @@ describe "Pane", -> spyOn(newEditor, 'saveAs') pane.showItem(newEditor) - pane.trigger 'core:save' + pane.saveActiveItem() expect(atom.showSaveDialogSync).toHaveBeenCalled() expect(newEditor.saveAs).toHaveBeenCalledWith('/selected/path') @@ -347,10 +347,10 @@ describe "Pane", -> describe "when the current item has no saveAs method", -> it "does nothing", -> expect(pane.activeItem.saveAs).toBeUndefined() - pane.trigger 'core:save' + pane.saveActiveItem() expect(atom.showSaveDialogSync).not.toHaveBeenCalled() - describe "core:save-as", -> + describe "saveActiveItemAs", -> beforeEach -> spyOn(atom, 'showSaveDialogSync').andReturn('/selected/path') @@ -359,7 +359,7 @@ describe "Pane", -> spyOn(editor2, 'saveAs') pane.showItem(editor2) - pane.trigger 'core:save-as' + pane.saveActiveItemAs() expect(atom.showSaveDialogSync).toHaveBeenCalledWith(path.dirname(editor2.getPath())) expect(editor2.saveAs).toHaveBeenCalledWith('/selected/path') @@ -367,7 +367,7 @@ describe "Pane", -> describe "when the current item does not have a saveAs method", -> it "does nothing", -> expect(pane.activeItem.saveAs).toBeUndefined() - pane.trigger 'core:save-as' + pane.saveActiveItemAs() expect(atom.showSaveDialogSync).not.toHaveBeenCalled() describe "pane:show-next-item and pane:show-previous-item", -> diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index 30face645..c013d2ffa 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -562,3 +562,22 @@ describe "WorkspaceView", -> expect(atom.workspaceView.getActivePane()).not.toBeDefined() atom.workspaceView.trigger('core:close') expect(atom.workspaceView.getActivePane()).not.toBeDefined() + + describe "core:save", -> + it "saves active editor until there are none", -> + editor = atom.project.openSync('../sample.txt') + spyOn(editor, 'save') + atom.workspaceView.getActivePane().showItem(editor) + atom.workspaceView.trigger('core:save') + expect(editor.save).toHaveBeenCalled() + + describe "core:save-as", -> + beforeEach -> + spyOn(atom, 'showSaveDialogSync').andReturn('/selected/path') + + it "saves active editor until there are none", -> + editor = atom.project.openSync('../sample.txt') + spyOn(editor, 'saveAs') + atom.workspaceView.getActivePane().showItem(editor) + atom.workspaceView.trigger('core:save-as') + expect(editor.saveAs).toHaveBeenCalled() diff --git a/src/pane.coffee b/src/pane.coffee index dc1729d32..ab939e5dd 100644 --- a/src/pane.coffee +++ b/src/pane.coffee @@ -63,8 +63,6 @@ class Pane extends View unless activeItemUri? and @showItemForUri(activeItemUri) @showItem(@items[0]) if @items.length > 0 - @command 'core:save', @saveActiveItem - @command 'core:save-as', @saveActiveItemAs @command 'pane:save-items', @saveItems @command 'pane:show-next-item', @showNextItem @command 'pane:show-previous-item', @showPreviousItem diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee index a28fb8c1f..bffaa2f6c 100644 --- a/src/workspace-view.coffee +++ b/src/workspace-view.coffee @@ -125,7 +125,10 @@ class WorkspaceView extends View atom.config.toggle("editor.autoIndent") @command 'pane:reopen-closed-item', => @reopenItemSync() + @command 'core:close', => @destroyActivePaneItem() + @command 'core:save', => @saveActivePaneItem() + @command 'core:save-as', => @saveActivePaneItemAs() # Private: serialize: -> @@ -285,6 +288,14 @@ class WorkspaceView extends View destroyActivePaneItem: -> @getActivePane()?.destroyActiveItem() + # Public: save the active item. + saveActivePaneItem: -> + @getActivePane()?.saveActiveItem() + + # Public: save the active item as. + saveActivePaneItemAs: -> + @getActivePane()?.saveActiveItemAs() + # Public: Focuses the previous pane by id. focusPreviousPane: -> @panes.focusPreviousPane() From e8c50270261fed68c5a52f72607e7190ed015523 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 13 Dec 2013 10:28:38 -0800 Subject: [PATCH 03/24] :lipstick: Update specs to use ::function() format --- spec/pane-spec.coffee | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spec/pane-spec.coffee b/spec/pane-spec.coffee index 9b28b2250..e8242b912 100644 --- a/spec/pane-spec.coffee +++ b/spec/pane-spec.coffee @@ -28,11 +28,11 @@ describe "Pane", -> afterEach -> atom.deserializers.remove(TestView) - describe ".initialize(items...)", -> + describe "::initialize(items...)", -> it "displays the first item in the pane", -> expect(pane.itemViews.find('#view-1')).toExist() - describe ".showItem(item)", -> + describe "::showItem(item)", -> it "hides all item views except the one being shown and sets the activeItem", -> expect(pane.activeItem).toBe view1 pane.showItem(view2) @@ -138,7 +138,7 @@ describe "Pane", -> expect(pane.itemViews.find('#view-2')).toExist() expect(pane.activeView).toBe view2 - describe ".destroyItem(item)", -> + describe "::destroyItem(item)", -> describe "if the item is not modified", -> it "removes the item and tries to call destroy on it", -> pane.destroyItem(editor2) @@ -196,7 +196,7 @@ describe "Pane", -> expect(pane.getItems().indexOf(editor2)).not.toBe -1 expect(editor2.destroyed).toBeFalsy() - describe ".removeItem(item)", -> + describe "::removeItem(item)", -> it "removes the item from the items list and shows the next item if it was showing", -> pane.removeItem(view1) expect(pane.getItems()).toEqual [editor1, view2, editor2] @@ -244,7 +244,7 @@ describe "Pane", -> pane.removeItem(editor1) expect(pane.itemViews.find('.editor')).not.toExist() - describe ".moveItem(item, index)", -> + describe "::moveItem(item, index)", -> it "moves the item to the given index and emits a 'pane:item-moved' event with the item and the new index", -> itemMovedHandler = jasmine.createSpy("itemMovedHandler") pane.on 'pane:item-moved', itemMovedHandler @@ -267,7 +267,7 @@ describe "Pane", -> expect(itemMovedHandler.argsForCall[0][1..2]).toEqual [editor1, 1] itemMovedHandler.reset() - describe ".moveItemToPane(item, pane, index)", -> + describe "::moveItemToPane(item, pane, index)", -> [pane2, view3] = [] beforeEach -> @@ -314,7 +314,7 @@ describe "Pane", -> expect(editor2.destroyed).toBeTruthy() expect(pane.getItems()).toEqual [editor1] - describe "saveActiveItem", -> + describe "::saveActiveItem()", -> describe "when the current item has a uri", -> describe "when the current item has a save method", -> it "saves the current item", -> @@ -350,7 +350,7 @@ describe "Pane", -> pane.saveActiveItem() expect(atom.showSaveDialogSync).not.toHaveBeenCalled() - describe "saveActiveItemAs", -> + describe "::saveActiveItemAs()", -> beforeEach -> spyOn(atom, 'showSaveDialogSync').andReturn('/selected/path') @@ -420,7 +420,7 @@ describe "Pane", -> waitsFor -> pane.items.length == 4 - describe ".remove()", -> + describe "::remove()", -> it "destroys all the pane's items", -> pane.remove() expect(editor1.destroyed).toBeTruthy() @@ -489,7 +489,7 @@ describe "Pane", -> pane.remove() expect(atom.workspaceView.focus).not.toHaveBeenCalled() - describe ".getNextPane()", -> + describe "::getNextPane()", -> it "returns the next pane if one exists, wrapping around from the last pane to the first", -> pane.showItem(editor1) expect(pane.getNextPane()).toBeUndefined @@ -670,7 +670,7 @@ describe "Pane", -> expect(container.children('.pane').length).toBe 1 expect(pane1.outerWidth()).toBe container.width() - describe ".itemForUri(uri)", -> + describe "::itemForUri(uri)", -> it "returns the item for which a call to .getUri() returns the given uri", -> expect(pane.itemForUri(editor1.getUri())).toBe editor1 expect(pane.itemForUri(editor2.getUri())).toBe editor2 From e8e84cbd2f6920fc2498db468a26849192036d27 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 13 Dec 2013 10:38:39 -0800 Subject: [PATCH 04/24] Upgrade to tree-view@0.49.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9049211dd..4afab77c7 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "terminal": "0.23.0", "timecop": "0.11.0", "to-the-hubs": "0.15.0", - "tree-view": "0.48.0", + "tree-view": "0.49.0", "visual-bell": "0.6.0", "welcome": "0.3.0", "whitespace": "0.10.0", From 4448a7419ccb5b0d683c4f24fb48c423396a2c0a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 13 Dec 2013 11:16:25 -0800 Subject: [PATCH 05/24] Upgrade to tree-view@0.50.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4afab77c7..59cf4fd53 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "terminal": "0.23.0", "timecop": "0.11.0", "to-the-hubs": "0.15.0", - "tree-view": "0.49.0", + "tree-view": "0.50.0", "visual-bell": "0.6.0", "welcome": "0.3.0", "whitespace": "0.10.0", From 70f3527123ce9ce91698bb2c796c3c0e8d34f4fc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 13 Dec 2013 12:14:14 -0800 Subject: [PATCH 06/24] Expose shell load time render process for metrics --- src/browser/atom-window.coffee | 7 +++++++ src/browser/main.coffee | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/browser/atom-window.coffee b/src/browser/atom-window.coffee index e281b5d56..9873b5875 100644 --- a/src/browser/atom-window.coffee +++ b/src/browser/atom-window.coffee @@ -11,6 +11,7 @@ _ = require 'underscore-plus' module.exports = class AtomWindow @iconPath: path.resolve(__dirname, '..', '..', 'resources', 'atom.png') + @includeShellLoadTime: true browserWindow: null loaded: null @@ -30,6 +31,12 @@ class AtomWindow loadSettings = _.extend({}, settings) loadSettings.windowState ?= '' + + # Only send to the first non-spec window created + if @constructor.includeShellLoadTime and not @isSpec + @constructor.includeShellLoadTime = false + loadSettings.shellLoadTime ?= Date.now() - global.shellStartTime + loadSettings.initialPath = pathToOpen if fs.statSyncNoException(pathToOpen).isFile?() loadSettings.initialPath = path.dirname(pathToOpen) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index f93063ac5..5a4233452 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -1,4 +1,4 @@ -startTime = Date.now() +global.shellStartTime = Date.now() autoUpdater = require 'auto-updater' crashReporter = require 'crash-reporter' @@ -62,7 +62,7 @@ delegate.browserMainParts.preMainMessageLoopRun = -> AtomApplication = require './atom-application' AtomApplication.open(args) - console.log("App load time: #{Date.now() - startTime}ms") unless args.test + console.log("App load time: #{Date.now() - global.shellStartTime}ms") unless args.test global.devResourcePath = path.join(app.getHomeDir(), 'github', 'atom') From 9aee5adeb68eaf96183cf459cae44004cf9414c2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 13 Dec 2013 12:26:37 -0800 Subject: [PATCH 07/24] Upgrade to metrics@0.18.0 to report shell load time --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59cf4fd53..9985500fa 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "keybinding-resolver": "0.6.0", "link": "0.11.0", "markdown-preview": "0.22.0", - "metrics": "0.17.0", + "metrics": "0.18.0", "package-generator": "0.23.0", "release-notes": "0.15.0", "settings-view": "0.50.0", From 6a7e4c30fb2f3f3bf8bf63a31b121e6170bf3988 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 13 Dec 2013 14:49:23 -0800 Subject: [PATCH 08/24] :racehorse: Memoize version to prevent future IPC calls --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index a2f3d2df2..8a733894e 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -362,7 +362,7 @@ class Atom # Public: Get the version of the Atom application. getVersion: -> - app.getVersion() + @version ?= app.getVersion() # Public: Determine whether the current version is an official release. isReleasedVersion: -> From 2bf903657868ac2b4c6ed3c76e7b9b0ce1407af0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 13 Dec 2013 15:36:39 -0800 Subject: [PATCH 09/24] Upgrade to to-the-hubs@0.16.0 for menu tweak --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9985500fa..22bb99d1a 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "tabs": "0.15.0", "terminal": "0.23.0", "timecop": "0.11.0", - "to-the-hubs": "0.15.0", + "to-the-hubs": "0.16.0", "tree-view": "0.50.0", "visual-bell": "0.6.0", "welcome": "0.3.0", From 09ff90bfc4ef6bde9917cc3e5b04ad65c4915b86 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 12 Dec 2013 16:26:05 -0800 Subject: [PATCH 10/24] Update tabs package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 22bb99d1a..bb54b1a7c 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "status-bar": "0.27.0", "styleguide": "0.18.0", "symbols-view": "0.27.0", - "tabs": "0.15.0", + "tabs": "0.16.0", "terminal": "0.23.0", "timecop": "0.11.0", "to-the-hubs": "0.16.0", From 9bded1cd1969e4883957c73ca6601acf5c929352 Mon Sep 17 00:00:00 2001 From: Matt Colyer Date: Mon, 16 Dec 2013 11:32:08 -0800 Subject: [PATCH 11/24] Upgrade metrics@0.19.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb54b1a7c..94f15afc8 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "keybinding-resolver": "0.6.0", "link": "0.11.0", "markdown-preview": "0.22.0", - "metrics": "0.18.0", + "metrics": "0.19.0", "package-generator": "0.23.0", "release-notes": "0.15.0", "settings-view": "0.50.0", From f0813dbca890c3789e38fc57df30725dd5703ea5 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 16 Dec 2013 11:35:20 -0800 Subject: [PATCH 12/24] Upgrade to find-and-replace@0.60.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 94f15afc8..6945f9080 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "editor-stats": "0.9.0", "exception-reporting": "0.9.0", "feedback": "0.16.0", - "find-and-replace": "0.59.0", + "find-and-replace": "0.60.0", "fuzzy-finder": "0.28.0", "gists": "0.13.0", "git-diff": "0.21.0", From bb1bcc233ae37f6e72f3172db30908885c768919 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 12:03:36 -0800 Subject: [PATCH 13/24] Handle native commands in render process This fixes copy, paste, undo, redo for elements with a native-key-bindings class by forwarding to the menu's first responder from the render process. --- src/window-event-handler.coffee | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index d21e46742..441a71cb0 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -73,6 +73,27 @@ class WindowEventHandler e.preventDefault() atom.contextMenu.showForEvent(e) + @handleNativeKeybindings() + + # Private: Wire commands that should be handled by the native menu + # for elements with the `.native-key-bindings` class. + handleNativeKeybindings: -> + menu = null + sendActionToFirstResponder = (element, action) -> + if element.webkitMatchesSelector('.native-key-bindings') + menu ?= require('remote').require('menu') + menu.sendActionToFirstResponder(action) + + bindCommandToAction = (command, action) => + @subscribe $(document), command, (event) -> + sendActionToFirstResponder(event.target, action) + + bindCommandToAction('core:copy', 'copy:') + bindCommandToAction('core:paste', 'paste:') + bindCommandToAction('core:undo', 'undo:') + bindCommandToAction('core:redo', 'redo:') + bindCommandToAction('core:select-all', 'selectAll:') + openLink: (event) => location = $(event.target).attr('href') if location and location[0] isnt '#' and /^https?:\/\//.test(location) From d60d710325a804de390cd7350dc589f1d7d5fa9e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 12:11:19 -0800 Subject: [PATCH 14/24] Inline sendActionToFirstResponder --- src/window-event-handler.coffee | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index 441a71cb0..6fee94aeb 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -79,14 +79,11 @@ class WindowEventHandler # for elements with the `.native-key-bindings` class. handleNativeKeybindings: -> menu = null - sendActionToFirstResponder = (element, action) -> - if element.webkitMatchesSelector('.native-key-bindings') - menu ?= require('remote').require('menu') - menu.sendActionToFirstResponder(action) - bindCommandToAction = (command, action) => @subscribe $(document), command, (event) -> - sendActionToFirstResponder(event.target, action) + if element.webkitMatchesSelector('.native-key-bindings') + menu ?= require('remote').require('menu') + menu.sendActionToFirstResponder(action) bindCommandToAction('core:copy', 'copy:') bindCommandToAction('core:paste', 'paste:') From eaf6aba943bbff54b81d34bb9bb520c7f24783d2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 12:12:14 -0800 Subject: [PATCH 15/24] Return true from event handler --- src/window-event-handler.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index 6fee94aeb..6a1d942db 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -84,6 +84,7 @@ class WindowEventHandler if element.webkitMatchesSelector('.native-key-bindings') menu ?= require('remote').require('menu') menu.sendActionToFirstResponder(action) + true bindCommandToAction('core:copy', 'copy:') bindCommandToAction('core:paste', 'paste:') From 010931391eb612f5d56d0b2884be5f5fb1fdf8b1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 12:14:41 -0800 Subject: [PATCH 16/24] Use event.target --- src/window-event-handler.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index 6a1d942db..6748d1c82 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -81,7 +81,7 @@ class WindowEventHandler menu = null bindCommandToAction = (command, action) => @subscribe $(document), command, (event) -> - if element.webkitMatchesSelector('.native-key-bindings') + if event.target.webkitMatchesSelector('.native-key-bindings') menu ?= require('remote').require('menu') menu.sendActionToFirstResponder(action) true From 9cdc15b161a47ab96b855efa119d979b1786ee51 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 13:52:13 -0800 Subject: [PATCH 17/24] Guard against no other focusable elements This previously occurred in areas we all the elements had a -1 tabindex or were disabled. --- src/window-event-handler.coffee | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index 6748d1c82..5225bb06e 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -124,7 +124,10 @@ class WindowEventHandler nextTabIndex = tabIndex nextElement = element - (nextElement ? lowestElement).focus() + if nextElement? + nextElement.focus() + else if lowestElement? + lowestElement.focus() focusPrevious: => focusedTabIndex = parseInt($(':focus').attr('tabindex')) or Infinity @@ -142,4 +145,7 @@ class WindowEventHandler previousTabIndex = tabIndex previousElement = element - (previousElement ? highestElement).focus() + if previousElement? + previousElement.focus() + else if highestElement? + highestElement.focus() From dadb0d5427040c71404196271f73476135124fdf Mon Sep 17 00:00:00 2001 From: probablycorey Date: Mon, 16 Dec 2013 14:32:58 -0800 Subject: [PATCH 18/24] Update feedback package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6945f9080..b365044f3 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "dev-live-reload": "0.20.0", "editor-stats": "0.9.0", "exception-reporting": "0.9.0", - "feedback": "0.16.0", + "feedback": "0.17.0", "find-and-replace": "0.60.0", "fuzzy-finder": "0.28.0", "gists": "0.13.0", From f3a9500e61d0c10959cf61d608ec97de6b2856a3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 15:12:14 -0800 Subject: [PATCH 19/24] Upgrade apm for unpublish command --- vendor/apm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/apm b/vendor/apm index 77bc20a81..ea4fb487c 160000 --- a/vendor/apm +++ b/vendor/apm @@ -1 +1 @@ -Subproject commit 77bc20a81497f2ac1944619fc85098293b7de0f5 +Subproject commit ea4fb487cf200169b0998a1a7536acdfce57fa43 From 77b5fd47caac931c2f8e27bb84b33dd6f5d32297 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 16 Dec 2013 15:34:27 -0800 Subject: [PATCH 20/24] Dont re-atomicize atomic tokens. Fixes #1318 --- spec/display-buffer-spec.coffee | 8 ++++++++ src/token.coffee | 2 ++ 2 files changed, 10 insertions(+) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index 9350c03bb..175330b2d 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -90,6 +90,14 @@ describe "DisplayBuffer", -> expect(displayBuffer.lineForRow(3).text).toBe ' var pivot = items.shift(), current, left = [], ' expect(displayBuffer.lineForRow(4).text).toBe 'right = [];' + describe "when there are hard tabs", -> + beforeEach -> + buffer.setText(buffer.getText().replace(new RegExp(' ', 'g'), ' ')) + + it "correctly tokenizes the hard tabs", -> + expect(displayBuffer.lineForRow(3).tokens[0].isHardTab).toBeTruthy() + expect(displayBuffer.lineForRow(3).tokens[1].isHardTab).toBeTruthy() + describe "when the buffer changes", -> describe "when buffer lines are updated", -> describe "when whitespace is added after the max line length", -> diff --git a/src/token.coffee b/src/token.coffee index 2d7d52b99..3b8373a91 100644 --- a/src/token.coffee +++ b/src/token.coffee @@ -57,6 +57,8 @@ class Token outputTokens else + return [this] if this.isAtomic + if breakOutLeadingWhitespace return [this] unless /^[ ]|\t/.test(@value) else From b959fc0a6a8c5f855d5fc2d19f248b87bbb45354 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 16 Dec 2013 15:46:07 -0800 Subject: [PATCH 21/24] use @ --- src/token.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/token.coffee b/src/token.coffee index 3b8373a91..058f73fb5 100644 --- a/src/token.coffee +++ b/src/token.coffee @@ -57,7 +57,7 @@ class Token outputTokens else - return [this] if this.isAtomic + return [this] if @isAtomic if breakOutLeadingWhitespace return [this] unless /^[ ]|\t/.test(@value) From 75153388cc45f114bd5bcd8525c3fd44fd8ebcd4 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 16 Dec 2013 15:50:26 -0800 Subject: [PATCH 22/24] Use tab char --- spec/display-buffer-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index 175330b2d..caed9092b 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -92,7 +92,7 @@ describe "DisplayBuffer", -> describe "when there are hard tabs", -> beforeEach -> - buffer.setText(buffer.getText().replace(new RegExp(' ', 'g'), ' ')) + buffer.setText(buffer.getText().replace(new RegExp(' ', 'g'), '\t')) it "correctly tokenizes the hard tabs", -> expect(displayBuffer.lineForRow(3).tokens[0].isHardTab).toBeTruthy() From abb0a3c792795315901095e6fdb643ca159f5099 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Mon, 16 Dec 2013 16:10:07 -0800 Subject: [PATCH 23/24] Update metrics package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b365044f3..c3cfbde6c 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "keybinding-resolver": "0.6.0", "link": "0.11.0", "markdown-preview": "0.22.0", - "metrics": "0.19.0", + "metrics": "0.20.0", "package-generator": "0.23.0", "release-notes": "0.15.0", "settings-view": "0.50.0", From 590582782b28e6fa46ffc98d6845b465baf82b28 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 16 Dec 2013 16:40:52 -0800 Subject: [PATCH 24/24] Upgrade apm for template fixes --- vendor/apm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/apm b/vendor/apm index ea4fb487c..dd0b98fb3 160000 --- a/vendor/apm +++ b/vendor/apm @@ -1 +1 @@ -Subproject commit ea4fb487cf200169b0998a1a7536acdfce57fa43 +Subproject commit dd0b98fb38217dc09fcb25e28ba82509db87273b