Merge pull request #968 from atom/ks-emissary

Use emissary
This commit is contained in:
Kevin Sawicki
2013-10-14 17:51:51 -07:00
31 changed files with 171 additions and 586 deletions

View File

@@ -10,7 +10,6 @@ module.exports =
BufferedProcess: require '../src/buffered-process'
Directory: require '../src/directory'
Document: Document
EventEmitter: require '../src/event-emitter'
File: require '../src/file'
fs: require '../src/fs-utils'
Git: require '../src/git'
@@ -19,7 +18,6 @@ module.exports =
ScrollView: require '../src/scroll-view'
Site: Site
stringscore: require '../vendor/stringscore'
Subscriber: require '../src/subscriber'
View: View
# The following classes can't be used from a Task handler and should therefore

View File

@@ -15,6 +15,7 @@
"bootstrap": "git://github.com/twbs/bootstrap.git#v3.0.0",
"coffee-script": "1.6.2",
"coffeestack": "0.6.0",
"emissary": "0.6.0",
"first-mate": "0.4.0",
"git-utils": "0.26.0",
"guid": "0.0.10",
@@ -51,15 +52,15 @@
"autoflow": "0.3.0",
"bookmarks": "0.6.0",
"bracket-matcher": "0.6.0",
"collaboration": "0.23.0",
"collaboration": "0.24.0",
"command-logger": "0.4.0",
"command-palette": "0.4.0",
"editor-stats": "0.3.0",
"exception-reporting": "0.4.0",
"find-and-replace": "0.25.0",
"find-and-replace": "0.26.0",
"fuzzy-finder": "0.12.0",
"gfm": "0.5.0",
"git-diff": "0.9.0",
"git-diff": "0.10.0",
"gists": "0.3.0",
"github-sign-in": "0.7.0",
"go-to-line": "0.5.0",
@@ -70,13 +71,13 @@
"metrics": "0.8.0",
"package-generator": "0.10.0",
"release-notes": "0.3.0",
"settings-view": "0.27.0",
"snippets": "0.7.0",
"settings-view": "0.28.0",
"snippets": "0.8.0",
"spell-check": "0.6.0",
"status-bar": "0.12.0",
"symbols-view": "0.10.0",
"tabs": "0.6.0",
"terminal": "0.10.0",
"terminal": "0.11.0",
"timecop": "0.5.0",
"to-the-hubs": "0.6.0",
"toml": "0.3.0",

View File

@@ -1,208 +0,0 @@
{_} = require 'atom'
EventEmitter = require '../src/event-emitter'
describe "EventEmitter mixin", ->
[object, fooHandler1, fooHandler2, barHandler] = []
beforeEach ->
object = {}
_.extend(object, EventEmitter)
fooHandler1 = jasmine.createSpy('fooHandler1')
fooHandler2 = jasmine.createSpy('fooHandler2')
barHandler = jasmine.createSpy('barHandler')
object.on 'foo', fooHandler1
object.on 'foo', fooHandler2
object.on 'bar', barHandler
describe ".on", ->
describe "when called with multiple space-separated event names", ->
it "subscribes to each event names", ->
object.on ' a.b c.d\te ', fooHandler1
object.trigger 'a'
expect(fooHandler1).toHaveBeenCalled()
fooHandler1.reset()
object.trigger 'c'
expect(fooHandler1).toHaveBeenCalled()
fooHandler1.reset()
object.trigger 'e'
expect(fooHandler1).toHaveBeenCalled()
fooHandler1.reset()
object.trigger ''
expect(fooHandler1).not.toHaveBeenCalled()
describe ".trigger", ->
describe "when called with a non-namespaced event name", ->
it "triggers all handlers registered for the given event name", ->
object.trigger 'foo', 'data'
expect(fooHandler1).toHaveBeenCalledWith('data')
expect(fooHandler2).toHaveBeenCalledWith('data')
expect(barHandler).not.toHaveBeenCalled()
fooHandler1.reset()
fooHandler2.reset()
object.trigger 'bar', 'stuff'
expect(barHandler).toHaveBeenCalledWith('stuff')
describe "when there are namespaced handlers", ->
it "triggers only handlers registered with the given namespace / event combination", ->
barHandler2 = jasmine.createSpy('barHandler2')
object.on('bar.ns1', barHandler2)
object.trigger('bar')
expect(barHandler).toHaveBeenCalled()
expect(barHandler2).toHaveBeenCalled()
barHandler.reset()
barHandler2.reset()
object.trigger('bar.ns1')
expect(barHandler).not.toHaveBeenCalled()
expect(barHandler2).toHaveBeenCalled()
it "does not raise exceptions when called with non-existent events / namespaces", ->
object.trigger('junk')
object.trigger('junk.garbage')
describe ".off", ->
describe "when called with no arguments", ->
it "removes all subscriptions", ->
object.off()
object.trigger 'foo'
expect(fooHandler1).not.toHaveBeenCalled()
expect(fooHandler2).not.toHaveBeenCalled()
describe "when called with multiple space-separated event names", ->
it "unsubscribes from each event name", ->
object.on 'a.b c.d e', fooHandler1
object.off ' a.b\te '
object.trigger 'a'
expect(fooHandler1).not.toHaveBeenCalled()
fooHandler1.reset()
object.trigger 'e'
expect(fooHandler1).not.toHaveBeenCalled()
fooHandler1.reset()
object.trigger 'c.d'
expect(fooHandler1).toHaveBeenCalled()
describe "when called with a non-namespaced event name", ->
it "removes all handlers for that event name", ->
object.off 'foo'
object.trigger 'foo'
expect(fooHandler1).not.toHaveBeenCalled()
expect(fooHandler2).not.toHaveBeenCalled()
describe "when called with a non-namespaced event name and a handler function", ->
it "removes the specific handler", ->
object.off 'foo', fooHandler1
object.trigger 'foo'
expect(fooHandler1).not.toHaveBeenCalled()
expect(fooHandler2).toHaveBeenCalled()
it "does not throw an exception if there was not matching `on` call", ->
expect(-> object.off 'marco', -> "nothing").not.toThrow()
describe "when there are namespaced event handlers", ->
[barHandler2, bazHandler1, bazHandler2, bazHandler3] = []
beforeEach ->
barHandler2 = jasmine.createSpy('barHandler2')
bazHandler1 = jasmine.createSpy('bazHandler1')
bazHandler2 = jasmine.createSpy('bazHandler2')
bazHandler3 = jasmine.createSpy('bazHandler3')
object.on 'bar.ns1', barHandler2
object.on 'baz.ns1', bazHandler1
object.on 'baz.ns1', bazHandler2
object.on 'baz.ns2', bazHandler3
describe "when called with a namespaced event name", ->
it "removes all handlers in that namespace", ->
object.trigger 'baz'
expect(bazHandler1).toHaveBeenCalled()
expect(bazHandler2).toHaveBeenCalled()
expect(bazHandler3).toHaveBeenCalled()
bazHandler1.reset()
bazHandler2.reset()
bazHandler3.reset()
object.off 'baz.ns1'
object.trigger 'baz'
object.trigger 'baz.ns1'
expect(bazHandler1).not.toHaveBeenCalled()
expect(bazHandler2).not.toHaveBeenCalled()
expect(bazHandler3).toHaveBeenCalled()
describe "when called with just a namespace", ->
it "removes all handlers for all events on that namespace", ->
object.trigger 'bar'
expect(barHandler).toHaveBeenCalled()
expect(barHandler2).toHaveBeenCalled()
barHandler.reset()
barHandler2.reset()
object.trigger 'baz'
expect(bazHandler1).toHaveBeenCalled()
expect(bazHandler2).toHaveBeenCalled()
expect(bazHandler3).toHaveBeenCalled()
bazHandler1.reset()
bazHandler2.reset()
bazHandler3.reset()
object.off '.ns1'
object.trigger 'bar'
object.trigger 'bar.ns1'
expect(barHandler).toHaveBeenCalled()
expect(barHandler2).not.toHaveBeenCalled()
object.trigger 'baz'
object.trigger 'baz.ns1'
expect(bazHandler1).not.toHaveBeenCalled()
expect(bazHandler2).not.toHaveBeenCalled()
expect(bazHandler3).toHaveBeenCalled()
describe "when called with event names and namespaces that don't exist", ->
it "does not raise an exception", ->
object.off 'junk'
object.off '.garbage'
object.off 'junk.garbage'
describe ".one(event, callback)", ->
it "triggers the given callback once, then removes the subscription", ->
oneHandler = jasmine.createSpy('oneHandler')
object.one 'event', oneHandler
object.trigger('event')
expect(oneHandler).toHaveBeenCalled()
oneHandler.reset()
object.trigger('event')
expect(oneHandler).not.toHaveBeenCalled()
describe ".subscriptionCount()", ->
it "returns the total number of subscriptions on the object", ->
expect(object.subscriptionCount()).toBe 3
object.on 'baz', ->
expect(object.subscriptionCount()).toBe 4
object.off 'foo'
expect(object.subscriptionCount()).toBe 2

View File

@@ -1,54 +0,0 @@
Subscriber = require '../src/subscriber'
EventEmitter = require '../src/event-emitter'
{_, $$} = require 'atom'
describe "Subscriber", ->
[emitter1, emitter2, emitter3, event1Handler, event2Handler, event3Handler, subscriber] = []
class TestEventEmitter
_.extend TestEventEmitter.prototype, EventEmitter
class TestSubscriber
_.extend TestSubscriber.prototype, Subscriber
beforeEach ->
emitter1 = new TestEventEmitter
emitter2 = new TestEventEmitter
emitter3 = $$ ->
@div =>
@a()
@span()
subscriber = new TestSubscriber
event1Handler = jasmine.createSpy("event1Handler")
event2Handler = jasmine.createSpy("event2Handler")
event3Handler = jasmine.createSpy("event3Handler")
subscriber.subscribe emitter1, 'event1', event1Handler
subscriber.subscribe emitter2, 'event2', event2Handler
subscriber.subscribe emitter3, 'event3', 'a', event3Handler
it "subscribes to events on the specified object", ->
emitter1.trigger 'event1', 'foo'
expect(event1Handler).toHaveBeenCalledWith('foo')
emitter2.trigger 'event2', 'bar'
expect(event2Handler).toHaveBeenCalledWith('bar')
emitter3.find('span').trigger 'event3'
expect(event3Handler).not.toHaveBeenCalledWith()
emitter3.find('a').trigger 'event3'
expect(event3Handler).toHaveBeenCalled()
it "allows an object to unsubscribe en-masse", ->
subscriber.unsubscribe()
emitter1.trigger 'event1', 'foo'
emitter2.trigger 'event2', 'bar'
expect(event1Handler).not.toHaveBeenCalled()
expect(event2Handler).not.toHaveBeenCalled()
it "allows an object to unsubscribe from a specific object", ->
subscriber.unsubscribe(emitter1)
emitter1.trigger 'event1', 'foo'
emitter2.trigger 'event2', 'bar'
expect(event1Handler).not.toHaveBeenCalled()
expect(event2Handler).toHaveBeenCalledWith('bar')

View File

@@ -5,13 +5,13 @@ path = require 'path'
_ = require './underscore-extensions'
$ = require './jquery-extensions'
CSON = require 'season'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
### Internal: Loads and resolves packages. ###
module.exports =
class AtomPackage extends Package
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
@stylesheetsDir: 'stylesheets'
@@ -163,7 +163,7 @@ class AtomPackage extends Package
@deactivateResources()
@deactivateConfig()
@mainModule?.deactivate?() if @mainActivated
@trigger('deactivated')
@emit('deactivated')
deactivateConfig: ->
@mainModule?.deactivateConfig?()

View File

@@ -1,3 +1,9 @@
#TODO remove once all packages have been updated
{Emitter} = require 'emissary'
Emitter::one = (args...) -> @once(args...)
Emitter::trigger = (args...) -> @emit(args...)
Emitter::subscriptionCount = (args...) -> @getSubscriptionCount(args...)
fsUtils = require './fs-utils'
$ = require './jquery-extensions'
_ = require './underscore-extensions'
@@ -11,14 +17,14 @@ dialog = remote.require 'dialog'
app = remote.require 'app'
{Document} = require 'telepath'
DeserializerManager = require './deserializer-manager'
Subscriber = require './subscriber'
{Subscriber} = require 'emissary'
# Public: Atom global for dealing with packages, themes, menus, and the window.
#
# An instance of this class is always available as the `atom` global.
module.exports =
class Atom
_.extend @prototype, Subscriber
Subscriber.includeInto(this)
constructor: ->
@rootViewParentSelector = 'body'

View File

@@ -1,6 +1,6 @@
fsUtils = require './fs-utils'
_ = require './underscore-extensions'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
CSON = require 'season'
fs = require 'fs'
path = require 'path'
@@ -26,7 +26,7 @@ pathWatcher = require 'pathwatcher'
# ```
module.exports =
class Config
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
defaultSettings: null
settings: null
@@ -88,7 +88,7 @@ class Config
userConfig = CSON.readFileSync(@configFilePath)
_.extend(@settings, userConfig)
@configFileHasErrors = false
@trigger 'updated'
@emit 'updated'
catch e
@configFileHasErrors = true
console.error "Failed to load user config '#{@configFilePath}'", e.message
@@ -219,7 +219,7 @@ class Config
update: ->
return if @configFileHasErrors
@save()
@trigger 'updated'
@emit 'updated'
# Private:
save: ->

View File

@@ -1,5 +1,5 @@
{Point, Range} = require 'telepath'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
_ = require './underscore-extensions'
# Public: The `Cursor` class represents the little blinking line identifying
@@ -9,7 +9,7 @@ _ = require './underscore-extensions'
# of a {StringMarker}.
module.exports =
class Cursor
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
screenPosition: null
bufferPosition: null
@@ -36,12 +36,12 @@ class Cursor
newScreenPosition: newHeadScreenPosition
textChanged: textChanged
@trigger 'moved', movedEvent
@editSession.trigger 'cursor-moved', movedEvent
@emit 'moved', movedEvent
@editSession.emit 'cursor-moved', movedEvent
@marker.on 'destroyed', =>
@destroyed = true
@editSession.removeCursor(this)
@trigger 'destroyed'
@emit 'destroyed'
@needsAutoscroll = true
# Private:
@@ -54,7 +54,7 @@ class Cursor
@clearSelection()
@needsAutoscroll = options.autoscroll ? @isLastCursor()
unless fn()
@trigger 'autoscrolled' if @needsAutoscroll
@emit 'autoscrolled' if @needsAutoscroll
# Public: Moves a cursor to a given screen position.
#
@@ -97,7 +97,7 @@ class Cursor
if @visible != visible
@visible = visible
@needsAutoscroll ?= true if @visible and @isLastCursor()
@trigger 'visibility-changed', @visible
@emit 'visibility-changed', @visible
# Public: Returns the visibility of the cursor.
isVisible: -> @visible

View File

@@ -1,15 +1,14 @@
_ = require './underscore-extensions'
fs = require 'fs'
path = require 'path'
fsUtils = require './fs-utils'
pathWatcher = require 'pathwatcher'
File = require './file'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
# Public: Represents a directory using {File}s
module.exports =
class Directory
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
path: null
realPath: null
@@ -21,6 +20,11 @@ class Directory
# + symlink:
# A {Boolean} indicating if the path is a symlink
constructor: (@path, @symlink=false) ->
@on 'first-contents-changed-subscription-will-be-added', =>
@subscribeToNativeChangeEvents()
@on 'last-contents-changed-subscription-removed', =>
@unsubscribeFromNativeChangeEvents()
# Public: Returns the basename of the directory.
getBaseName: ->
@@ -90,18 +94,11 @@ class Directory
directories.concat(files)
# Private:
afterSubscribe: ->
@subscribeToNativeChangeEvents() if @subscriptionCount() == 1
# Private:
afterUnsubscribe: ->
@unsubscribeFromNativeChangeEvents() if @subscriptionCount() == 0
# Private:
subscribeToNativeChangeEvents: ->
@watchSubscription = pathWatcher.watch @path, (eventType) =>
@trigger "contents-changed" if eventType is "change"
unless @watchSubscription?
@watchSubscription = pathWatcher.watch @path, (eventType) =>
@emit "contents-changed" if eventType is "change"
# Private:
unsubscribeFromNativeChangeEvents: ->

View File

@@ -1,13 +1,12 @@
{Range} = require 'telepath'
_ = require './underscore-extensions'
EventEmitter = require './event-emitter'
Subscriber = require './subscriber'
{Emitter, Subscriber} = require 'emissary'
# Private:
module.exports =
class DisplayBufferMarker
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
bufferMarkerSubscription: null
oldHeadBufferPosition: null
@@ -184,7 +183,7 @@ class DisplayBufferMarker
destroyed: ->
delete @displayBuffer.markers[@id]
@trigger 'destroyed'
@emit 'destroyed'
notifyObservers: ({textChanged}) ->
textChanged ?= false
@@ -203,7 +202,7 @@ class DisplayBufferMarker
changed = true unless _.isEqual(isValid, @wasValid)
return unless changed
@trigger 'changed', {
@emit 'changed', {
@oldHeadScreenPosition, newHeadScreenPosition,
@oldTailScreenPosition, newTailScreenPosition,
@oldHeadBufferPosition, newHeadBufferPosition,

View File

@@ -1,21 +1,20 @@
_ = require './underscore-extensions'
{Emitter, Subscriber} = require 'emissary'
guid = require 'guid'
telepath = require 'telepath'
{Point, Range} = telepath
TokenizedBuffer = require './tokenized-buffer'
RowMap = require './row-map'
EventEmitter = require './event-emitter'
Fold = require './fold'
Token = require './token'
DisplayBufferMarker = require './display-buffer-marker'
Subscriber = require './subscriber'
ConfigObserver = require './config-observer'
# Private:
module.exports =
class DisplayBuffer
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
_.extend @prototype, ConfigObserver
@acceptsDocuments: true
@@ -46,7 +45,7 @@ class DisplayBuffer
@foldsByMarkerId = {}
@updateAllScreenLines()
@createFoldForMarker(marker) for marker in @buffer.findMarkers(@getFoldMarkerAttributes())
@subscribe @tokenizedBuffer, 'grammar-changed', (grammar) => @trigger 'grammar-changed', grammar
@subscribe @tokenizedBuffer, 'grammar-changed', (grammar) => @emit 'grammar-changed', grammar
@subscribe @tokenizedBuffer, 'changed', @handleTokenizedBufferChange
@subscribe @buffer, 'markers-updated', @handleBufferMarkersUpdated
@subscribe @buffer, 'marker-created', @handleBufferMarkerCreated
@@ -54,7 +53,7 @@ class DisplayBuffer
@subscribe @state, 'changed', ({key, newValue}) =>
switch key
when 'softWrap'
@trigger 'soft-wrap-changed', newValue
@emit 'soft-wrap-changed', newValue
@updateWrappedScreenLines()
@observeConfig 'editor.preferredLineLength', callNow: false, =>
@@ -78,11 +77,11 @@ class DisplayBuffer
@rowMap = new RowMap
@updateScreenLines(0, @buffer.getLineCount(), null, suppressChangeEvent: true)
triggerChanged: (eventProperties, refreshMarkers=true) ->
emitChanged: (eventProperties, refreshMarkers=true) ->
if refreshMarkers
@pauseMarkerObservers()
@refreshMarkerScreenPositions()
@trigger 'changed', eventProperties
@emit 'changed', eventProperties
@resumeMarkerObservers()
updateWrappedScreenLines: ->
@@ -91,7 +90,7 @@ class DisplayBuffer
@updateAllScreenLines()
screenDelta = @getLastRow() - end
bufferDelta = 0
@triggerChanged({ start, end, screenDelta, bufferDelta })
@emitChanged({ start, end, screenDelta, bufferDelta })
### Public ###
@@ -565,7 +564,7 @@ class DisplayBuffer
resumeMarkerObservers: ->
marker.resumeEvents() for marker in @getMarkers()
@trigger 'markers-updated'
@emit 'markers-updated'
refreshMarkerScreenPositions: ->
for marker in @getMarkers()
@@ -620,7 +619,7 @@ class DisplayBuffer
@pauseMarkerObservers()
@pendingChangeEvent = changeEvent
else
@triggerChanged(changeEvent, options.refreshMarkers)
@emitChanged(changeEvent, options.refreshMarkers)
buildScreenLines: (startBufferRow, endBufferRow) ->
newScreenLines = []
@@ -686,11 +685,11 @@ class DisplayBuffer
handleBufferMarkersUpdated: =>
if event = @pendingChangeEvent
@pendingChangeEvent = null
@triggerChanged(event, false)
@emitChanged(event, false)
handleBufferMarkerCreated: (marker) =>
@createFoldForMarker(marker) if marker.matchesAttributes(@getFoldMarkerAttributes())
@trigger 'marker-created', @getMarker(marker.id)
@emit 'marker-created', @getMarker(marker.id)
createFoldForMarker: (marker) ->
new Fold(this, marker)

View File

@@ -8,8 +8,7 @@ LanguageMode = require './language-mode'
DisplayBuffer = require './display-buffer'
Cursor = require './cursor'
Selection = require './selection'
EventEmitter = require './event-emitter'
Subscriber = require './subscriber'
{Emitter, Subscriber} = require 'emissary'
TextMateScopeSelector = require('first-mate').ScopeSelector
# Public: The core model of Atom.
@@ -39,8 +38,8 @@ TextMateScopeSelector = require('first-mate').ScopeSelector
# why that is.
module.exports =
class EditSession
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
@acceptsDocuments: true
@@ -104,9 +103,9 @@ class EditSession
@subscribe @state, 'changed', ({key, newValue}) =>
switch key
when 'scrollTop'
@trigger 'scroll-top-changed', newValue
@emit 'scroll-top-changed', newValue
when 'scrollLeft'
@trigger 'scroll-left-changed', newValue
@emit 'scroll-left-changed', newValue
project.addEditSession(this) if registerEditSession
@@ -115,20 +114,20 @@ class EditSession
@buffer.retain()
@subscribe @buffer, "path-changed", =>
project.setPath(path.dirname(@getPath())) unless project.getPath()?
@trigger "title-changed"
@trigger "path-changed"
@subscribe @buffer, "contents-modified", => @trigger "contents-modified"
@subscribe @buffer, "contents-conflicted", => @trigger "contents-conflicted"
@subscribe @buffer, "modified-status-changed", => @trigger "modified-status-changed"
@emit "title-changed"
@emit "path-changed"
@subscribe @buffer, "contents-modified", => @emit "contents-modified"
@subscribe @buffer, "contents-conflicted", => @emit "contents-conflicted"
@subscribe @buffer, "modified-status-changed", => @emit "modified-status-changed"
@preserveCursorPositionOnBufferReload()
# Private:
setDisplayBuffer: (@displayBuffer) ->
@subscribe @displayBuffer, 'marker-created', @handleMarkerCreated
@subscribe @displayBuffer, "changed", (e) => @trigger 'screen-lines-changed', e
@subscribe @displayBuffer, "changed", (e) => @emit 'screen-lines-changed', e
@subscribe @displayBuffer, "markers-updated", => @mergeIntersectingSelections()
@subscribe @displayBuffer, 'grammar-changed', => @handleGrammarChange()
@subscribe @displayBuffer, 'soft-wrap-changed', (args...) => @trigger 'soft-wrap-changed', args...
@subscribe @displayBuffer, 'soft-wrap-changed', (args...) => @emit 'soft-wrap-changed', args...
# Private:
getViewClass: ->
@@ -144,7 +143,7 @@ class EditSession
@displayBuffer.destroy()
@languageMode.destroy()
project?.removeEditSession(this)
@trigger 'destroyed'
@emit 'destroyed'
@off()
# Private:
@@ -871,7 +870,7 @@ class EditSession
@cursors.push(cursor)
else
@remoteCursors.push(cursor)
@trigger 'cursor-added', cursor
@emit 'cursor-added', cursor
cursor
# Public: Removes and returns a cursor from the `EditSession`.
@@ -904,7 +903,7 @@ class EditSession
if selection.intersectsBufferRange(selectionBufferRange)
return selection
else
@trigger 'selection-added', selection
@emit 'selection-added', selection
selection
# Public: Given a buffer range, this adds a new selection for it.
@@ -1424,7 +1423,7 @@ class EditSession
# Private:
handleGrammarChange: ->
@unfoldAll()
@trigger 'grammar-changed'
@emit 'grammar-changed'
# Private:
handleMarkerCreated: (marker) =>

View File

@@ -1,115 +0,0 @@
_ = require './underscore-extensions'
# Public: Provides a list of functions that can be used in Atom for event management.
#
# Each event can have more than one handler; that is, an event can trigger multiple functions.
module.exports =
# Associates an event name with a function to perform.
#
# This is called endlessly, until the event is turned {.off}.
#
# eventNames - A {String} containing one or more space-separated events.
# handler - A {Function} that's executed when the event is triggered.
on: (eventNames, handler) ->
for eventName in eventNames.split(/\s+/) when eventName isnt ''
[eventName, namespace] = eventName.split('.')
@eventHandlersByEventName ?= {}
@eventHandlersByEventName[eventName] ?= []
@eventHandlersByEventName[eventName].push(handler)
if namespace
@eventHandlersByNamespace ?= {}
@eventHandlersByNamespace[namespace] ?= {}
@eventHandlersByNamespace[namespace][eventName] ?= []
@eventHandlersByNamespace[namespace][eventName].push(handler)
@afterSubscribe?()
# Associates an event name with a function to perform only once.
#
# eventName - A {String} name identifying an event
# handler - A {Function} that's executed when the event is triggered
one: (eventName, handler) ->
oneShotHandler = (args...) =>
@off(eventName, oneShotHandler)
handler(args...)
@on eventName, oneShotHandler
# Triggers a registered event.
#
# eventName - A {String} name identifying an event
# args - Any additional arguments to pass over to the event `handler`
trigger: (eventName, args...) ->
if @queuedEvents
@queuedEvents.push [eventName, args...]
else
[eventName, namespace] = eventName.split('.')
if namespace
if handlers = @eventHandlersByNamespace?[namespace]?[eventName]
new Array(handlers...).forEach (handler) -> handler(args...)
else
if handlers = @eventHandlersByEventName?[eventName]
handlers.forEach (handler) -> handler(args...)
# Stops executing handlers for a registered event.
#
# eventNames - A {String} containing one or more space-separated events.
# handler - The {Function} to remove from the event. If not provided, all handlers are removed.
off: (eventNames, handler) ->
if eventNames
for eventName in eventNames.split(/\s+/) when eventName isnt ''
[eventName, namespace] = eventName.split('.')
eventName = undefined if eventName == ''
if namespace
if eventName
handlers = @eventHandlersByNamespace?[namespace]?[eventName] ? []
for handler in new Array(handlers...)
_.remove(handlers, handler)
@off eventName, handler
else
for eventName, handlers of @eventHandlersByNamespace?[namespace] ? {}
for handler in new Array(handlers...)
_.remove(handlers, handler)
@off eventName, handler
else
subscriptionCountBefore = @subscriptionCount()
if handler
eventHandlers = @eventHandlersByEventName[eventName]
_.remove(eventHandlers, handler) if eventHandlers
else
delete @eventHandlersByEventName?[eventName]
@afterUnsubscribe?() if @subscriptionCount() < subscriptionCountBefore
else
subscriptionCountBefore = @subscriptionCount()
@eventHandlersByEventName = {}
@eventHandlersByNamespace = {}
@afterUnsubscribe?() if @subscriptionCount() < subscriptionCountBefore
# When called, stops triggering any events.
pauseEvents: ->
@pauseCount ?= 0
if @pauseCount++ == 0
@queuedEvents ?= []
# When called, resumes triggering events.
resumeEvents: ->
if --@pauseCount == 0
queuedEvents = @queuedEvents
@queuedEvents = null
@trigger(event...) for event in queuedEvents
# Identifies how many events are registered.
#
# Returns a {Number}.
getSubscriptionCount: ->
count = 0
for name, handlers of @eventHandlersByEventName
count += handlers.length
count
# Deprecated
subscriptionCount: -> @getSubscriptionCount()

View File

@@ -1,5 +1,5 @@
Q = require 'q'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
path = require 'path'
fsUtils = require './fs-utils'
pathWatcher = require 'pathwatcher'
@@ -11,7 +11,7 @@ _ = require './underscore-extensions'
# {Directory} and access the {File} objects that it creates.
module.exports =
class File
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
path: null
cachedContents: null
@@ -25,6 +25,20 @@ class File
constructor: (@path, @symlink=false) ->
throw new Error("#{@path} is a directory") if fsUtils.isDirectorySync(@path)
@handleEventSubscriptions()
handleEventSubscriptions: ->
eventNames = ['contents-changed', 'moved', 'removed']
subscriptionsAdded = eventNames.map (eventName) -> "first-#{eventName}-subscription-will-be-added"
@on subscriptionsAdded.join(' '), =>
@subscribeToNativeChangeEvents() if @exists()
subscriptionsRemoved = eventNames.map (eventName) -> "last-#{eventName}-subscription-removed"
@on subscriptionsRemoved.join(' '), =>
subscriptionsEmpty = _.every eventNames, (eventName) => @getSubscriptionCount(eventName) is 0
@unsubscribeFromNativeChangeEvents() if subscriptionsEmpty
# Private: Sets the path for the file.
setPath: (@path) ->
@@ -88,14 +102,6 @@ class File
exists: ->
fsUtils.exists(@getPath())
# Private:
afterSubscribe: ->
@subscribeToNativeChangeEvents() if @exists() and @subscriptionCount() == 1
# Private:
afterUnsubscribe: ->
@unsubscribeFromNativeChangeEvents() if @subscriptionCount() == 0
# Private:
handleNativeChangeEvent: (eventType, path) ->
if eventType is "delete"
@@ -103,12 +109,12 @@ class File
@detectResurrectionAfterDelay()
else if eventType is "rename"
@setPath(path)
@trigger "moved"
@emit "moved"
else if eventType is "change"
oldContents = @cachedContents
newContents = @read(true)
return if oldContents == newContents
@trigger 'contents-changed'
@emit 'contents-changed'
# Private:
detectResurrectionAfterDelay: ->
@@ -121,15 +127,16 @@ class File
@handleNativeChangeEvent("change", @getPath())
else
@cachedContents = null
@trigger "removed"
@emit "removed"
# Private:
subscribeToNativeChangeEvents: ->
@watchSubscription = pathWatcher.watch @path, (eventType, path) =>
@handleNativeChangeEvent(eventType, path)
unless @watchSubscription?
@watchSubscription = pathWatcher.watch @path, (eventType, path) =>
@handleNativeChangeEvent(eventType, path)
# Private:
unsubscribeFromNativeChangeEvents: ->
if @watchSubscription
if @watchSubscription?
@watchSubscription.close()
@watchSubscription = null

View File

@@ -1,8 +1,7 @@
_ = require './underscore-extensions'
fsUtils = require './fs-utils'
Subscriber = require './subscriber'
EventEmitter = require './event-emitter'
Task = require './task'
{Emitter, Subscriber} = require 'emissary'
GitUtils = require 'git-utils'
# Public: Represents the underlying git operations performed by Atom.
@@ -18,8 +17,8 @@ GitUtils = require 'git-utils'
# ```
module.exports =
class Git
_.extend @prototype, Subscriber
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
Subscriber.includeInto(this)
# Private: Creates a new `Git` instance.
#
@@ -81,6 +80,7 @@ class Git
@getPathStatus(path)
@subscribe buffer, 'saved', bufferStatusHandler
@subscribe buffer, 'reloaded', bufferStatusHandler
@subscribe buffer, 'destroyed', => @unsubscribe(buffer)
# Public: Destroy this `Git` object. This destroys any tasks and
# subscriptions and releases the underlying libgit2 repository handle.
@@ -125,7 +125,7 @@ class Git
else
delete @statuses[path]
if currentPathStatus isnt pathStatus
@trigger 'status-changed', path, pathStatus
@emit 'status-changed', path, pathStatus
pathStatus
# Public: Determines if the given path is ignored.
@@ -274,4 +274,4 @@ class Git
@statuses = statuses
@upstream = upstream
@branch = branch
@trigger 'statuses-changed' unless statusesUnchanged
@emit 'statuses-changed' unless statusesUnchanged

View File

@@ -4,7 +4,7 @@ fsUtils = require './fs-utils'
path = require 'path'
CSON = require 'season'
BindingSet = require './binding-set'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
# Internal: Associates keymaps with actions.
#
@@ -21,7 +21,7 @@ EventEmitter = require './event-emitter'
# key, you define one or more key:value pairs, associating keystrokes with a command to execute.
module.exports =
class Keymap
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
bindingSets: null
nextBindingSetIndex: 0
@@ -34,7 +34,7 @@ class Keymap
loadBundledKeymaps: ->
@loadDirectory(config.bundledKeymapsDirPath)
@trigger('bundled-keymaps-loaded')
@emit('bundled-keymaps-loaded')
loadUserKeymaps: ->
@loadDirectory(path.join(config.configDirPath, 'keymaps'))

View File

@@ -1,15 +1,14 @@
{Range} = require 'telepath'
_ = require './underscore-extensions'
{OnigRegExp} = require 'oniguruma'
EventEmitter = require './event-emitter'
Subscriber = require './subscriber'
{Emitter, Subscriber} = require 'emissary'
### Internal ###
module.exports =
class LanguageMode
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
buffer: null
grammar: null

View File

@@ -1,11 +1,10 @@
path = require 'path'
_ = require './underscore-extensions'
LessCache = require 'less-cache'
{Subscriber} = require 'emissary'
module.exports =
class LessCompileCache
_.extend @prototype, require('./subscriber')
Subscriber.includeInto(this)
@cacheDir: '/tmp/atom-compile-cache/less'

View File

@@ -1,11 +1,10 @@
Token = require './token'
EventEmitter = require './event-emitter'
_ = require './underscore-extensions'
{Emitter} = require 'emissary'
### Internal ###
module.exports =
class NullGrammar
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
name: 'Null Grammar'
scopeName: 'text.plain.null-grammar'

View File

@@ -1,4 +1,4 @@
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
fsUtils = require './fs-utils'
_ = require './underscore-extensions'
Package = require './package'
@@ -6,7 +6,7 @@ path = require 'path'
module.exports =
class PackageManager
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
constructor: ({configDirPath, devMode, @resourcePath}) ->
@packageDirPaths = [path.join(configDirPath, "packages")]
@@ -58,7 +58,7 @@ class PackageManager
require '../exports/atom'
@loadPackage(name) for name in @getAvailablePackageNames() when not @isPackageDisabled(name)
@trigger 'loaded'
@emit 'loaded'
loadPackage: (name, options) ->
if @isPackageDisabled(name)

View File

@@ -8,7 +8,7 @@ telepath = require 'telepath'
{Range} = telepath
TextBuffer = require './text-buffer'
EditSession = require './edit-session'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
Directory = require './directory'
Task = require './task'
Git = require './git'
@@ -19,7 +19,7 @@ Git = require './git'
# of directories and files that you can operate on.
module.exports =
class Project
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
@acceptsDocuments: true
@version: 1
@@ -125,7 +125,7 @@ class Project
if originUrl = @repo?.getOriginUrl()
@state.set('repoUrl', originUrl)
@trigger "path-changed"
@emit "path-changed"
# Public: Returns the name of the root directory.
getRootDirectory: ->
@@ -205,7 +205,7 @@ class Project
# Public: Add the given {EditSession}.
addEditSession: (editSession) ->
@editSessions.push editSession
@trigger 'edit-session-created', editSession
@emit 'edit-session-created', editSession
# Public: Return and removes the given {EditSession}.
removeEditSession: (editSession) ->
@@ -274,7 +274,7 @@ class Project
addBufferAtIndex: (buffer, index, options={}) ->
@buffers[index] = buffer
@state.get('buffers').insert(index, buffer.getState()) if options.updateState ? true
@trigger 'buffer-created', buffer
@emit 'buffer-created', buffer
# Private: Removes a {TextBuffer} association from the project.
#

View File

@@ -1,11 +1,10 @@
{Range} = require 'telepath'
EventEmitter = require './event-emitter'
_ = require './underscore-extensions'
{Emitter} = require 'emissary'
# Public: Represents a selection in the {EditSession}.
module.exports =
class Selection
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
cursor: null
marker: null
@@ -22,7 +21,7 @@ class Selection
@marker.on 'destroyed', =>
@destroyed = true
@editSession.removeSelection(this)
@trigger 'destroyed' unless @editSession.destroyed
@emit 'destroyed' unless @editSession.destroyed
# Private:
destroy: ->
@@ -607,4 +606,4 @@ class Selection
# Private:
screenRangeChanged: ->
screenRange = @getScreenRange()
@trigger 'screen-range-changed', screenRange
@emit 'screen-range-changed', screenRange

View File

@@ -2,10 +2,10 @@ _ = require './underscore-extensions'
spacePen = require 'space-pen'
jQuery = require './jquery-extensions'
ConfigObserver = require './config-observer'
Subscriber = require './subscriber'
{Subscriber} = require 'emissary'
_.extend spacePen.View.prototype, ConfigObserver
_.extend spacePen.View.prototype, Subscriber
Subscriber.includeInto(spacePen.View)
originalCleanData = jQuery.cleanData
jQuery.cleanData = (elements) ->

View File

@@ -1,39 +0,0 @@
_ = require './underscore-extensions'
# Public: Mixin for managing subscriptions of event listeners to different objects.
#
# Support unsubscribe from all register event listeners or just the listeners
# registered on a given object.
module.exports =
subscribeWith: (eventEmitter, methodName, args) ->
eventEmitter[methodName](args...)
@subscriptions ?= []
@subscriptionsByObject ?= new WeakMap
@subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter)
eventName = _.first(args)
callback = _.last(args)
subscription = cancel: ->
# node's EventEmitter doesn't have 'off' method.
removeListener = eventEmitter.off ? eventEmitter.removeListener
removeListener.call eventEmitter, eventName, callback
@subscriptions.push(subscription)
@subscriptionsByObject.get(eventEmitter).push(subscription)
subscribe: (eventEmitter, args...) ->
@subscribeWith(eventEmitter, 'on', args)
subscribeToCommand: (eventEmitter, args...) ->
@subscribeWith(eventEmitter, 'command', args)
unsubscribe: (object) ->
if object?
for subscription in @subscriptionsByObject?.get(object) ? []
subscription.cancel()
_.remove(@subscriptions, subscription)
@subscriptionsByObject?.delete(object)
else
subscription.cancel() for subscription in @subscriptions ? []
@subscriptions = null
@subscriptionsByObject = null

View File

@@ -3,7 +3,7 @@ jQuery = require './jquery-extensions'
Specificity = require '../vendor/specificity'
{$$} = require './space-pen-extensions'
fsUtils = require './fs-utils'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
NullGrammar = require './null-grammar'
TextMateScopeSelector = require('first-mate').ScopeSelector
@@ -11,7 +11,7 @@ TextMateScopeSelector = require('first-mate').ScopeSelector
module.exports =
class Syntax
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
registerDeserializer(this)
@@ -38,7 +38,7 @@ class Syntax
@grammarsByScopeName[grammar.scopeName] = grammar
@injectionGrammars.push(grammar) if grammar.injectionSelector?
@grammarUpdated(grammar.scopeName)
@trigger 'grammar-added', grammar
@emit 'grammar-added', grammar
removeGrammar: (grammar) ->
_.remove(@grammars, grammar)
@@ -48,7 +48,7 @@ class Syntax
grammarUpdated: (scopeName) ->
for grammar in @grammars when grammar.scopeName isnt scopeName
@trigger 'grammar-updated', grammar if grammar.grammarUpdated(scopeName)
@emit 'grammar-updated', grammar if grammar.grammarUpdated(scopeName)
setGrammarOverrideForPath: (path, scopeName) ->
@grammarOverridesByPath[path] = scopeName

View File

@@ -1,6 +1,6 @@
_ = require './underscore-extensions'
child_process = require 'child_process'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
# Public: Run a node script in a separate process.
#
@@ -14,7 +14,8 @@ EventEmitter = require './event-emitter'
# * task:completed - Emitted when the task has succeeded or failed.
module.exports =
class Task
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
_.extend @prototype, Emitter
# Public: A helper method to easily launch and run a task once.
#
@@ -25,7 +26,7 @@ class Task
# The Array of arguments to pass to the exported function.
@once: (taskPath, args...) ->
task = new Task(taskPath)
task.one 'task:completed', -> task.terminate()
task.once 'task:completed', -> task.terminate()
task.start(args...)
task
@@ -69,7 +70,7 @@ class Task
handleEvents: ->
@childProcess.removeAllListeners()
@childProcess.on 'message', ({event, args}) =>
@trigger(event, args...)
@emit(event, args...)
# Public: Starts the task.
#

View File

@@ -1,3 +1,4 @@
{Emitter, Subscriber} = require 'emissary'
guid = require 'guid'
Q = require 'q'
{P} = require 'scandal'
@@ -5,9 +6,7 @@ telepath = require 'telepath'
_ = require './underscore-extensions'
fsUtils = require './fs-utils'
EventEmitter = require './event-emitter'
File = require './file'
Subscriber = require './subscriber'
{Point, Range} = telepath
@@ -17,8 +16,8 @@ Subscriber = require './subscriber'
# the case, as a `Buffer` could be an unsaved chunk of text.
module.exports =
class TextBuffer
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
@acceptsDocuments: true
@version: 2
@@ -61,8 +60,8 @@ class TextBuffer
@loadFromDisk = not initialText
@subscribe @text, 'changed', @handleTextChange
@subscribe @text, 'marker-created', (marker) => @trigger 'marker-created', marker
@subscribe @text, 'markers-updated', => @trigger 'markers-updated'
@subscribe @text, 'marker-created', (marker) => @emit 'marker-created', marker
@subscribe @text, 'markers-updated', => @emit 'markers-updated'
@setPath(@project.resolve(filePath)) if @project
@@ -83,7 +82,7 @@ class TextBuffer
@cachedMemoryContents = null
@conflict = false if @conflict and !@isModified()
bufferChangeEvent = _.pick(event, 'oldRange', 'newRange', 'oldText', 'newText')
@trigger 'changed', bufferChangeEvent
@emit 'changed', bufferChangeEvent
@scheduleModifiedEvents()
destroy: ->
@@ -92,7 +91,7 @@ class TextBuffer
@unsubscribe()
@destroyed = true
@project?.removeBuffer(this)
@trigger 'destroyed'
@emit 'destroyed'
isRetained: -> @refcount > 0
@@ -119,17 +118,17 @@ class TextBuffer
@conflict = true if @isModified()
@updateCachedDiskContentsAsync().done =>
if @conflict
@trigger "contents-conflicted"
@emit "contents-conflicted"
else
@reload()
@file.on "removed", =>
@updateCachedDiskContentsAsync().done =>
@triggerModifiedStatusChanged(@isModified())
@emitModifiedStatusChanged(@isModified())
@file.on "moved", =>
@state.set('relativePath', @project.relativize(@getPath()))
@trigger "path-changed", this
@emit "path-changed", this
### Public ###
@@ -144,10 +143,10 @@ class TextBuffer
#
# Sets the buffer's content to the cached disk contents
reload: ->
@trigger 'will-reload'
@emit 'will-reload'
@setText(@cachedDiskContents)
@triggerModifiedStatusChanged(false)
@trigger 'reloaded'
@emitModifiedStatusChanged(false)
@emit 'reloaded'
# Private: Rereads the contents of the file, and stores them in the cache.
updateCachedDiskContents: ->
@@ -191,7 +190,7 @@ class TextBuffer
@file = null
@state.set('relativePath', @project.relativize(path))
@trigger "path-changed", this
@emit "path-changed", this
# Retrieves the current buffer's file extension.
#
@@ -399,12 +398,12 @@ class TextBuffer
saveAs: (path) ->
unless path then throw new Error("Can't save buffer with no file path")
@trigger 'will-be-saved'
@emit 'will-be-saved'
@setPath(path)
@cachedDiskContents = @getText()
@file.write(@getText())
@triggerModifiedStatusChanged(false)
@trigger 'saved'
@emitModifiedStatusChanged(false)
@emit 'saved'
# Identifies if the buffer was modified.
#
@@ -653,14 +652,14 @@ class TextBuffer
stoppedChangingCallback = =>
@stoppedChangingTimeout = null
modifiedStatus = @isModified()
@trigger 'contents-modified', modifiedStatus
@triggerModifiedStatusChanged(modifiedStatus)
@emit 'contents-modified', modifiedStatus
@emitModifiedStatusChanged(modifiedStatus)
@stoppedChangingTimeout = setTimeout(stoppedChangingCallback, @stoppedChangingDelay)
triggerModifiedStatusChanged: (modifiedStatus) ->
emitModifiedStatusChanged: (modifiedStatus) ->
return if modifiedStatus is @previousModifiedStatus
@previousModifiedStatus = modifiedStatus
@trigger 'modified-status-changed', modifiedStatus
@emit 'modified-status-changed', modifiedStatus
logLines: (start=0, end=@getLastRow())->
for row in [start..end]

View File

@@ -4,7 +4,7 @@ plist = require 'plist'
Token = require './token'
{OnigRegExp, OnigScanner} = require 'oniguruma'
path = require 'path'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
{ScopeSelector} = require 'first-mate'
pathSplitRegex = new RegExp("[#{path.sep}.]")
@@ -13,7 +13,7 @@ pathSplitRegex = new RegExp("[#{path.sep}.]")
module.exports =
class TextMateGrammar
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
@load: (grammarPath, done) ->
fsUtils.readObject grammarPath, (error, object) ->
@@ -70,7 +70,7 @@ class TextMateGrammar
return false unless _.include(@includedGrammarScopes, scopeName)
@clearRules()
syntax.grammarUpdated(@scopeName)
@trigger 'grammar-updated'
@emit 'grammar-updated'
true
getScore: (filePath, contents) ->

View File

@@ -1,5 +1,5 @@
path = require 'path'
EventEmitter = require './event-emitter'
{Emitter} = require 'emissary'
Package = require './package'
AtomPackage = require './atom-package'
@@ -10,7 +10,7 @@ fsUtils = require './fs-utils'
# Private: Handles discovering and loading available themes.
module.exports =
class ThemeManager
_.extend @prototype, EventEmitter
Emitter.includeInto(this)
constructor: ->
@loadedThemes = []
@@ -128,7 +128,7 @@ class ThemeManager
@activateTheme(themeName) for themeName in themeNames
@loadUserStylesheet()
@reloadBaseStylesheets()
@trigger('reloaded')
@emit('reloaded')
# Private:
loadTheme: (name, options) ->
@@ -167,7 +167,7 @@ class ThemeManager
theme = @loadTheme(name)
theme.activate()
@activeThemes.push(theme)
@trigger('theme-activated', theme)
@emit('theme-activated', theme)
catch error
console.warn("Failed to load theme #{name}", error.stack ? error)

View File

@@ -1,7 +1,6 @@
_ = require './underscore-extensions'
TokenizedLine = require './tokenized-line'
EventEmitter = require './event-emitter'
Subscriber = require './subscriber'
{Emitter, Subscriber} = require 'emissary'
Token = require './token'
telepath = require 'telepath'
{Point, Range} = telepath
@@ -10,8 +9,8 @@ telepath = require 'telepath'
module.exports =
class TokenizedBuffer
_.extend @prototype, EventEmitter
_.extend @prototype, Subscriber
Emitter.includeInto(this)
Subscriber.includeInto(this)
grammar: null
currentGrammarScore: null
@@ -62,7 +61,7 @@ class TokenizedBuffer
@grammar = grammar
@currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText())
@subscribe @grammar, 'grammar-updated', => @resetTokenizedLines()
@trigger 'grammar-changed', grammar
@emit 'grammar-changed', grammar
reloadGrammar: ->
if grammar = syntax.selectGrammar(@buffer.getPath(), @buffer.getText())
@@ -98,7 +97,7 @@ class TokenizedBuffer
lastRow = @buffer.getLastRow()
@tokenizedLines = @buildPlaceholderTokenizedLinesForRows(0, lastRow)
@invalidateRow(0)
@trigger "changed", { start: 0, end: lastRow, delta: 0 }
@emit "changed", { start: 0, end: lastRow, delta: 0 }
tokenizeInBackground: ->
return if not @visible or @pendingChunk or @destroyed
@@ -129,7 +128,7 @@ class TokenizedBuffer
@validateRow(row)
@invalidateRow(row + 1) unless filledRegion
@trigger "changed", { start: invalidRow, end: row, delta: 0 }
@emit "changed", { start: invalidRow, end: row, delta: 0 }
@tokenizeInBackground() if @firstInvalidRow()?
@@ -168,7 +167,7 @@ class TokenizedBuffer
if newEndStack and not _.isEqual(newEndStack, previousEndStack)
@invalidateRow(end + delta + 1)
@trigger "changed", { start, end, delta, bufferChange: e }
@emit "changed", { start, end, delta, bufferChange: e }
buildTokenizedLinesForRows: (startRow, endRow, startingStack) ->
ruleStack = startingStack

View File

@@ -2,13 +2,13 @@ $ = require './jquery-extensions'
_ = require './underscore-extensions'
ipc = require 'ipc'
shell = require 'shell'
Subscriber = require './subscriber'
{Subscriber} = require 'emissary'
fsUtils = require './fs-utils'
# Private: Handles low-level events related to the window.
module.exports =
class WindowEventHandler
_.extend @prototype, Subscriber
Subscriber.includeInto(this)
constructor: ->
@reloadRequested = false