From ab8c22825cb28d43ceef0c6b4b4387fcd57a726c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 09:57:30 -0700 Subject: [PATCH 01/16] Support outdenting when indent is < 1 tab length --- spec/app/edit-session-spec.coffee | 21 +++++++++++++++++++++ src/app/edit-session.coffee | 1 + src/app/selection.coffee | 6 +++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 788859373..2a8afe1e4 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1291,6 +1291,27 @@ describe "EditSession", -> expect(buffer.lineForRow(1)).toBe "var sort = function(items) {" expect(editSession.getSelectedBufferRange()).toEqual [[1, 3 - editSession.tabLength], [1, 3 - editSession.tabLength]] + it "outdents when indent is less than a tab length", -> + editSession.insertText(' ') + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe "var quicksort = function () {" + + it "outdents a single hard tab when indent is multiple hard tabs and and the session is using soft tabs", -> + editSession.insertText('\t\t') + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe "\tvar quicksort = function () {" + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe "var quicksort = function () {" + + it "outdents when a mix of hard tabs and soft tabs are used", -> + editSession.insertText('\t ') + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe " var quicksort = function () {" + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe " var quicksort = function () {" + editSession.outdentSelectedRows() + expect(buffer.lineForRow(0)).toBe "var quicksort = function () {" + describe "when one line is selected", -> it "outdents line and retains editSession", -> editSession.setSelectedBufferRange([[1,4], [1,14]]) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 10ba9e04c..5a8a7a9e7 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -108,6 +108,7 @@ class EditSession setSoftWrap: (@softWrap) -> getTabText: -> new Array(@tabLength + 1).join(" ") + getTabLength: -> @tabLength clipBufferPosition: (bufferPosition) -> @buffer.clipPosition(bufferPosition) diff --git a/src/app/selection.coffee b/src/app/selection.coffee index 4d050abba..0ab09222a 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -213,10 +213,10 @@ class Selection outdentSelectedRows: -> range = @getBufferRange() buffer = @editSession.buffer - leadingTabRegex = new RegExp("^#{@editSession.getTabText()}") + leadingTabRegex = new RegExp("^ {1,#{@editSession.getTabLength()}}|\t") for row in [range.start.row..range.end.row] - if leadingTabRegex.test buffer.lineForRow(row) - buffer.delete [[row, 0], [row, @editSession.tabLength]] + if matchLength = buffer.lineForRow(row).match(leadingTabRegex)?[0].length + buffer.delete [[row, 0], [row, matchLength]] toggleLineComments: -> @modifySelection => From 72a64b8e8b36f81342fbe55c8de75411951c1589 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 15:42:50 -0700 Subject: [PATCH 02/16] Add core:cancel and core:confirm to atom keymap Also :lipstick: --- src/app/keymaps/atom.coffee | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/app/keymaps/atom.coffee b/src/app/keymaps/atom.coffee index 80886a1a9..643afc905 100644 --- a/src/app/keymaps/atom.coffee +++ b/src/app/keymaps/atom.coffee @@ -1,10 +1,11 @@ window.keymap.bindKeys 'body' - 'alt-meta-i': 'toggle-dev-tools' + 'enter': 'core:confirm' + 'escape': 'core:cancel' 'meta-w': 'core:close' - up: 'core:move-up' - down: 'core:move-down' - left: 'core:move-left' - right: 'core:move-right' + 'up': 'core:move-up' + 'down': 'core:move-down' + 'left': 'core:move-left' + 'right': 'core:move-right' 'shift-up': 'core:select-up' 'shift-down': 'core:select-down' 'shift-left': 'core:select-left' @@ -18,10 +19,12 @@ window.keymap.bindKeys 'body' 'meta-x': 'core:cut' 'meta-c': 'core:copy' 'meta-v': 'core:paste' - pageup: 'core:page-up' - pagedown: 'core:page-down' + 'pageup': 'core:page-up' + 'pagedown': 'core:page-down' 'meta-S': 'window:save-all' 'meta-+': 'window:increase-font-size' 'meta--': 'window:decrease-font-size' 'ctrl-w w': 'window:focus-next-pane' + + 'alt-meta-i': 'toggle-dev-tools' From d0e1ee255c85ced09f112cd36d5b30fb875114a8 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 15:43:10 -0700 Subject: [PATCH 03/16] Autocomplete extension uses core:confirm and core:cancel --- spec/extensions/autocomplete-spec.coffee | 16 ++++++++-------- src/extensions/autocomplete/autocomplete.coffee | 4 ++-- src/extensions/autocomplete/keymap.coffee | 4 +--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/spec/extensions/autocomplete-spec.coffee b/spec/extensions/autocomplete-spec.coffee index d9adea327..3e4b35ee4 100644 --- a/spec/extensions/autocomplete-spec.coffee +++ b/spec/extensions/autocomplete-spec.coffee @@ -31,7 +31,7 @@ describe "Autocomplete", -> expect(leftEditor.find('.autocomplete')).toExist() expect(rightEditor.find('.autocomplete')).not.toExist() - leftEditor.trigger 'autocomplete:cancel' + leftEditor.trigger 'core:cancel' rightEditor.trigger 'autocomplete:attach' expect(leftEditor.find('.autocomplete')).not.toExist() expect(rightEditor.find('.autocomplete')).toExist() @@ -138,14 +138,14 @@ describe "Autocomplete", -> expect(editor.getSelection().isEmpty()).toBeTruthy() expect(editor.find('.autocomplete')).not.toExist() - describe 'autocomplete:confirm event', -> + describe 'core:confirm event', -> describe "where there are matches", -> describe "where there is no selection", -> it "closes the menu and moves the cursor to the end", -> editor.getBuffer().insert([10,0] ,"extra:sh:extra") editor.setCursorBufferPosition([10,8]) autocomplete.attach() - miniEditor.trigger "autocomplete:confirm" + miniEditor.trigger "core:confirm" expect(editor.lineForBufferRow(10)).toBe "extra:shift:extra" expect(editor.getCursorBufferPosition()).toEqual [10,11] @@ -160,14 +160,14 @@ describe "Autocomplete", -> expect(autocomplete.matchesList.find('li').length).toBe 1 expect(autocomplete.matchesList.find('li')).toHaveText ('No matches found') - miniEditor.trigger "autocomplete:confirm" + miniEditor.trigger "core:confirm" expect(editor.lineForBufferRow(10)).toBe "xxx" expect(editor.getCursorBufferPosition()).toEqual [10,3] expect(editor.getSelection().isEmpty()).toBeTruthy() expect(editor.find('.autocomplete')).not.toExist() - describe 'autocomplete:cancel event', -> + describe 'core:cancel event', -> it 'does not replace selection, removes autocomplete view and returns focus to editor', -> editor.getBuffer().insert([10,0] ,"extra:so:extra") editor.setSelectedBufferRange [[10,7], [10,8]] @@ -175,7 +175,7 @@ describe "Autocomplete", -> autocomplete.attach() editor.setCursorBufferPosition [0, 0] # even if selection changes before cancel, it should work - miniEditor.trigger "autocomplete:cancel" + miniEditor.trigger "core:cancel" expect(editor.lineForBufferRow(10)).toBe "extra:so:extra" expect(editor.getSelection().getBufferRange()).toEqual originalSelectionBufferRange @@ -186,12 +186,12 @@ describe "Autocomplete", -> editor.setCursorBufferPosition([10, 0]) autocomplete.attach() - miniEditor.trigger 'autocomplete:confirm' + miniEditor.trigger 'core:confirm' expect(editor.lineForBufferRow(10)).toBe 'quicksort' editor.setCursorBufferPosition([11, 0]) autocomplete.attach() - miniEditor.trigger 'autocomplete:cancel' + miniEditor.trigger 'core:cancel' expect(editor.lineForBufferRow(10)).toBe 'quicksort' describe 'move-up event', -> diff --git a/src/extensions/autocomplete/autocomplete.coffee b/src/extensions/autocomplete/autocomplete.coffee index 632fe2215..3f7a502f9 100644 --- a/src/extensions/autocomplete/autocomplete.coffee +++ b/src/extensions/autocomplete/autocomplete.coffee @@ -39,8 +39,8 @@ class Autocomplete extends View @editor.on 'before-remove', => @currentBuffer?.off '.autocomplete' @editor.command 'autocomplete:attach', => @attach() - @editor.command 'autocomplete:cancel', => @cancel() - @command 'autocomplete:confirm', => @confirm() + @editor.command 'core:cancel', => @cancel() + @command 'core:confirm', => @confirm() @matchesList.on 'mousedown', (e) => index = $(e.target).attr('index') diff --git a/src/extensions/autocomplete/keymap.coffee b/src/extensions/autocomplete/keymap.coffee index 0e5038987..f3abbe3a6 100644 --- a/src/extensions/autocomplete/keymap.coffee +++ b/src/extensions/autocomplete/keymap.coffee @@ -2,6 +2,4 @@ window.keymap.bindKeys '.editor', 'ctrl-space': 'autocomplete:attach' window.keymap.bindKeys '.autocomplete .editor', - 'enter': 'autocomplete:confirm' - 'escape': 'autocomplete:cancel' - 'ctrl-space': 'autocomplete:cancel' + 'ctrl-space': 'core:cancel' From 421731c6a0a1b4980813e1b76b53b9efb518c9f1 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 16:40:59 -0700 Subject: [PATCH 04/16] Command Panel uses core:close, core:cancel and core:confirm --- spec/extensions/command-panel-spec.coffee | 14 +++++++------- src/extensions/command-panel/command-panel.coffee | 6 +++--- src/extensions/command-panel/keymap.coffee | 4 +--- src/extensions/command-panel/preview-list.coffee | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/spec/extensions/command-panel-spec.coffee b/spec/extensions/command-panel-spec.coffee index f5a953fb6..d5c363f01 100644 --- a/spec/extensions/command-panel-spec.coffee +++ b/spec/extensions/command-panel-spec.coffee @@ -78,10 +78,10 @@ describe "CommandPanel", -> rootView2.deactivate() - describe "when command-panel:close is triggered on the command panel", -> + describe "when core:close is triggered on the command panel", -> it "detaches the command panel", -> commandPanel.attach() - commandPanel.trigger('command-panel:close') + commandPanel.trigger('core:close') expect(commandPanel.hasParent()).toBeFalsy() describe "when command-panel:toggle is triggered on the root view", -> @@ -188,12 +188,12 @@ describe "CommandPanel", -> describe "when the command panel is not visible", -> it "shows the command panel and focuses the mini editor, but does not show the preview list", -> - describe "when command-panel:unfocus is triggered on the command panel", -> + describe "when core:cancel is triggered on the command panel", -> it "returns focus to the root view but does not hide the command panel", -> rootView.attachToDom() commandPanel.attach() expect(commandPanel.miniEditor.hiddenInput).toMatchSelector ':focus' - commandPanel.trigger 'command-panel:unfocus' + commandPanel.trigger 'core:cancel' expect(commandPanel.hasParent()).toBeTruthy() expect(commandPanel.miniEditor.hiddenInput).not.toMatchSelector ':focus' @@ -370,16 +370,16 @@ describe "CommandPanel", -> _.times previewList.getOperations().length, -> previewList.trigger 'core:move-up' - describe "when command-panel:execute is triggered on the preview list", -> + describe "when core:confirm is triggered on the preview list", -> it "opens the operation's buffer, selects the search result, and focuses the active editor", -> spyOn(rootView, 'focus') executeHandler = jasmine.createSpy('executeHandler') - commandPanel.on 'command-panel:execute', executeHandler + commandPanel.on 'core:confirm', executeHandler _.times 4, -> previewList.trigger 'core:move-down' operation = previewList.getSelectedOperation() - previewList.trigger 'command-panel:execute' + previewList.trigger 'core:confirm' editSession = rootView.getActiveEditSession() expect(editSession.buffer.getPath()).toBe project.resolve(operation.getPath()) diff --git a/src/extensions/command-panel/command-panel.coffee b/src/extensions/command-panel/command-panel.coffee index 7a2065337..4e6f0d915 100644 --- a/src/extensions/command-panel/command-panel.coffee +++ b/src/extensions/command-panel/command-panel.coffee @@ -50,9 +50,9 @@ class CommandPanel extends View @history ?= [] @historyIndex = @history.length - @command 'command-panel:unfocus', => @rootView.focus() - @command 'command-panel:close', => @detach() - @command 'command-panel:execute', => @execute() + @command 'core:cancel', => @rootView.focus() + @command 'core:close', => @detach() + @command 'core:confirm', => @execute() @rootView.command 'command-panel:toggle', => @toggle() @rootView.command 'command-panel:toggle-preview', => @togglePreview() diff --git a/src/extensions/command-panel/keymap.coffee b/src/extensions/command-panel/keymap.coffee index 8b515ddcb..06c19b6d0 100644 --- a/src/extensions/command-panel/keymap.coffee +++ b/src/extensions/command-panel/keymap.coffee @@ -5,9 +5,7 @@ window.keymap.bindKeys '*' 'meta-F': 'command-panel:find-in-project' window.keymap.bindKeys '.command-panel .preview-list, .command-panel .editor input', - 'meta-w': 'command-panel:close' - escape: 'command-panel:unfocus' - enter: 'command-panel:execute' + 'enter': 'core:confirm' window.keymap.bindKeys '.editor', 'meta-g': 'command-panel:repeat-relative-address' diff --git a/src/extensions/command-panel/preview-list.coffee b/src/extensions/command-panel/preview-list.coffee index e150952a8..b2c111e08 100644 --- a/src/extensions/command-panel/preview-list.coffee +++ b/src/extensions/command-panel/preview-list.coffee @@ -14,7 +14,7 @@ class PreviewList extends ScrollView super @on 'core:move-down', => @selectNextOperation() @on 'core:move-up', => @selectPreviousOperation() - @on 'command-panel:execute', => @executeSelectedOperation() + @on 'core:confirm', => @executeSelectedOperation() @on 'mousedown', 'li', (e) => @setSelectedOperationIndex(parseInt($(e.target).closest('li').data('index'))) From 8e417631e3f7512522d844d0e46a5f2254237273 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 17:17:44 -0700 Subject: [PATCH 05/16] Markdown Preview uses core:cancel and markdown-preview:toggle --- spec/extensions/markdown-preview-spec.coffee | 32 +++++++++++-------- src/extensions/markdown-preview/keymap.coffee | 4 +-- .../markdown-preview/markdown-preview.coffee | 13 +++++--- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/spec/extensions/markdown-preview-spec.coffee b/spec/extensions/markdown-preview-spec.coffee index 7f88048b3..cef9484be 100644 --- a/spec/extensions/markdown-preview-spec.coffee +++ b/spec/extensions/markdown-preview-spec.coffee @@ -2,7 +2,7 @@ $ = require 'jquery' RootView = require 'root-view' MarkdownPreview = require 'markdown-preview' -describe "MarkdownPreview", -> +fdescribe "MarkdownPreview", -> [rootView, markdownPreview] = [] beforeEach -> @@ -14,41 +14,47 @@ describe "MarkdownPreview", -> afterEach -> rootView.deactivate() - describe "@attach", -> - it "attaches to a .md file", -> + describe "markdown-preview:toggle event", -> + it "toggles on/off a preview for a .md file", -> rootView.open('file.md') editor = rootView.getActiveEditor() expect(rootView.find('.markdown-preview')).not.toExist() spyOn(markdownPreview, 'loadHtml') - editor.trigger('markdown-preview:attach') + editor.trigger('markdown-preview:toggle') + + markdownPreviewView = rootView.find('.markdown-preview')?.view() expect(rootView.find('.markdown-preview')).toExist() expect(markdownPreview.loadHtml).toHaveBeenCalled(); + markdownPreviewView.trigger('markdown-preview:toggle') + expect(rootView.find('.markdown-preview')).not.toExist() - it "attaches to a .markdown file", -> + it "displays a preview for a .markdown file", -> rootView.open('file.markdown') editor = rootView.getActiveEditor() expect(rootView.find('.markdown-preview')).not.toExist() spyOn(markdownPreview, 'loadHtml') - editor.trigger('markdown-preview:attach') + editor.trigger('markdown-preview:toggle') expect(rootView.find('.markdown-preview')).toExist() expect(markdownPreview.loadHtml).toHaveBeenCalled(); - it "doesn't attach to a .js file", -> + it "does not display a preview for non-markdown file", -> rootView.open('file.js') editor = rootView.getActiveEditor() expect(rootView.find('.markdown-preview')).not.toExist() spyOn(markdownPreview, 'loadHtml') - editor.trigger('markdown-preview:attach') + editor.trigger('markdown-preview:toggle') expect(rootView.find('.markdown-preview')).not.toExist() expect(markdownPreview.loadHtml).not.toHaveBeenCalled(); - describe "@detach", -> - it "detaches from a .md file", -> + describe "core:cancel event", -> + it "removes markdown preview", -> rootView.open('file.md') editor = rootView.getActiveEditor() expect(rootView.find('.markdown-preview')).not.toExist() spyOn(markdownPreview, 'loadHtml') - editor.trigger('markdown-preview:attach') - expect(rootView.find('.markdown-preview')).toExist() - markdownPreview.trigger('markdown-preview:detach') + editor.trigger('markdown-preview:toggle') + + markdownPreviewView = rootView.find('.markdown-preview')?.view() + expect(markdownPreviewView).toExist() + markdownPreviewView.trigger('core:cancel') expect(rootView.find('.markdown-preview')).not.toExist() diff --git a/src/extensions/markdown-preview/keymap.coffee b/src/extensions/markdown-preview/keymap.coffee index 15f9e6c56..912d04f9c 100644 --- a/src/extensions/markdown-preview/keymap.coffee +++ b/src/extensions/markdown-preview/keymap.coffee @@ -1,5 +1,5 @@ window.keymap.bindKeys '.editor', - 'meta-P': 'markdown-preview:attach' + 'meta-P': 'markdown-preview:toggle' window.keymap.bindKeys '.markdown-preview', - 'escape': 'markdown-preview:detach' + 'meta-P': 'markdown-preview:toggle' \ No newline at end of file diff --git a/src/extensions/markdown-preview/markdown-preview.coffee b/src/extensions/markdown-preview/markdown-preview.coffee index 9e40ea5d5..dcf5a97fe 100644 --- a/src/extensions/markdown-preview/markdown-preview.coffee +++ b/src/extensions/markdown-preview/markdown-preview.coffee @@ -15,13 +15,18 @@ class MarkdownPreview extends ScrollView initialize: (@rootView) -> super - @rootView.command 'markdown-preview:attach', => - path = rootView.getActiveEditor()?.getPath() - @attach() if @isMarkdownFile(path) + @rootView.command 'markdown-preview:toggle', => @toggle() + @command 'core:cancel', => @detach() - @command 'markdown-preview:detach', => @detach() + toggle: -> + if @hasParent() + @detach() + else + @attach() attach: -> + path = rootView.getActiveEditor()?.getPath() + return unless @isMarkdownFile(path) @rootView.append(this) @markdownBody.hide() @markdownSpinner.show() From b4e3e11deb53a1c64550c2e2940552e52a171703 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 18:02:59 -0700 Subject: [PATCH 06/16] Listen for core:cancel event directly on AutoComplete view --- src/extensions/autocomplete/autocomplete.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/autocomplete/autocomplete.coffee b/src/extensions/autocomplete/autocomplete.coffee index 3f7a502f9..2e6e62fb5 100644 --- a/src/extensions/autocomplete/autocomplete.coffee +++ b/src/extensions/autocomplete/autocomplete.coffee @@ -39,7 +39,7 @@ class Autocomplete extends View @editor.on 'before-remove', => @currentBuffer?.off '.autocomplete' @editor.command 'autocomplete:attach', => @attach() - @editor.command 'core:cancel', => @cancel() + @command 'core:cancel', => @cancel() @command 'core:confirm', => @confirm() @matchesList.on 'mousedown', (e) => From f0e7242dca1b1e7d350f1ed4e6a6a37bca573c0a Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 22 Oct 2012 18:03:30 -0700 Subject: [PATCH 07/16] override default 'enter' binding on autocomplete mini-editor --- src/extensions/autocomplete/keymap.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/extensions/autocomplete/keymap.coffee b/src/extensions/autocomplete/keymap.coffee index f3abbe3a6..1810f67ee 100644 --- a/src/extensions/autocomplete/keymap.coffee +++ b/src/extensions/autocomplete/keymap.coffee @@ -3,3 +3,6 @@ window.keymap.bindKeys '.editor', window.keymap.bindKeys '.autocomplete .editor', 'ctrl-space': 'core:cancel' + +window.keymap.bindKeys ".autocomplete .mini.editor input", + 'enter': 'core:confirm' \ No newline at end of file From e20832aa5059328c9adc59f8d8c2fb19031d0e85 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 23 Oct 2012 11:11:18 -0700 Subject: [PATCH 08/16] Tree View uses core:close core:confirm core:cancel and adds tool-pane:unfocus --- spec/extensions/markdown-preview-spec.coffee | 2 +- spec/extensions/tree-view-spec.coffee | 30 ++++++++++---------- src/app/keymaps/atom.coffee | 3 ++ src/extensions/tree-view/dialog.coffee | 4 +-- src/extensions/tree-view/keymap.coffee | 6 ++-- src/extensions/tree-view/tree-view.coffee | 14 +++++---- 6 files changed, 32 insertions(+), 27 deletions(-) diff --git a/spec/extensions/markdown-preview-spec.coffee b/spec/extensions/markdown-preview-spec.coffee index cef9484be..994e03884 100644 --- a/spec/extensions/markdown-preview-spec.coffee +++ b/spec/extensions/markdown-preview-spec.coffee @@ -2,7 +2,7 @@ $ = require 'jquery' RootView = require 'root-view' MarkdownPreview = require 'markdown-preview' -fdescribe "MarkdownPreview", -> +describe "MarkdownPreview", -> [rootView, markdownPreview] = [] beforeEach -> diff --git a/spec/extensions/tree-view-spec.coffee b/spec/extensions/tree-view-spec.coffee index 2914f2f02..d15495ece 100644 --- a/spec/extensions/tree-view-spec.coffee +++ b/spec/extensions/tree-view-spec.coffee @@ -183,13 +183,13 @@ describe "TreeView", -> expect(treeView.hasParent()).toBeTruthy() expect(treeView.focus).toHaveBeenCalled() - describe "when tree-view:unfocus is triggered on the tree view", -> + describe "when tool-panel:unfocus is triggered on the tree view", -> it "surrenders focus to the root view but remains open", -> - rootView.open() # When we trigger 'tree-view:unfocus' below, we want an editor to become focused + rootView.open() # When we trigger 'tool-panel:unfocus' below, we want an editor to become focused rootView.attachToDom() treeView.focus() expect(treeView).toMatchSelector(':focus') - treeView.trigger 'tree-view:unfocus' + treeView.trigger 'tool-panel:unfocus' expect(treeView).toBeVisible() expect(treeView).not.toMatchSelector(':focus') expect(rootView.getActiveEditor().isFocused).toBeTruthy() @@ -616,7 +616,7 @@ describe "TreeView", -> it "add a file, closes the dialog and selects the file in the tree-view", -> newPath = fs.join(dirPath, "new-test-file.txt") addDialog.miniEditor.insertText(fs.base(newPath)) - addDialog.trigger 'tree-view:confirm' + addDialog.trigger 'core:confirm' expect(fs.exists(newPath)).toBeTruthy() expect(fs.isFile(newPath)).toBeTruthy() expect(addDialog.parent()).not.toExist() @@ -633,7 +633,7 @@ describe "TreeView", -> newPath = fs.join(dirPath, "new-test-file.txt") fs.write(newPath, '') addDialog.miniEditor.insertText(fs.base(newPath)) - addDialog.trigger 'tree-view:confirm' + addDialog.trigger 'core:confirm' expect(addDialog.prompt.text()).toContain 'Error' expect(addDialog.prompt.text()).toContain 'already exists' @@ -646,7 +646,7 @@ describe "TreeView", -> treeView.attachToDom() newPath = fs.join(dirPath, "new/dir") addDialog.miniEditor.insertText("new/dir/") - addDialog.trigger 'tree-view:confirm' + addDialog.trigger 'core:confirm' expect(fs.exists(newPath)).toBeTruthy() expect(fs.isDirectory(newPath)).toBeTruthy() expect(addDialog.parent()).not.toExist() @@ -659,7 +659,7 @@ describe "TreeView", -> treeView.attachToDom() newPath = fs.join(dirPath, "new2/") addDialog.miniEditor.insertText("new2/") - addDialog.trigger 'tree-view:confirm' + addDialog.trigger 'core:confirm' expect(fs.exists(newPath)).toBeTruthy() expect(fs.isDirectory(newPath)).toBeTruthy() expect(addDialog.parent()).not.toExist() @@ -673,17 +673,17 @@ describe "TreeView", -> newPath = fs.join(dirPath, "new-dir") fs.makeDirectory(newPath) addDialog.miniEditor.insertText("new-dir/") - addDialog.trigger 'tree-view:confirm' + addDialog.trigger 'core:confirm' expect(addDialog.prompt.text()).toContain 'Error' expect(addDialog.prompt.text()).toContain 'already exists' expect(addDialog.prompt).toHaveClass('error') expect(addDialog.hasParent()).toBeTruthy() - describe "when 'tree-view:cancel' is triggered on the add dialog", -> + describe "when 'core:cancel' is triggered on the add dialog", -> it "removes the dialog and focuses the tree view", -> treeView.attachToDom() - addDialog.trigger 'tree-view:cancel' + addDialog.trigger 'core:cancel' expect(addDialog.parent()).not.toExist() expect(treeView).toMatchSelector(':focus') @@ -741,7 +741,7 @@ describe "TreeView", -> newPath = fs.join(rootDirPath, 'renamed-test-file.txt') moveDialog.miniEditor.setText(newPath) - moveDialog.trigger 'tree-view:confirm' + moveDialog.trigger 'core:confirm' expect(fs.exists(newPath)).toBeTruthy() expect(fs.exists(filePath)).toBeFalsy() @@ -760,7 +760,7 @@ describe "TreeView", -> newPath = fs.join(rootDirPath, 'new/directory', 'renamed-test-file.txt') moveDialog.miniEditor.setText(newPath) - moveDialog.trigger 'tree-view:confirm' + moveDialog.trigger 'core:confirm' expect(fs.exists(newPath)).toBeTruthy() expect(fs.exists(filePath)).toBeFalsy() @@ -774,17 +774,17 @@ describe "TreeView", -> newPath = fs.join(rootDirPath, 'target.txt') moveDialog.miniEditor.setText(newPath) - moveDialog.trigger 'tree-view:confirm' + moveDialog.trigger 'core:confirm' expect(moveDialog.prompt.text()).toContain 'Error' expect(moveDialog.prompt.text()).toContain 'already exists' expect(moveDialog.prompt).toHaveClass('error') expect(moveDialog.hasParent()).toBeTruthy() - describe "when 'tree-view:cancel' is triggered on the move dialog", -> + describe "when 'core:cancel' is triggered on the move dialog", -> it "removes the dialog and focuses the tree view", -> treeView.attachToDom() - moveDialog.trigger 'tree-view:cancel' + moveDialog.trigger 'core:cancel' expect(moveDialog.parent()).not.toExist() expect(treeView).toMatchSelector(':focus') diff --git a/src/app/keymaps/atom.coffee b/src/app/keymaps/atom.coffee index 643afc905..9d0f0575f 100644 --- a/src/app/keymaps/atom.coffee +++ b/src/app/keymaps/atom.coffee @@ -28,3 +28,6 @@ window.keymap.bindKeys 'body' 'ctrl-w w': 'window:focus-next-pane' 'alt-meta-i': 'toggle-dev-tools' + +window.keymap.bindKeys '.tool-panel' + 'escape': 'tool-panel:unfocus' \ No newline at end of file diff --git a/src/extensions/tree-view/dialog.coffee b/src/extensions/tree-view/dialog.coffee index 4d002aa3a..9f02fb18d 100644 --- a/src/extensions/tree-view/dialog.coffee +++ b/src/extensions/tree-view/dialog.coffee @@ -12,8 +12,8 @@ class Dialog extends View initialize: ({path, @onConfirm, select} = {}) -> @miniEditor.focus() - @on 'tree-view:confirm', => @onConfirm(@miniEditor.getText()) - @on 'tree-view:cancel', => @cancel() + @on 'core:confirm', => @onConfirm(@miniEditor.getText()) + @on 'core:cancel', => @cancel() @miniEditor.on 'focusout', => @remove() @miniEditor.setText(path) diff --git a/src/extensions/tree-view/keymap.coffee b/src/extensions/tree-view/keymap.coffee index b7aff8127..3f3d6886e 100644 --- a/src/extensions/tree-view/keymap.coffee +++ b/src/extensions/tree-view/keymap.coffee @@ -3,8 +3,6 @@ window.keymap.bindKeys '#root-view' 'ctrl-meta-1': 'tree-view:reveal-active-file' window.keymap.bindKeys '.tree-view' - 'escape': 'tree-view:unfocus' - 'meta-w': 'tree-view:toggle' 'right': 'tree-view:expand-directory' 'left': 'tree-view:collapse-directory' 'enter': 'tree-view:open-selected-entry' @@ -14,5 +12,5 @@ window.keymap.bindKeys '.tree-view' 'backspace': 'tree-view:remove' window.keymap.bindKeys '.tree-view-dialog .mini.editor' - 'enter': 'tree-view:confirm' - 'escape': 'tree-view:cancel' + 'enter': 'core:confirm' + 'escape': 'core:cancel' \ No newline at end of file diff --git a/src/extensions/tree-view/tree-view.coffee b/src/extensions/tree-view/tree-view.coffee index 29ebd4483..cbdf9162d 100644 --- a/src/extensions/tree-view/tree-view.coffee +++ b/src/extensions/tree-view/tree-view.coffee @@ -27,7 +27,7 @@ class TreeView extends ScrollView @instance.serialize() @content: (rootView) -> - @div class: 'tree-view', tabindex: -1, => + @div class: 'tree-view tool-panel', tabindex: -1, => if rootView.project.getRootDirectory() @subview 'root', new DirectoryView(directory: rootView.project.getRootDirectory(), isExpanded: true) @@ -50,18 +50,19 @@ class TreeView extends ScrollView @on 'click', '.entry', (e) => @entryClicked(e) @command 'core:move-up', => @moveUp() @command 'core:move-down', => @moveDown() + @command 'core:close', => @detatch() @command 'tree-view:expand-directory', => @expandDirectory() @command 'tree-view:collapse-directory', => @collapseDirectory() @command 'tree-view:open-selected-entry', => @openSelectedEntry(true) @command 'tree-view:move', => @moveSelectedEntry() @command 'tree-view:add', => @add() @command 'tree-view:remove', => @removeSelectedEntry() + @command 'tool-panel:unfocus', => @rootView.focus() @command 'tree-view:directory-modified', => if @hasFocus() @selectEntryForPath(@selectedPath) if @selectedPath else @selectActiveFile() - @on 'tree-view:unfocus', => @rootView.focus() @rootView.command 'tree-view:toggle', => @toggle() @rootView.command 'tree-view:reveal-active-file', => @revealActiveFile() @rootView.on 'active-editor-path-change', => @selectActiveFile() @@ -86,17 +87,20 @@ class TreeView extends ScrollView toggle: -> if @hasFocus() @detach() - @rootView.focus() else - @attach() unless @hasParent() - @focus() + if @hasParent() + @focus() + else + @attach() attach: -> @rootView.horizontal.prepend(this) + @focus() detach: -> @scrollTopAfterAttach = @scrollTop() super + @rootView.focus() hasFocus: -> @is(':focus') From ae7264ad1207e206c1304dcda8d9b9c0f921cb82 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 23 Oct 2012 12:03:18 -0700 Subject: [PATCH 09/16] Fix autocomplete specs --- spec/extensions/autocomplete-spec.coffee | 6 ++++-- src/extensions/autocomplete/autocomplete.coffee | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/extensions/autocomplete-spec.coffee b/spec/extensions/autocomplete-spec.coffee index 3e4b35ee4..393549d84 100644 --- a/spec/extensions/autocomplete-spec.coffee +++ b/spec/extensions/autocomplete-spec.coffee @@ -31,9 +31,11 @@ describe "Autocomplete", -> expect(leftEditor.find('.autocomplete')).toExist() expect(rightEditor.find('.autocomplete')).not.toExist() - leftEditor.trigger 'core:cancel' - rightEditor.trigger 'autocomplete:attach' + autoCompleteView = leftEditor.find('.autocomplete').view() + autoCompleteView.trigger 'core:cancel' expect(leftEditor.find('.autocomplete')).not.toExist() + + rightEditor.trigger 'autocomplete:attach' expect(rightEditor.find('.autocomplete')).toExist() expect(Autocomplete.prototype.initialize).not.toHaveBeenCalled() diff --git a/src/extensions/autocomplete/autocomplete.coffee b/src/extensions/autocomplete/autocomplete.coffee index 2e6e62fb5..07ff6ffe1 100644 --- a/src/extensions/autocomplete/autocomplete.coffee +++ b/src/extensions/autocomplete/autocomplete.coffee @@ -26,8 +26,7 @@ class Autocomplete extends View @activate: (rootView) -> new Autocomplete(editor) for editor in rootView.getEditors() - rootView.on 'editor-open', (e, editor) -> - editor.autoComplete = new Autocomplete(editor) unless editor.is('.autocomplete .mini') + rootView.on 'editor-open', (e, editor) -> new Autocomplete(editor) unless editor.mini initialize: (@editor) -> requireStylesheet 'autocomplete.css' From 8f4ec3c45ee7f6fdf659b76db9242e39461b8f76 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 23 Oct 2012 13:21:14 -0700 Subject: [PATCH 10/16] Fix command panel specs --- spec/extensions/command-panel-spec.coffee | 4 ++-- src/extensions/command-panel/command-panel.coffee | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/extensions/command-panel-spec.coffee b/spec/extensions/command-panel-spec.coffee index d5c363f01..6617a8b07 100644 --- a/spec/extensions/command-panel-spec.coffee +++ b/spec/extensions/command-panel-spec.coffee @@ -188,12 +188,12 @@ describe "CommandPanel", -> describe "when the command panel is not visible", -> it "shows the command panel and focuses the mini editor, but does not show the preview list", -> - describe "when core:cancel is triggered on the command panel", -> + describe "when tool-pane:unfocus is triggered on the command panel", -> it "returns focus to the root view but does not hide the command panel", -> rootView.attachToDom() commandPanel.attach() expect(commandPanel.miniEditor.hiddenInput).toMatchSelector ':focus' - commandPanel.trigger 'core:cancel' + commandPanel.trigger 'tool-pane:unfocus' expect(commandPanel.hasParent()).toBeTruthy() expect(commandPanel.miniEditor.hiddenInput).not.toMatchSelector ':focus' diff --git a/src/extensions/command-panel/command-panel.coffee b/src/extensions/command-panel/command-panel.coffee index 4e6f0d915..4cc535e9e 100644 --- a/src/extensions/command-panel/command-panel.coffee +++ b/src/extensions/command-panel/command-panel.coffee @@ -33,7 +33,7 @@ class CommandPanel extends View commandPanel @content: (rootView) -> - @div class: 'command-panel', => + @div class: 'command-panel tool-pane', => @subview 'previewList', new PreviewList(rootView) @div class: 'prompt-and-editor', => @div ':', class: 'prompt', outlet: 'prompt' @@ -50,7 +50,7 @@ class CommandPanel extends View @history ?= [] @historyIndex = @history.length - @command 'core:cancel', => @rootView.focus() + @command 'tool-pane:unfocus', => @rootView.focus() @command 'core:close', => @detach() @command 'core:confirm', => @execute() From 7ea905a906e80314eb85700e9b35e587615ba03f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 13:53:58 -0700 Subject: [PATCH 11/16] Remove unneeded requires --- src/extensions/fuzzy-finder/fuzzy-finder.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/extensions/fuzzy-finder/fuzzy-finder.coffee b/src/extensions/fuzzy-finder/fuzzy-finder.coffee index 56690885d..016e442f6 100644 --- a/src/extensions/fuzzy-finder/fuzzy-finder.coffee +++ b/src/extensions/fuzzy-finder/fuzzy-finder.coffee @@ -1,8 +1,5 @@ {View, $$} = require 'space-pen' SelectList = require 'select-list' -stringScore = require 'stringscore' -fuzzyFilter = require 'fuzzy-filter' -$ = require 'jquery' _ = require 'underscore' Editor = require 'editor' From 4eff8b657f432d31d949edee7481cf240f66b371 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 13:54:27 -0700 Subject: [PATCH 12/16] :lipstick: --- src/extensions/event-palette/event-palette.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extensions/event-palette/event-palette.css b/src/extensions/event-palette/event-palette.css index f91b90007..dcda63e3c 100644 --- a/src/extensions/event-palette/event-palette.css +++ b/src/extensions/event-palette/event-palette.css @@ -19,7 +19,6 @@ margin: 4px 0; } - .event-palette li .right { float: right; } From 48bdc7535911c9e0c7ba845c40bde29bd7d1a0a4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 21:12:14 -0700 Subject: [PATCH 13/16] Send remaining stdout/stderr output to callbacks Previously this data was only sent to the done handlers and so commands such as SelectAllMatchesInProject were not displaying all the results when the result size was large. --- spec/stdlib/child-process-spec.coffee | 22 +++++++++++++++++----- src/stdlib/child-process.coffee | 6 ++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/spec/stdlib/child-process-spec.coffee b/spec/stdlib/child-process-spec.coffee index 7d57a21cb..762ea958c 100644 --- a/spec/stdlib/child-process-spec.coffee +++ b/spec/stdlib/child-process-spec.coffee @@ -11,9 +11,17 @@ describe 'Child Processes', -> it "returns a promise that resolves to stdout and stderr", -> waitsForPromise -> cmd = "echo 'good' && echo 'bad' >&2" - ChildProcess.exec(cmd).done (stdout, stderr) -> - expect(stdout).toBe 'good\n' - expect(stderr).toBe 'bad\n' + standardOutput = '' + errorOutput = '' + options = + stdout: (data) -> + standardOutput += data + stderr: (data) -> + errorOutput += data + + ChildProcess.exec(cmd, options).done -> + expect(standardOutput).toBe 'good\n' + expect(errorOutput).toBe 'bad\n' describe "when options are given", -> it "calls the options.stdout callback when new data is received on stdout", -> @@ -89,6 +97,10 @@ describe 'Child Processes', -> it "executes the callback with error set to the exit status", -> waitsForPromise shouldReject: true, -> cmd = "echo 'bad' >&2 && exit 2" - ChildProcess.exec(cmd).fail (error) -> + errorOutput = '' + options = + stderr: (data) -> + errorOutput += data + ChildProcess.exec(cmd, options).fail (error) -> expect(error.exitStatus).toBe 2 - expect(error.stderr).toBe "bad\n" + expect(errorOutput).toBe "bad\n" diff --git a/src/stdlib/child-process.coffee b/src/stdlib/child-process.coffee index 9bddda62e..d7ed54ad4 100644 --- a/src/stdlib/child-process.coffee +++ b/src/stdlib/child-process.coffee @@ -14,11 +14,13 @@ class ChildProccess options.stderr = @bufferLines(options.stderr) if options.stderr $native.exec command, options, (exitStatus, stdout, stderr) -> + options.stdout(stdout) if options.stdout + options.stderr(stderr) if options.stderr try if exitStatus != 0 - deferred.reject({command, exitStatus, stderr}) + deferred.reject({command, exitStatus}) else - deferred.resolve(stdout, stderr) + deferred.resolve() catch e console.error "In ChildProccess termination callback: ", e.message console.error e.stack From 906f816fc64734dcb737a63c0ba800b5ab3ffdcb Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Oct 2012 21:43:43 -0700 Subject: [PATCH 14/16] :lipstick: --- src/stdlib/child-process.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stdlib/child-process.coffee b/src/stdlib/child-process.coffee index d7ed54ad4..a9228c55c 100644 --- a/src/stdlib/child-process.coffee +++ b/src/stdlib/child-process.coffee @@ -14,8 +14,8 @@ class ChildProccess options.stderr = @bufferLines(options.stderr) if options.stderr $native.exec command, options, (exitStatus, stdout, stderr) -> - options.stdout(stdout) if options.stdout - options.stderr(stderr) if options.stderr + options.stdout?(stdout) + options.stderr?(stderr) try if exitStatus != 0 deferred.reject({command, exitStatus}) From b71fa308a3ac48ce0d171559c3f2e37cc49724ac Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 24 Oct 2012 12:34:45 -0600 Subject: [PATCH 15/16] Always run `window.startup` when window.coffee is required When we actually want to attach the root view in window-bootstrap.coffee, we call `window.attachRootView(path)` instead of calling `window.startup(path)`. Having `startup` called automatically means we can be sure any code we add there runs in every environment (including benchmark and specs). This is where we do things like setup the global keymap, parse text mate bundles and themes, and establish the window close handler. Any globals other than the root view that we want to be available in all environments should be established here. Right now that's just the keymap, but soon I want to add a global pasteboard. --- benchmark/benchmark-helper.coffee | 3 --- benchmark/benchmark-suite.coffee | 2 +- spec/app/window-spec.coffee | 2 +- spec/spec-helper.coffee | 2 -- src/app/window.coffee | 38 +++++++++++++++---------------- src/window-bootstrap.coffee | 3 +-- 6 files changed, 22 insertions(+), 28 deletions(-) diff --git a/benchmark/benchmark-helper.coffee b/benchmark/benchmark-helper.coffee index 18aedf44f..2fe689ecc 100644 --- a/benchmark/benchmark-helper.coffee +++ b/benchmark/benchmark-helper.coffee @@ -9,10 +9,7 @@ TextMateBundle = require 'text-mate-bundle' TextMateTheme = require 'text-mate-theme' require 'window' - requireStylesheet "jasmine.css" -TextMateBundle.loadAll() -TextMateTheme.loadAll() RootView.prototype.loadUserConfiguration = -> diff --git a/benchmark/benchmark-suite.coffee b/benchmark/benchmark-suite.coffee index c0b194a5a..4cca9d5e2 100644 --- a/benchmark/benchmark-suite.coffee +++ b/benchmark/benchmark-suite.coffee @@ -10,7 +10,7 @@ describe "editor.", -> beforeEach -> window.rootViewParentSelector = '#jasmine-content' - window.startup() + window.attachRootView() rootView.project.setPath(require.resolve('benchmark/fixtures')) editor = rootView.getActiveEditor() diff --git a/spec/app/window-spec.coffee b/spec/app/window-spec.coffee index d3703e857..6dcc5bf49 100644 --- a/spec/app/window-spec.coffee +++ b/spec/app/window-spec.coffee @@ -3,7 +3,7 @@ fs = require 'fs' describe "Window", -> beforeEach -> - window.startup(require.resolve('fixtures')) + window.attachRootView(require.resolve('fixtures')) afterEach -> window.shutdown() diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index dafe5de7e..9a89070d9 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -14,8 +14,6 @@ require 'window' atom.showDevTools() requireStylesheet "jasmine.css" -TextMateBundle.loadAll() -TextMateTheme.loadAll() defaultTitle = document.title pathsWithSubscriptions = null diff --git a/src/app/window.coffee b/src/app/window.coffee index 4d488234e..108e305e6 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -8,6 +8,9 @@ fs = require 'fs' _ = require 'underscore' $ = require 'jquery' {CoffeeScript} = require 'coffee-script' +RootView = require 'root-view' +require 'jquery-extensions' +require 'underscore-extensions' windowAdditions = rootViewParentSelector: 'body' @@ -15,16 +18,28 @@ windowAdditions = keymap: null platform: $native.getPlatform() - startup: (path) -> + # This method runs when the file is required. Any code here will run + # in all environments: spec, benchmark, and application + startup: -> TextMateBundle.loadAll() TextMateTheme.loadAll() + @setUpKeymap() + + # This method is intended only to be run when starting a normal application + # Note: RootView assigns itself on window on initialization so that + # window.rootView is available when loading user configuration + attachRootView: (pathToOpen) -> + if rootViewState = atom.getRootViewStateForPath(pathToOpen) + RootView.deserialize(rootViewState) + else + new RootView(pathToOpen) - @attachRootView(path) $(window).on 'close', => @close() + $(@rootViewParentSelector).append(@rootView) + $(window).focus() $(window).on 'beforeunload', => @shutdown() false - $(window).focus() shutdown: -> @rootView.deactivate() @@ -42,16 +57,6 @@ windowAdditions = @_handleKeyEvent = (e) => @keymap.handleKeyEvent(e) $(document).on 'keydown', @_handleKeyEvent - # Note: RootView assigns itself on window on initialization so that - # window.rootView is available when loading user configuration - attachRootView: (pathToOpen) -> - if rootViewState = atom.getRootViewStateForPath(pathToOpen) - RootView.deserialize(rootViewState) - else - new RootView(pathToOpen) - - $(@rootViewParentSelector).append @rootView - requireStylesheet: (path) -> unless fullPath = require.resolve(path) throw new Error("requireStylesheet could not find a file at path '#{path}'") @@ -91,12 +96,7 @@ windowAdditions = console.log description, result window[key] = value for key, value of windowAdditions -window.setUpKeymap() - -RootView = require 'root-view' - -require 'jquery-extensions' -require 'underscore-extensions' +window.startup() requireStylesheet 'reset.css' requireStylesheet 'atom.css' diff --git a/src/window-bootstrap.coffee b/src/window-bootstrap.coffee index 46d4750c9..86404bb98 100644 --- a/src/window-bootstrap.coffee +++ b/src/window-bootstrap.coffee @@ -1,5 +1,4 @@ # Like sands through the hourglass, so are the days of our lives. require 'atom' require 'window' -window.startup window.location.params.pathToOpen - +window.attachRootView(window.location.params.pathToOpen) From ca2527f4b8c7e08e5d340e910dfd3d0cf8e913bb Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 24 Oct 2012 12:35:31 -0600 Subject: [PATCH 16/16] Meta-w closes spec windows again. This adds a 'core:close' event to meta-w in the default bindings, and modifies window to listen for it. --- spec/app/window-spec.coffee | 2 +- src/app/keymap.coffee | 1 + src/app/window.coffee | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/app/window-spec.coffee b/spec/app/window-spec.coffee index 6dcc5bf49..05e582d34 100644 --- a/spec/app/window-spec.coffee +++ b/spec/app/window-spec.coffee @@ -13,7 +13,7 @@ describe "Window", -> describe ".close()", -> it "is triggered by the 'close' event", -> spyOn window, 'close' - $(window).trigger 'close' + $(window).trigger 'core:close' expect(window.close).toHaveBeenCalled() describe ".reload()", -> diff --git a/src/app/keymap.coffee b/src/app/keymap.coffee index eff396131..d88a09041 100644 --- a/src/app/keymap.coffee +++ b/src/app/keymap.coffee @@ -18,6 +18,7 @@ class Keymap 'meta-n': 'new-window' 'meta-,': 'open-user-configuration' 'meta-o': 'open' + 'meta-w': 'core:close' $(document).on 'new-window', => atom.newWindow() $(document).on 'open-user-configuration', => atom.open(atom.configFilePath) diff --git a/src/app/window.coffee b/src/app/window.coffee index 108e305e6..a2484e54a 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -24,6 +24,7 @@ windowAdditions = TextMateBundle.loadAll() TextMateTheme.loadAll() @setUpKeymap() + $(window).on 'core:close', => @close() # This method is intended only to be run when starting a normal application # Note: RootView assigns itself on window on initialization so that @@ -34,7 +35,6 @@ windowAdditions = else new RootView(pathToOpen) - $(window).on 'close', => @close() $(@rootViewParentSelector).append(@rootView) $(window).focus() $(window).on 'beforeunload', =>